GitHub企业版RCE漏洞 (GitHub Enterprise < 2.21.4) 2020.8
字数 1586 2025-08-20 18:18:23

GitHub企业版RCE漏洞分析与利用教学

漏洞概述

GitHub企业版(GHE)在版本<2.21.4中存在一个远程代码执行漏洞,允许攻击者通过精心构造的Git命令参数注入,实现任意文件写入和潜在的远程代码执行。该漏洞由re9si7st9在2020年发现并报告给GitHub安全团队。

受影响版本

  • GitHub Enterprise < 2.21.4
  • 修复版本:GitHub Enterprise 2.21.4

漏洞背景

历史漏洞参考

2019年8月13日发布的GitHub Enterprise 2.17.6修复了一个类似漏洞,攻击者可以使用以"-"字符开头的"分支名称"向git命令注入选项,允许截断服务器上的文件。

漏洞发现过程

代码审计方法

  1. 搜索git进程被调用的所有位置
  2. 追溯参数来源,检查是否用户可控
  3. 验证参数是否已正确清理(sanitised)

关键发现点

发现reverse_diff方法进行了2次提交(commits),最终与它们一起运行git diff-tree,唯一的检查是对于存储库(sha,branch,tag等)都存在有效的git引用(git references)。

漏洞原理

核心问题

reverse_diff方法调用git diff-tree时,未充分验证用户提供的参数,允许注入git命令选项。

调用链

  1. revert_range方法调用reverse_diff
  2. reverse_diff执行git diff-tree -p -R commit1 commit2 -- Home.md
  3. 用户可控制commit1和commit2参数

漏洞利用条件

  1. 需要有效的CSRF token
  2. 需要对目标仓库有写入权限
  3. 需要能够创建特殊命名的分支

漏洞利用步骤

1. 创建恶意分支

git push origin master:--output=/tmp/ggg

2. 构造恶意请求

发送POST请求到:

/user/repo/wiki/Home/_revert/HEAD/--output%3D%2Ftmp%2Fggg

3. 利用CSRF漏洞

需要绕过CSRF保护,方法包括:

  • 获取全局CSRF token
  • 利用rails的valid_authenticity_token?方法特性

4. 文件写入

利用git diff-tree--output选项将diff输出写入任意文件:

git diff-tree -p -R HEAD --output=/tmp/ggg -- Home.md

5. 代码执行

写入到可被bash脚本引用的位置,如/data/github/shared/env.d/目录:

  1. 创建包含恶意代码的wiki页面
  2. 编辑wiki页面添加新内容
  3. 推送特殊命名的分支
  4. 触发revert操作写入env.d目录
  5. 等待服务重启或相关命令执行

技术细节

CSRF绕过分析

Rails的valid_authenticity_token?方法逻辑:

def valid_authenticity_token?(session, encoded_masked_token)
  # 处理未编码的token
  if masked_token.length == AUTHENTICITY_TOKEN_LENGTH
    compare_with_real_token(masked_token, session)
  # 处理编码的token
  elsif masked_token.length == AUTHENTICITY_TOKEN_LENGTH * 2
    csrf_token = unmask_token(masked_token)
    compare_with_real_token(csrf_token, session) || valid_per_form_csrf_token?(csrf_token, session)
  else
    false
  end
end

文件写入位置

推荐的可写目录:

  • /data/github/shared/env.d/
  • /data/failbotd/shared/env.d/

有效载荷构造

示例恶意wiki内容:

; echo vakzz was here > /tmp/ggg

漏洞修复

GitHub Enterprise 2.21.4修复措施:

  1. 加强git命令参数验证
  2. 确保所有用户输入参数都经过严格过滤
  3. 改进CSRF保护机制

漏洞影响评估

严重性:高危

影响

  • 任意文件写入
  • 潜在的远程代码执行
  • 需要一定权限才能利用

防御建议

  1. 立即升级到GitHub Enterprise 2.21.4或更高版本
  2. 实施严格的输入验证
  3. 限制用户创建特殊命名分支的能力
  4. 加强CSRF保护机制

