免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2199 | 回复: 0
打印 上一主题 下一主题

Ken Thompson的图灵奖演说与UNIX的后门(zz) [复制链接]

论坛徽章:
30
水瓶座
日期:2014-08-22 21:06:3415-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:4715-16赛季CBA联赛之天津
日期:2019-01-11 01:11:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-24 21:11 |只看该作者 |倒序浏览

    UNIX是以C语言写成的。使用C语言的其中一个优点是造成了UNIX的可携性。
另一方面,工作站的销售对象是需要大量计算的工程师、科学家等等;因此不同
於PC,在工作站级以上的电脑上,compiler是一项附在作业系统中的基本配备。
UNIX系统中必定附有C compiler。既然要保持可携性, UNIX系统里面所附的的C
compiler也得和UNIX系统一样,用C写作。
    C compiler本身,也是用C写的。当一个语言的compiler 也用该语言本身来
写的时候,  便会发生一些有趣的事情。  也许您会问,  既然电脑上面已经有
C compiler了,那麽我们要再去compile另一个compiler的source code作什麽?
答案可能是,原有的内建C compiler可能比较简陋或著老旧,因此我们想把新的
compiler用旧的compiler编译,然後当成系统内建的compiler用。换句话说,我
们就这麽扩充了系统的内建compiler。
    Glasgow大学的GRASP计划,也用这样的过程发展他们的Haskell compiler。
Haskell是一个functional language(记得Programming Language课中
提到的functional programming吗?)。Functional programming总是带有较多
的学术味而缺乏实用经验。Haskell语言本身仍有不少需要再扩充的空间。GRASP
计划用 Haskell 来写Haskell compiler:先从简单的写起, 产生一个最原始的
Haskell compiler,然後用这套原始的Haskell语言写一个功能较强的 compiler
(把原来的Haskell扩充了),再用第二版的 Haskell 语言写第三版的compiler
....。由於都是compiler,因此并不会减低效率。一个好处是,每次扩充语言,
接下来立刻用新的语言写compiler,於是我们可以立刻看出新加功能是否有用处?
该怎麽用?如此累积的经验,正可以作Haskell语言以後发展设计的参考。GRASP
计划的理想就是″把functional proramming带出实验室″。
    UNIX的创造人之一,Ken Thompson,在他的 Turing Award Lecture中,便
由这个主题加以发挥,说了一些有趣的故事。C 是一个被拿来写作业系统的语言。
写作业系统的人很难忍得住诱惑,不在系统里面装些後门的。想想看,如果我写
作业系统时,偷偷在login 的部份加一段程式码,使得全世界的这套作业系统只
要看到我的account和密码就让我进去,给我root权限,这该是多爽呀。 但是我
不能直接在 login 的 source code 里面这样写,否则一下就被人抓到了(既然
source code流通,就是要给人看的呀)。 该怎麽办呢?就从compiler里面动手
脚,称作patch1吧:在compiler中多加一道手续, 如果发现被compile的原始程
式″疑似″在作login动作,就把它开个漏洞,让我进得去。
    但是这样也不见得行得通。Compiler以後也会改版,新版的compiler可能不
是我在写。装系统的人也不见得用我的compiler。怎麽办呢?於是我在compiler
的source code中作第二次手脚,称作patch2:如果这个compiler觉得在compile
的程式″疑似″另一个 compiler 的 source 的话,就加入上面的patch1和这个
patch2本身。
    好,现在作业系统推出了,CC1 是我写的内建compiler,其中有我动的两个
手脚。现在某人在compile UNIX, 不得不用这个compiler。然而CC1 中已经有了
patch1,於是一旦compile到login, compile出来的login程式就被动了手脚。只
要看到我的名字,就一定让我进系统,给我root权限。
    ,--------.      +-------------+      ,-----------.
    | login  |      |  Compiled   |      |   login   |
    | source |=====>|   by CC2    |=====>|  Program  |
    | (clean)|      | patch 1作用 |      |(受感染了!)|
    `--------'      +-------------+      `-----------'
    既然 compiler CC1会作怪, 那麽自己写 compiler 总可以了吧? 然而,C
compiler还是得用C写,写好了之後,用谁来compile呢? 只有用CC1来compile。
CC1发现新写的CC2是一个compiler的source code,於是 patch2 就发挥作用了。
CC1会在CC2中也加入patch1和patch2。於是CC2也被″污染″了。
    ,--------.      +-------------+      ,-----------.
    |  CC2   |      |  Compiled   |      |    CC2    |
    | source |=====>|   by CC1    |=====>|  Program  |
    | (clean)|      | patch 2作用 |      |含 patch1,2|
    `--------'      +-------------+      `-----------'
    如果再用CC2来compile一个正常的login程式,由於CC2中有了patch1,所以
compile出来的login程式也会有後门,让我任意的login;
    ,--------.      +-----------+      ,----------.
    | login  |      | Compiled  |      |  login   |
    | source |=====>|  by CC2   |=====>| Program  |
    | (clean)|      |(patch 1,2)|      |(patched!)|
    `--------'      +-----------+      `----------'
    如果用CC2 compile另一个compiler CC3,由於CC2中已经被加入了 patch2,
CC3又会被污染,也就是说CC3这个compiler中还是会有patch1和patch2......如
此一来,全世界的每一套UNIX都种下了这个後门,可以让我任意login!
    然而这些patch都只在binary档之中出现。CC2的source code一切正常,所以
从source code完全看不出有什麽不对劲呢!我们还可以进一步湮灭证据。一旦装
好一套系统,公开的CC1 source code中不必有动过手脚的程式码,只要让它被动
过手脚的compiler编译就可以了。
原本以为Ken Thompson只是写写罢了。後来据一些人说,这完全是Ken  Thompson
本人干过的真人真事。
   
参考资料: ACM Turing Award Lectures :
             the first twenty years 1966 to 1985
           QA76.24


               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15010/showart_249422.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP