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

一个分号击穿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.

相关推荐
热点推荐
炸锅!钟南山团队:71%肺结节患者从不抽烟,烟民可以更嘚瑟了…

炸锅!钟南山团队:71%肺结节患者从不抽烟,烟民可以更嘚瑟了…

慧翔百科
2026-09-24 08:35:18
人妻熟女街头随拍,紧身穿搭勾勒丰腴曲线

人妻熟女街头随拍,紧身穿搭勾勒丰腴曲线

只要高兴就好
2026-10-04 08:55:48
70岁的吕良伟带25岁儿子参加甄子丹岳母的生日宴,父子俩站在一起看着像哥俩

70岁的吕良伟带25岁儿子参加甄子丹岳母的生日宴,父子俩站在一起看着像哥俩

老吴教育课堂
2026-10-11 07:08:45
当初觉得很贵,拥有之后才觉得后悔没早买 网友:这我太有发言权了

当初觉得很贵,拥有之后才觉得后悔没早买 网友:这我太有发言权了

另子维爱读史
2026-10-11 20:54:28
广东季前赛1胜2负却收获2大惊喜!一人3战抢19篮板,另一人表现超徐杰

广东季前赛1胜2负却收获2大惊喜!一人3战抢19篮板,另一人表现超徐杰

弄月公子
2026-10-12 11:54:22
《天道》里说,你朋友开公司,你只是员工,这不是资源,你朋友开公司,你有技术,这才是资源,核心是这三点

《天道》里说,你朋友开公司,你只是员工,这不是资源,你朋友开公司,你有技术,这才是资源,核心是这三点

橙心故事说
2026-08-11 20:01:22
网友自曝女学员出轨健身教练,却被查出HIV阳性,被发现后哭诉:我就出轨一次呀

网友自曝女学员出轨健身教练,却被查出HIV阳性,被发现后哭诉:我就出轨一次呀

小徐讲八卦
2026-10-10 13:39:13
潘良,受贿数额特别巨大

潘良,受贿数额特别巨大

新京报
2026-10-12 10:15:18
韩莹老公雷洋在线支招王曼昱:打佐藤瞳不能猛冲,多用长短球调动

韩莹老公雷洋在线支招王曼昱:打佐藤瞳不能猛冲,多用长短球调动

漫川舟船
2026-10-12 12:50:14
广东队赢球,主教练却泼冷水,最新大外援曝光,辽篮弃将要加入

广东队赢球,主教练却泼冷水,最新大外援曝光,辽篮弃将要加入

宗介说体育
2026-10-12 09:29:26
教育部到底管不管?学校还在瞎卷,初一孩子要在学校呆14个小时!

教育部到底管不管?学校还在瞎卷,初一孩子要在学校呆14个小时!

可达鸭面面观
2026-09-02 11:18:33
没有不散的宴席!加入团队仅一周年,唐尚珺搭档渺渺宣布退出,本人回应:个人决定,与金钱无关

没有不散的宴席!加入团队仅一周年,唐尚珺搭档渺渺宣布退出,本人回应:个人决定,与金钱无关

王大嘴评说
2026-10-10 23:46:09
参加解放者杯?迈阿密主帅:我们会非常乐意 相信梅西也对此兴奋

参加解放者杯?迈阿密主帅:我们会非常乐意 相信梅西也对此兴奋

砚底沉香
2026-10-12 05:49:04
55岁郎永淳现状:妻子退休金只有3000,海归儿子待业,他停不下来

55岁郎永淳现状:妻子退休金只有3000,海归儿子待业,他停不下来

娱说瑜悦
2026-10-10 21:12:17
这7个字写成毛体草书,问了150多人全摇头——到底写的啥?难道这就是笔墨的神采?

这7个字写成毛体草书,问了150多人全摇头——到底写的啥?难道这就是笔墨的神采?

书画相约
2026-10-12 11:49:53
飞天奖这晚,倪萍给闺蜜迟蓬出了一口恶气,没给宋佳留一点体面

飞天奖这晚,倪萍给闺蜜迟蓬出了一口恶气,没给宋佳留一点体面

秋风悲画芯
2026-10-12 06:12:27
掘金133-128击败公牛!此战看到5个事实:不该给布劳恩5年1.25亿

掘金133-128击败公牛!此战看到5个事实:不该给布劳恩5年1.25亿

篮球大视野
2026-10-12 12:01:04
取消特权,全民赞成!退休金设计者郑秉文,55年出生,他会怎样?

取消特权,全民赞成!退休金设计者郑秉文,55年出生,他会怎样?

阿伧说事
2026-07-29 15:03:38
尊界V800的江淮汽车:周六请病假算旷工,开除不给赔偿金?

尊界V800的江淮汽车:周六请病假算旷工,开除不给赔偿金?

小小河
2026-10-09 18:22:46
顺风车乘客:想坐奥迪。顺风车主:想坐奥迪没问题啊,补点高速费,独享送你一人回家过节,连车费带高速费给到118。乘客:抢哦!!!

顺风车乘客:想坐奥迪。顺风车主:想坐奥迪没问题啊,补点高速费,独享送你一人回家过节,连车费带高速费给到118。乘客:抢哦!!!

呼呼历史论
2026-10-12 12:03:36
2026-10-12 13:24:49
新智元 incentive-icons
新智元
AI产业主平台领航智能+时代
16405文章数 67158关注度
往期回顾 全部

科技要闻

尊界:10月底确认制动踏板支架升级方案

头条要闻

别墅业主举报自己停车位:万一着火 我是第一个受害者

头条要闻

别墅业主举报自己停车位:万一着火 我是第一个受害者

体育要闻

英超-曼城3-0十人利物浦 豪取6连胜领跑

娱乐要闻

梅启明自资办梅艳芳追思会,34人到场

财经要闻

尊界,是江淮的救命车还是失血引擎?

汽车要闻

大6座插混SUV新选择 阿维塔T09概念版亮相巴黎车展

态度原创

艺术
数码
房产
亲子
军事航空

艺术要闻

17幅 中国当代画家作品欣赏

数码要闻

曝华为首款鸿蒙台式机将于本月底上市 搭载鸿蒙7.0

房产要闻

加价255万;疯抢212轮!海口豪宅,又有新剧本!

亲子要闻

14岁女孩肚子越来越大,高高隆起像怀孕,妈妈坐不住了带去检查;医生:这种病容易发现得晚,或被当做“发育”草草略过

军事要闻

视频:沙特方面公布利雅得机场遭袭画面

无障碍浏览 进入关怀版