时间线

  • 2020年7月25日:漏洞报告
  • 2020年7月25日:GitHub确认漏洞
  • 2020年8月11日:GitHub发布修复版本

总结

该漏洞展示了即使像GitHub这样成熟的产品也可能存在命令注入风险。关键在于:

  1. 对用户输入进行严格验证
  2. 安全地构造系统命令
  3. 实施多层防御机制
  4. 及时更新安全补丁

开发人员和安全团队应从该案例中学习如何更好地保护Web应用程序免受类似攻击。

GitHub企业版RCE漏洞分析与利用教学 漏洞概述 GitHub企业版(GHE)在版本 <2.21.4中存在一个远程代码执行漏洞,允许攻击者通过精心构造的Git命令参数注入,实现任意文件写入和潜在的远程代码执行。该漏洞由re9si7st9在2020年发现并报告给GitHub安全团队。 受影响版本 GitHub Enterprise < 2.21.4 修复版本:GitHub Enterprise 2.21.4 漏洞背景 历史漏洞参考 2019年8月13日发布的GitHub Enterprise 2.17.6修复了一个类似漏洞,攻击者可以使用以"-"字符开头的"分支名称"向git命令注入选项,允许截断服务器上的文件。 漏洞发现过程 代码审计方法 搜索git进程被调用的所有位置 追溯参数来源,检查是否用户可控 验证参数是否已正确清理(sanitised) 关键发现点 发现 reverse_diff 方法进行了2次提交(commits),最终与它们一起运行 git diff-tree ,唯一的检查是对于存储库(sha,branch,tag等)都存在有效的git引用(git references)。 漏洞原理 核心问题 reverse_diff 方法调用 git diff-tree 时,未充分验证用户提供的参数,允许注入git命令选项。 调用链 revert_range 方法调用 reverse_diff reverse_diff 执行 git diff-tree -p -R commit1 commit2 -- Home.md 用户可控制commit1和commit2参数 漏洞利用条件 需要有效的CSRF token 需要对目标仓库有写入权限 需要能够创建特殊命名的分支 漏洞利用步骤 1. 创建恶意分支 2. 构造恶意请求 发送POST请求到: 3. 利用CSRF漏洞 需要绕过CSRF保护,方法包括: 获取全局CSRF token 利用rails的 valid_authenticity_token? 方法特性 4. 文件写入 利用 git diff-tree 的 --output 选项将diff输出写入任意文件: 5. 代码执行 写入到可被bash脚本引用的位置,如 /data/github/shared/env.d/ 目录: 创建包含恶意代码的wiki页面 编辑wiki页面添加新内容 推送特殊命名的分支 触发revert操作写入env.d目录 等待服务重启或相关命令执行 技术细节 CSRF绕过分析 Rails的 valid_authenticity_token? 方法逻辑: 文件写入位置 推荐的可写目录: /data/github/shared/env.d/ /data/failbotd/shared/env.d/ 有效载荷构造 示例恶意wiki内容: 漏洞修复 GitHub Enterprise 2.21.4修复措施: 加强git命令参数验证 确保所有用户输入参数都经过严格过滤 改进CSRF保护机制 漏洞影响评估 严重性 :高危 影响 : 任意文件写入 潜在的远程代码执行 需要一定权限才能利用 防御建议 立即升级到GitHub Enterprise 2.21.4或更高版本 实施严格的输入验证 限制用户创建特殊命名分支的能力 加强CSRF保护机制 时间线 2020年7月25日:漏洞报告 2020年7月25日:GitHub确认漏洞 2020年8月11日:GitHub发布修复版本 总结 该漏洞展示了即使像GitHub这样成熟的产品也可能存在命令注入风险。关键在于: 对用户输入进行严格验证 安全地构造系统命令 实施多层防御机制 及时更新安全补丁 开发人员和安全团队应从该案例中学习如何更好地保护Web应用程序免受类似攻击。