网易首页 > 网易号 > 正文 申请入驻

一个分号击穿GitHub!少写一行过滤代码,亿级代码仓库差点被端

0
分享至

来源:市场资讯

(来源:新智元)


新智元报道

编辑:元宇

【新智元导读】一个小小的分号,能让任何有push权限的GitHub用户都可能在服务器后端执行任意命令,它撬开的不只是一次输入过滤失误,而是多租户云平台长期依赖的内部信任假设。

2026年3月4日,GitHub收到Wiz通过Bug Bounty提交的报告,报告描述的攻击入口极其简单:

一条构造过的git push,带一个push option,值里藏了一个分号。

40分钟内,GitHub内部复现了漏洞,从确认根因到云端修复上线总计约75分钟,不到2小时。

任何对某个仓库拥有push权限的已认证用户,理论上都能在处理这次git push的GitHub/GHES后端服务器上执行任意命令。

虽然GitHub官方博客写得很清楚:「没有任何客户数据被访问、修改或外泄。」

GitHub表示,由于该利用链会触发正常GitHub.com操作不会走的异常代码路径,他们据此查询遥测,未发现除Wiz测试外的触发记录。

Wiz自己也说:「我们没有访问任何其他租户的仓库内容。」

但这次事件,仍然撬开了那个被信了多年的内部信任假设。

一个分号

击穿三层信任

要看懂这次的漏洞链,得先看清GitHub内部那条push流水线长什么样。

你执行git push,请求进入GitHub内部的第一站叫babeld,它是GitHub自研的git代理,负责把你的连接往下转。

babeld先去问gitauth:这个用户有没有权限,这次push该遵守哪些规则?gitauth回来给一张清单:文件大小上限、分支命名规则、hook配置。

babeld把这张清单打包进一个叫X-Stat的内部请求头,往下传给gitrpcd。

gitrpcd是内部的RPC服务,它只认这个头,完全信任里面的每一个字段。

最后,负责最终检查的pre-receive hook拿到X-Stat,决定这次push能不能过。

整条流水线,X-Stat头就是通行证。


GitHub内部git push流水线:babeld → gitauth → gitrpcd → pre-receive hook

这个X-Stat头是一串以分号隔开的key=value,比如a=1;b=2;c=3。

解析的时候,系统把它们依次读进一个map。有个细节很关键:如果同一个key出现两次,后面那个会悄悄把前面那个覆盖掉。

问题出在哪?

git push有个正常功能,叫push option,允许你在推代码时顺带传一些自定义字符串给服务端。

babeld会把这些字符串原样编进X-Stat,比如你传了两个option,它就变成push_option_0=你传的内容;push_option_1=你传的内容。

babeld忘了一件事:没有过滤分号。

X-Stat里本来有个字段large_blob_rejection_enabled=bool:true,是文件大小限制的开关,默认开着。

攻击者构造一个push option,值里塞一个分号,后面跟上large_blob_rejection_enabled=bool:false。babeld原样写进去,X-Stat里同一个key就出现了两次。


X-Stat字段注入示意:攻击者构造的push option如何覆盖合法字段

map解析到重复的key,后写入的值覆盖前面那个。攻击者注入的false排在后面,赢了。文件大小限制,就这么被关掉了。

整个攻击的地基,就是babeld少写的那一行过滤代码。

这个漏洞背后的逻辑,在很多系统里都存在。

多个服务串在一条流水线上,每一站只管干自己的活,默认上一站传过来的数据是干净的、没有问题的。没有人在中间做二次检查。

结果就是:babeld没拦住分号,gitrpcd收到数据不验证,pre-receive拿到字段直接用。

每一站都默认上一站传来的是干净的、可信的。

三层信任叠在一起,一个分号全部击穿。

注入三个字段

GHES实例沦陷

绕过文件大小限制,只是Wiz用来验证注入可行的第一个测试。真正的目标,是拿到服务器的执行权限。

第一步,把沙箱关掉。

GHES允许管理员自定义一些hook脚本,在代码推送前自动运行。这些脚本默认在沙箱里跑,权限受限。

但Wiz逆向分析后发现,沙箱是否启用,取决于X-Stat头里一个叫rails_env的字段。值是production,进沙箱;填任何其他值,直接以git服务账户身份运行,没有任何隔离。

