如果你觉得自己写的代码烂,别慌,带人类登月的阿波罗11号代码里,也藏着惊天大Bug。
而且这一藏,就是整整57年。
这段代码被无数大神膜拜、研究、甚至逐行运行过,结果还是漏掉了一个致命逻辑漏洞。直到最近,一个技术团队用AI模型Claude配合自研工具,才把这个“幽灵”揪了出来。
说实话,这Bug要是当年运气不好爆发了,人类登月史可能就要改写。
众目睽睽下的“隐形杀手”
阿波罗制导计算机(AGC)的代码,堪称软件工程界的“圣经”。
自2003年开源以来,这堆汇编代码就被全世界程序员奉为圭臬。有人在GitHub上逐行研读,有人做仿真模拟,甚至有学者专门发论文分析它的可靠性。毕竟,这是在只有2KB内存、1MHz主频的破烂硬件上,跑出了人类最伟大壮举的代码。
大家都觉得,这代码已经被扒得底裤都不剩了。
但Juxt团队的发现狠狠打了所有人的脸:他们在陀螺仪控制代码里,找到了一个存在了57年的资源锁泄露漏洞。
简单说,就是一把钥匙被插在锁孔里拔不出来了。
月球背面的“死亡剧本”
这个Bug最让人细思恐极的地方,在于它的触发场景。
想象一下,1969年7月21日,阿姆斯特朗和奥尔德林正在月球表面溜达,迈克尔·柯林斯独自驾驶指令舱在月球轨道飞行。
每两小时,他就要飞到月球背面,彻底失联。他在回忆录里写道:“此时此刻,我是全宇宙最孤独的人。”
在这种极度孤独和高压下,他需要运行P52程序来校准陀螺仪平台。如果平台漂移,返航的点火方向就会跑偏,他就永远回不了家。
Bug就是在这个时候埋伏好的。
假设柯林斯在校准陀螺仪时,不小心碰到了旁边一个带保护盖的“Caging”开关(这是一个紧急锁定装置,用来物理锁死陀螺仪防止损坏)。
代码会立刻检测到这个动作,然后终止校准流程。看起来很安全,对吧?
问题来了:代码虽然终止了,但它忘记释放陀螺仪的占用锁(LGYRO)。
这时候,柯林斯发现误触了开关,取消锁定,重新尝试校准。
结果:系统死锁。
没有警报,没有报错灯,键盘有反应,但陀螺仪操作全部卡死。在月球背面,没有地面支持,电脑看似正常其实已经脑死亡。
如果这一幕发生,柯林斯面对的将是一个无法对准的导航平台,和一场注定失败的返航。他后来承认,他最恐惧的就是把同伴扔在月球,独自回来。
这个Bug,差点就把他的噩梦变成了现实。
缺失的4个字节
技术细节其实很“低级”。
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的发现,其实挺讽刺的。
当年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/