Josh最近写了一篇文章,关于2006年Debian Linux中出现的一个严重的安全漏洞,以及它是否真的是NSA插入的后门。(他的结论是,很可能不是。)。
今天我想写的是2003年的另一件事,在那件事中,有人试图借壳Linux内核。这一次绝对是企图插入后门。但我们不知道是谁做了这一尝试--我们可能永远也不会知道。早在2003年,Linux就使用一个名为BitKeeper的系统来存储Linux源代码的主副本。如果开发人员想要提出修改Linux代码的建议,他们将提交他们建议的更改,然后通过一个有组织的审批过程来决定更改是否会被接受到主代码中。对主代码的每一次更改都会有一个简短的解释,其中总是包含一个指向其批准记录的指针。
但有些人不喜欢BitKeeper,所以保留了源代码的第二份副本,这样开发者就可以通过另一个名为CVS的代码系统获得代码。代码的CVS副本是主要BitKeeper副本的直接克隆。
但在2003年11月5日,拉里·麦克沃伊(Larry McVoy)注意到CVS副本中有一个代码更改,没有指向批准记录的指针。调查显示,该更改从未获得批准,更奇怪的是,该更改根本没有出现在主要的BitKeeper存储库中。进一步的调查确定,显然有人(以电子方式)闯入CVS服务器并插入了此更改。
这一变化起到了什么作用?这才是真正有趣的地方。这一更改修改了名为wait4的Linux函数的代码,程序可以使用该代码等待某些事情发生。具体地说,它添加了这两行代码:
[了解C编程语言的读者练习:这段代码有什么不寻常之处?答案显示在下面。]。
专家的随意阅读会将其解释为无害的错误检查代码,以使wait4在以文档禁止的特定方式调用wait4时返回错误代码。但是一个真正细心的专家读者会注意到,在第一行的末尾,它说的是“=0”,而不是“==0”。在这样的代码中编写代码通常是“==0”,它测试当前运行的代码(current->;uid)的用户ID是否等于零,而不修改用户ID,但实际出现的是“=0”,其效果是将用户ID设置为零。
将用户ID设置为零是一个问题,因为用户ID号0是“根”用户,它被允许做任何它想做的事情-访问所有数据、更改所有代码的行为,并完全危及系统所有部分的安全性。因此,这段代码的效果是为任何以特定方式调用wait4的软件授予root权限,而这种方式应该是无效的。换句话说,…。这是个经典的后门。
这是一件非常巧妙的作品。这看起来像是无害的错误检查,但实际上是后门。而且它是在正常的审批流程之外被偷偷溜进代码中的,以避免审批流程注意到发生了什么事情的任何可能性。
但是这一尝试没有成功,因为Linux团队足够仔细地注意到这段代码在CVS存储库中,而没有经过正常的审批流程。Linux得一分。
这有可能是美国国家安全局的袭击吗?也许吧。但还有许多其他人有实施这次袭击的技能和动机。除非有人认罪,或者找到确凿的文件,否则我们永远不会知道。