这个字段,可以注入。

第二步,把hook脚本的查找目录换掉。

注入custom_hooks_dir,把系统查找hook脚本的根目录,从默认位置改成攻击者能控制的地方。

第三步,指定一个恶意脚本来执行。

注入repo_pre_receive_hooks,在里面填一段路径穿越,让系统跳出正常目录范围,去执行服务器上任意一个二进制文件。

三步串起来,GHES服务器返回了这样一行输出:

remote: uid=500(git) gid=500(git) groups=500(git)

这行输出的意思是:代码已经在服务器上以git账户身份执行了。这说明研究员已经能以git服务账户身份在GHES服务器上执行命令。


Wiz研究员sagitz在X上展示的PoC:一条普通的git push命令,远端服务器返回了uid=500(git):代码在GitHub后端以git服务账户身份执行了。

Wiz把同样的攻击链对准GitHub.com,没成功。push走完了,hook没有触发,服务器什么都没返回。

继续逆向。

Wiz发现X-Stat里还藏着一个标志位,控制服务器是否以「企业模式」运行。GHES上这个标志默认开着,自定义hook一直可以跑;GitHub.com上默认关着,自定义hook根本不会被触达。

但这个标志,也在X-Stat里。也可以注入。

补上这第四步,整条链路打通了。Wiz在GitHub.com上执行了hostname,服务器返回了一个.github.net结尾的内部主机名。进去了。

GitHub在事后博客里坦承了一件事:那条非production的执行路径,本来就不应该出现在GitHub.com的生产环境里。

早期部署时专门把这段代码排除掉了,后来部署方式改了,排除的逻辑没有跟着迁移过来,这段代码就这么悄悄留在了镜像里,一直没人注意到。

漏洞利用之所以能贯通,正是因为这段「不该在那里」的代码恰好在那里。

Wiz枚举了两台被攻陷的节点,每台上都看到了百万级其他用户和组织的仓库索引项,他们表示:

没有读取任何其他用户的仓库内容。只是用自己的测试账户确认了一件事:git用户的权限,确实能访问这台节点上任何一个仓库。

GitHub的日志也印证了这一点。那条异常代码路径,所有触发记录全部指向Wiz自己的测试流量,没有其他账户出现过。

能访问,和真的去读了,是两件性质完全不同的事。这次是前者,不是后者。

但根本问题还是出在多租户平台的底层设计上。

GitHub.com把大量用户和组织的仓库放在同一批服务器上,统一交给同一个git服务账户管理,因为这个账户本来就需要处理所有人的数据。

任何人只要拿到这个账户的执行权限,该节点上的大量仓库都会进入权限视野。

共享底座带来了效率,也带来了这个去不掉的结构性脆弱点。

云端两小时打完补丁

本地可能要补半年

真正难收尾的,是自建的GHES。

Wiz公开披露时,数据显示88%的GHES实例还没打补丁。

按GitHub官方行动建议和NVD当前记录,管理员应升级到对应受支持分支的最新补丁版;NVD当前列出的修复版本为3.14.25、3.15.20、3.16.16、3.17.13、3.18.7、3.19.4,GitHub官方博客还列出3.20.0或更高版本。

GHES管理员需要做两件事。立刻升级,然后翻/var/log/github-audit.log,搜push options里含分号的记录,核查是否有未授权的注入痕迹。

这个漏洞的触发条件,是已认证用户加上对实例上某仓库有push权限。

门槛并不高。

任何拿到一个普通员工账号的攻击者,只要这个账号在公司GHES上能推代码,哪怕只是一个不起眼的内部项目,就能拿到整个GHES实例的执行权限。

而GHES上通常跑着公司全部的代码资产、CI配置、内部凭证。一旦失陷,后果很重。

这个漏洞,还不是GHES管理员当下补丁清单里的唯一一条。


GitHub Enterprise Server 3.19.5 Release Notes,单个版本同期修复多个HIGH级漏洞https://docs.github.com/en/enterprise-server@3.19/admin/release-notes

光看3.19.5这一个版本的更新说明,同期列出的HIGH级漏洞就还有四个:CVE-2026-5845、CVE-2026-5921、CVE-2026-4821、CVE-2026-4296。

