如果你觉得自己写的代码烂,别慌,带人类登月的阿波罗11号代码里,也藏着惊天大Bug。

而且这一藏,就是整整57年。

这段代码被无数大神膜拜、研究、甚至逐行运行过,结果还是漏掉了一个致命逻辑漏洞。直到最近,一个技术团队用AI模型Claude配合自研工具,才把这个“幽灵”揪了出来。

说实话,这Bug要是当年运气不好爆发了,人类登月史可能就要改写。

众目睽睽下的“隐形杀手”

阿波罗制导计算机(AGC)的代码,堪称软件工程界的“圣经”。

自2003年开源以来,这堆汇编代码就被全世界程序员奉为圭臬。有人在GitHub上逐行研读,有人做仿真模拟,甚至有学者专门发论文分析它的可靠性。毕竟,这是在只有2KB内存、1MHz主频的破烂硬件上,跑出了人类最伟大壮举的代码。

AI配图

大家都觉得,这代码已经被扒得底裤都不剩了。

但Juxt团队的发现狠狠打了所有人的脸:他们在陀螺仪控制代码里,找到了一个存在了57年的资源锁泄露漏洞。

简单说,就是一把钥匙被插在锁孔里拔不出来了。

月球背面的“死亡剧本”

这个Bug最让人细思恐极的地方,在于它的触发场景。

想象一下,1969年7月21日,阿姆斯特朗和奥尔德林正在月球表面溜达,迈克尔·柯林斯独自驾驶指令舱在月球轨道飞行。

每两小时,他就要飞到月球背面,彻底失联。他在回忆录里写道:“此时此刻,我是全宇宙最孤独的人。”

在这种极度孤独和高压下,他需要运行P52程序来校准陀螺仪平台。如果平台漂移,返航的点火方向就会跑偏,他就永远回不了家。

Bug就是在这个时候埋伏好的。

假设柯林斯在校准陀螺仪时,不小心碰到了旁边一个带保护盖的“Caging”开关(这是一个紧急锁定装置,用来物理锁死陀螺仪防止损坏)。

代码会立刻检测到这个动作,然后终止校准流程。看起来很安全,对吧?

问题来了:代码虽然终止了,但它忘记释放陀螺仪的占用锁(LGYRO)

这时候,柯林斯发现误触了开关,取消锁定,重新尝试校准。

结果:系统死锁。

没有警报,没有报错灯,键盘有反应,但陀螺仪操作全部卡死。在月球背面,没有地面支持,电脑看似正常其实已经脑死亡。

如果这一幕发生,柯林斯面对的将是一个无法对准的导航平台,和一场注定失败的返航。他后来承认,他最恐惧的就是把同伴扔在月球,独自回来。

这个Bug,差点就把他的噩梦变成了现实。

缺失的4个字节

技术细节其实很“低级”。

AI配图

AGC管理陀螺仪时使用了一个共享资源锁LGYRO。正常流程下,程序结束会释放锁。但在“Caging”这个异常退出路径上,代码跳转到了一个叫BADEND的通用错误处理程序。

这个程序清理了大部分资源,唯独忘了清理陀螺仪专属的LGYRO

修复它只需要两条指令:

CAF ZERO
TS LGYRO

一共4个字节。

就是这4个字节,在57年里躲过了所有人工审查。因为人类的审查逻辑通常是“看代码做了什么”,而这个Bug藏在“代码没做什么”里。

更有意思的是,AGC的防御性编程太强了,强到掩盖了Bug。如果系统重启,锁会自动复位。当年的测试流程里,大概率触发过这个Bug,但因为重启后一切正常,没人发现锁其实没释放。

这就像你考试作弊没被抓,不是因为手段高明,而是因为老师刚好没抬头。

AI如何“逆天改命”?

这次发现Bug的过程,比Bug本身更值得玩味。

Juxt团队没用传统的静态分析工具,而是用了Claude和自研的行为规范语言Allium。

他们让AI从13万行汇编代码里提炼出1.25万行“行为规范”。这就像是把代码的“意图”提炼了出来。

测试是验证代码做了什么,规范是质问代码该做什么。

AI建立了一个资源生命周期模型:锁什么时候获取?什么时候必须释放?它发现,在LGYRO的模型里,有一条路径只有“上锁”,没有“解锁”。

这就是AI相对于人类审查的优势:它不会累,不会想当然,而且它能把所有路径跑一遍,哪怕是那些没人测过的“死角”。

软件工程的终极讽刺

这个Bug的发现,其实挺讽刺的。

AI配图

当年Margaret Hamilton团队首创了“软件工程”这个词,设计了优先级调度、异步多任务,这些理念至今还在用。阿波罗11号降落时的1202警报,也是因为系统过载保护机制生效,才挽救了任务。

越是精密的系统,越容易在边缘case上翻车。

现代语言像Rust,已经把“锁泄露”变成了编译错误,但在复杂的分布式系统、数据库连接、基础设施代码里,类似的资源泄露依然是程序员最头疼的噩梦。

MITRE甚至给这类问题专门编了个号:CWE-772。

这说明什么?57年过去了,我们依然在和同一类魔鬼战斗。

阿波罗的代码是手工编织进磁芯存储器的,那时候的程序员被称为“LOL”(Little Old Ladies,一群织代码的老奶奶)。她们一针一线织出了登月程序,却漏掉了那个不起眼的线头。

今天,我们有了AI辅助,有了高级语言,但只要代码是人写的,或者是为了人的意图服务的,这种“遗漏”就永远存在。

毕竟,每一艘安全返航的飞船背后,可能都藏着几个没人知道的Bug,在默默祈祷不要被触发。

【锐评】:
57年的老代码被AI翻出“后门”,这不仅是技术考古的胜利,更是给所有迷信“测试覆盖率”的工程师一记响亮耳光。

参考链接:
https://www.juxt.pro/blog/a-bug-on-the-dark-side-of-the-moon/