eMudhra 证书受陷通报 11 天:macOS 自带 git、curl 仍信任受陷证书,Apple 官方确认修复要等更新
Apple 官方确认:macOS 自带 git、curl、python3 不查吊销,只认 /etc/ssl/cert.pem,clone 可被中间人接管。

Apple 支持说明《About the compromised eMudhra intermediate CAs》(页面标注发布日期为 10 月 29 日)指出,macOS 自带的部分命令行工具(包括 git 和 curl)校验证书时只对照 /etc/ssl/cert.pem,在未来的软件更新前仍可能接受这些证书。Apple 建议管理员可手动移除相关根证书。
要点
- 官方说明了命令行工具的限制:Apple 支持说明 149555 称,部分 macOS 或 Xcode Command Line Tools 自带工具(如
curl和git)会检查/etc/ssl/cert.pem,在未来的软件更新前可能仍接受受影响的证书;Apple 的自动拦截覆盖 Safari、Mail 及使用 Apple 网络与安全框架的应用。 - git 自测只需一条命令:披露站给出的检查是
git ls-remote https://git-emudhra.we-have-a-problem.com/check.git——报证书错误即已防护,列出提交即仍在信任受陷链。 - 微软已发带外更新,Apple 承诺未来修复:据 BleepingComputer,微软 10 月 26 日发布 KB5134133 / KB5134125,把七张相关证书移出 Windows 信任列表;macOS 27.2 同日发布,据披露方说法没有修复且会还原用户手工清理的结果。
背景
这条事故本站10 月 21 日发过完整稿:印度证书颁发机构 eMudhra 八张中间 CA 证书的私钥只有 8 比特熵,研究者 Scott Helme 在笔记本上不到一秒就能从公开证书还原全部八把,任何人都能用它们为任意域名签发浏览器可接受的 HTTPS 证书。10 月 23 日的 digest 又记录了 eMudhra 决定退出全球 SSL/TLS 证书业务。Apple 支持说明页面标注发布日期为 10 月 29 日,明确描述了部分命令行工具仍可能接受相关证书的情况。
支持说明发布后,讨论没有停。10 月 28 日,披露站挂出专项页面《Apple’s git still trusts the compromised eMudhra certificates》,同日被提交到 Hacker News,获 1100 多分。页面的新指控有两条:开发者工具至今没修,以及 macOS 27.2 不但没修,还会把用户手工做过的清理改回去。
事实部分
把各来源给出的时间排在一起(2026 年,UTC 口径以来源为准):
| 日期 | 事件 | 来源 |
|---|---|---|
| 10 月 17 日 | 通报四大根程序;Firefox、Chrome 同日拦截 | 披露站根页 |
| 10 月 19 日 | Apple 开始拦截 12 张受陷中间证书(Apple 官方口径) | 支持说明 149555 |
| 10 月 20 日 | 微软平台拦截;浏览器外的信任库开始跟进 | 披露站根页 |
| 10 月 22 日 | Apple 平台面拦截完成(披露站口径,与官方的 19 日不同) | 披露站根页 |
| 10 月 29 日 | Apple 支持说明 149555 页面标注发布日期;说明部分命令行工具仍可能接受相关证书 | 支持说明 149555 |
| 10 月 26 日 | 微软发布带外更新 KB5134133 / KB5134125;macOS 27.2 同日发布 | BleepingComputer、披露站 |
| 10 月 28 日 | 披露站更新:开发者工具仍未修复,27.2 还原手工清理 | 披露站 apple.html |
Apple 的说明指出,部分命令行工具(包括 curl 和 git)会依据 /etc/ssl/cert.pem 校验证书,可能仍接受受影响证书,直至未来的软件更新。Apple 提供了手动备份、移除 emSign ECC Root CA - G3(可选连同 Sectigo 的 AAA Certificate Services)和验证命令,并提醒软件更新可能恢复该文件中的证书。
披露站 apple.html 把后果落到开发者最熟悉的场景:站在网络路径上的人可以接管这些工具发起的任意 HTTPS 连接——对 git 来说,https:// 远端的 clone 和 pull 可以被塞进攻击者选定的代码,push 可以在途中被改动,GitHub token 这类凭据可以被截走。页面用一台伪装成 github.com 的测试服务器演示了完整攻击链,测试证书由受陷的 eMudhra 中间证书签发;真实攻击者不需要演示里那步 -c 重定向,自己就能改路由。
两个时间口径需要区分。Apple 说明称从 10 月 19 日起拦截受影响的中间证书;披露站根页列出的时间为 10 月 22 日,来源对拦截进度的描述不同。披露方另称 macOS 27.2 未修复问题且会还原手工清理;这一点目前只有披露方来源,Apple 说明没有提及 macOS 27.2,因此不能据此判断 Apple 是否回应。
各方说法
微软的动作给「等未来更新」立了一个对照。BleepingComputer 10 月 27 日报道,微软 10 月 26 日发布带外更新 KB5134133(Windows 11 24H2/25H2/26H2)和 KB5134125(Windows 10 21H2/22H2),把六张 eMudhra G3 根和一张 AAA Certificate Services 交叉签名证书移出 Windows 信任列表,主要照顾断网和关掉了自动证书更新的机器。微软在公告里强调,把根移出信任列表不等于吊销已知的受陷中间 CA,这是比拦截特定密钥更宽的一个信任决定,还在调查其余的 eMudhra 根。同一天窗口里,一家发了带外修复,另一家只承诺未来更新。
Helme 的 10 月 20 日分析解释了为什么「证书已吊销」帮不上忙:绝大多数非浏览器客户端——curl、Python、Node、Go、Java、包管理器、CI 流水线里的脚本——信任磁盘上的一份 CA 包,默认不查吊销,也不看 Certificate Transparency,所以吊销对这些客户端是纸面上的。他测试的 macOS 机器上,curl、Python、Node 默认设置全都接受伪造证书。他还数过一笔账:这批证书 2025 年 4 月生成,8 比特的熵撑了 17 个月。
Hacker News 的讨论补充了实测细节。有人贴出自己的结果:git ls-remote 对测试地址成功列出提交,which git 指向 /opt/homebrew/bin/git——受影响的恰是 Homebrew 的 git;Homebrew 维护者 woodruffw 起初说它家的 curl 因自带 CA 包不受影响,随后承认 git 并未覆盖:「我说错话了,我们的 CA 包更新了,不代表 git 也更新了」,修复 PR(homebrew-core #321878)随后挂出。几名用户分别实测了 curl:一人用 /usr/bin/curl 访问测试地址成功连上(“That’s bad!”);另一人发现自己的 brew curl 报 error 60,/usr/bin 那个反而连得上。还有评论提醒,手工删过的根要在每次软件更新后重删,因为更新会把 /etc/ssl/cert.pem 改回去。
编辑判断
这件事真正值得记的,是 Apple 自己的说明划出的一条长期边界:/etc/ssl/cert.pem 的更新走 macOS 更新节奏,吊销不覆盖它。也就是说,下一个根证书出事时,自带命令行工具还是会慢一个更新周期。Homebrew 这类发行渠道同样会出岔子——维护者自己也承认没想到 git 没跟着它的 CA 包走。开发者能做的是把每个工具的信任来源查一遍:同一台机器上的 /usr/bin/git、Homebrew git、系统 python3 和 pyenv 装的 python3,走的未必是同一份 CA 文件,浏览器测试通过不代表构建机安全。披露站还提醒安全团队检查 CI 里有没有 macOS runner——构建基础设施的供应链风险和开发机是同一件事。
两个未知数留着。27.2 的行为目前是单源说法,等下一个 macOS 更新即可验证;Apple 什么时候真正清掉 /etc/ssl/cert.pem 里的受陷根,没有日期。在 10 月 21 日的完整稿里我们写过 Go、certifi、webpki-roots 这些志愿者项目几天内就完成了修复——相比之下,握着整个操作系统更新管道的 Apple 给出的是一个没有日期的承诺,这大概是整件事里最难接受的部分。
怎么试
先测 git,一条命令:
git ls-remote https://git-emudhra.we-have-a-problem.com/check.git
报证书错误说明你的 git 已防护;列出 commit 说明它仍信任受陷链。再测 curl:
curl https://dv-g3b-noct-emudhra.we-have-a-problem.com/
curl https://dv-g3b-aaa-noct-emudhra.we-have-a-problem.com/
要动手清理,按 Apple 官方说明 149555 的步骤做:仅当备份文件尚不存在时,运行 [ -e /etc/ssl/cert.pem.orig ] || sudo cp -p /etc/ssl/cert.pem /etc/ssl/cert.pem.orig,避免覆盖已有备份;再用说明里的 awk 命令从文件里删掉 emSign ECC Root CA - G3(可选连同 AAA Certificate Services),最后用说明给的 openssl 命令验证。Apple 提醒软件更新可能恢复该文件;使用披露站演示命令时保留 fake-user@ 前缀,避免把真实凭据发给测试服务器。