用SaaS托管代码,补丁打好了自动生效,自建GHES,每一个补丁都要管理员自己跟上。

逆向太贵这条护城河

AI正在填平它

这次披露还有一个细节被忽视了,Wiz在技术博客里专门解释了这次为什么能找到。

他们说,GitHub内部的git流水线是大量编译后的闭源二进制,以前不是没想过审计,而是人工逆向的成本太高,做到一半放弃过。

这次回来重做,是因为工具变了。

过去很多闭源软件之所以「相对安全」,靠的不是代码本身有多严密,而是逆向分析的成本太高,没人愿意花那个时间。

代码不公开,不等于无法被审计,只是审计这件事过去在经济上划不来。

现在这笔账的算法变了。

过去需要资深逆向工程师投入数月的工作,用AI工具组合下来几周可以做完一轮。

Wiz自己也说,这是他们公开记录里第一批靠AI在闭源二进制里找到的关键级漏洞,用的是IDA Pro加MCP协议加LLM的组合。


Wiz Research博客认为:AI增强的逆向工程工具将在发现需要深入跨组件分析的漏洞类型方面,发挥越来越重要的作用。https://www.wiz.io/blog/github-rce-vulnerability-cve-2026-3854

AI不只在写代码,也在拆代码。

所有长期靠「闭源没人审」过日子的系统,都该重新估一遍自己真实的暴露面。

被分号撬开的信任假设

回到最初的问题。

CVE-2026-3854出现后,GitHub应急响应教科书级,补丁该有的全有,没有任何已知的真实攻击。

但这次事件留下了三件值得后端工程师认真思考的东西。

第一,系统设计上的隐患比单点漏洞更难察觉。

分隔符协议、跨服务隐式信任、last-write-wins解析语义,这三件事单独存在都不是什么大问题,组合在一起就是定时炸弹。任何用分号、竖线或换行传内部元数据的系统,今天就该翻一遍代码。

第二,多租户平台的风险是结构性的,不是GitHub一家的问题。

只要不同用户的数据放在同一台机器上、由同一个服务账户管理,这根敏感神经就一直在那里。攻击者一旦拿到执行权限,隔离能扛多少,取决于那个共享账户的权限边界设计得有多严。

第三,AI辅助逆向已经在重写攻防经济账。

AI辅助逆向正在改变攻防的成本结构。下一批被翻出关键漏洞的,大概率是那些长期靠「闭源没人审」撑着的企业级软件。

GitHub这次没出事,所以更应该认真讨论它。那个被信任了多年的X-Stat头,在一个分号面前,什么都没扛住。

参考资料:

https://www.wiz.io/blog/github-rce-vulnerability-cve-2026-3854%20

https://x.com/sagitz_/status/2049153195243372569?s=20

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
王曼昱哭了登热搜第一!两度致谢莎莎情真意切 陈熠何卓佳都哭了

王曼昱哭了登热搜第一!两度致谢莎莎情真意切 陈熠何卓佳都哭了

颜小白的篮球梦
2026-05-11 07:50:35
惨遭国乒男团3:0横扫!张本智和赛后与赛前采访对比,狠狠被打脸

惨遭国乒男团3:0横扫!张本智和赛后与赛前采访对比,狠狠被打脸

田先生篮球
2026-05-11 06:20:39
外国记者提问樊振东能否回归,国乒工作人员:这不是一个问题

外国记者提问樊振东能否回归,国乒工作人员:这不是一个问题

懂球帝
2026-05-11 17:07:41
一夜暴富!首发4人全是前5顺位!这谁顶得住啊!

一夜暴富!首发4人全是前5顺位!这谁顶得住啊!

柚子说球
2026-05-11 23:19:18
凌晨外出复印失联的西宁17岁高中女生已找到,亲属:属意外溺亡

凌晨外出复印失联的西宁17岁高中女生已找到,亲属:属意外溺亡

极目新闻
2026-05-11 19:13:31
房产圈最近最大的瓜,当属贝壳2025年财报的发布——没有惊喜,全是惊吓

房产圈最近最大的瓜,当属贝壳2025年财报的发布——没有惊喜,全是惊吓

