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