每日质量报道网
2026-05-11 12:04:19
《主角》主角差评如潮,出场十几秒,网友评价:双眼无神像瞎子

《主角》主角差评如潮,出场十几秒,网友评价:双眼无神像瞎子

剧芒芒
2026-05-11 12:21:15
Here we go!罗马诺:弗里克和巴萨续约至2028年,含续约选项

Here we go!罗马诺:弗里克和巴萨续约至2028年,含续约选项

懂球帝
2026-05-11 21:20:18
广东惨败北京25分!杨溢10分7助,李奕臻5分,难怪杜锋不给机会

广东惨败北京25分!杨溢10分7助,李奕臻5分,难怪杜锋不给机会

多特体育说
2026-05-11 22:53:21
中国政府奖学金留学人员抵达平壤,正式开启在朝留学生活

中国政府奖学金留学人员抵达平壤,正式开启在朝留学生活

大风新闻
2026-05-11 08:36:09
特朗普宣布访华!带1500吨行李和豪华天团,这波是避难还是谈判?

特朗普宣布访华!带1500吨行李和豪华天团,这波是避难还是谈判?

李将平老师
2026-05-11 13:30:25
爸爸想把房子送给"干女儿"保姆 儿子扣房产证

爸爸想把房子送给"干女儿"保姆 儿子扣房产证

看看新闻Knews
2026-05-11 13:12:03
本想大干一场,却被大干一场

本想大干一场,却被大干一场

最爱历史
2026-05-11 18:58:17
随着吉达国民2-1,沙特联最新积分榜出炉:争冠和争亚皆白热化

随着吉达国民2-1,沙特联最新积分榜出炉:争冠和争亚皆白热化

凌空倒钩
2026-05-12 06:17:52
奔驰撞人2死6伤后续:女司机正脸曝光,职业反差太大 路人曝猛料

奔驰撞人2死6伤后续:女司机正脸曝光,职业反差太大 路人曝猛料

法老不说教
2026-05-11 18:18:17
俄阅兵活动简化,普京保护措施加强,有情报猜测可能与绍伊古有关

俄阅兵活动简化,普京保护措施加强,有情报猜测可能与绍伊古有关

麓谷隐士
2026-05-11 14:01:34
实战出真知!乌克兰靠真实战场数据,在中东赚麻了

实战出真知!乌克兰靠真实战场数据,在中东赚麻了

寰球经纬所
2026-05-10 10:10:20
阿根廷公布世界杯55人大名单:迪巴拉无缘!上届5位冠军成员落选

阿根廷公布世界杯55人大名单:迪巴拉无缘!上届5位冠军成员落选

我爱英超
2026-05-11 21:12:05
OPPO再致歉:从严处罚高级副总裁段要辉

OPPO再致歉:从严处罚高级副总裁段要辉

21世纪经济报道
2026-05-11 14:48:08
六台:皇马输掉国家德比后,姆巴佩一直待在皇马基地

六台:皇马输掉国家德比后,姆巴佩一直待在皇马基地

懂球帝
2026-05-11 18:51:07
2026-05-12 07:52:49
新浪财经 incentive-icons
新浪财经
新浪财经是一家创建于1999年8月的财经平台
3175472文章数 7334关注度
往期回顾 全部

科技要闻

黄仁勋:你们赶上了一代人一次的大机会

头条要闻

女子连上20多天瑜伽课被教练踢出群聊:天天来 不累吗

头条要闻

女子连上20多天瑜伽课被教练踢出群聊:天天来 不累吗

体育要闻

梁靖崑:可能是最后一届了,想让大家记住这个我

娱乐要闻

“孕妇坠崖案”王暖暖称被霸凌协商解约

财经要闻

宗馥莉罢免销售负责人 部分业务将外包

汽车要闻

吉利银河“TT”申报图曝光 电动尾翼+激光雷达

态度原创

艺术
教育
房产
健康
数码

艺术要闻

人民币78岁了!你见没见过的人民币,都在这里!

教育要闻

有公费海外交换机会的院校(妈妈!免费旷野!

房产要闻

产业赋能教育!翰林府与北师大的这场签约,绝不那么简单!

干细胞能让人“返老还童”吗

数码要闻

苹果iPadOS 17.7.11正式版发布

无障碍浏览 进入关怀版