Debian OpenSSL Bug - 后门还是安全事故? ====================================================== 之前,Ed 写了篇文章[《软件透明度》][1],主旨是如果软件开发的过程是透明的,那么软件对恶意的后门(以及无心的安全漏洞)就更具抵抗性。 软件透明的因素包括公开源代码,可以阅读源代码或为一个项目反馈的问题做出贡献,以及参与内部开发讨论。他提到一种情况,在这儿我想详细讨论一下:在2008年,Debian项目(一个用于web服务器的很流行的linux发行版),[宣称][2]Debian中[OpenSSL][3]的伪随机数生成器遭到破解,已经不安全了。 首先,了解一些背景信息:伪随机数生成器(PRNG)就是一个程序,假定代号为F。给定一个随机种子s,则会得到一个看起来随机的长的二进制序列F(s)。如果我和你都使用同样的种子s,两个人会得到同样的二进制序列。但是如果我随机选择一个s,也不告诉你s是什么,你根本不能够推测F(s)的结果,如你所期望的,F(s)就是随机的。OpenSSL中的PRNG试图从系统中抓取不可预测的信息(称之为"熵"),比如当前进程ID,或者很有可能是不同的内存内容(比如,由其它一些进程控制或可能控制的未初始化的内存)等等。把这些东西转换成种子s,就会得到随机比特流F(s)。 2006年,为了解决一个用于查找软件内存存取bug的[工具][5]的[警告问题][4],一名Debian维护者[决定注释掉][6]OpenSSL PRNG里的[两行代码][7]。但是这两行代码非常重要,它们负责抓取几乎所有的不可预测的熵,以作为OpenSSL PRNG的种子。没有这些代码,PRNG只有总共32,767个选择可作为种子s,因而也只有这么多的F(s)供选择。 这样一来,很多依赖于OpenSSL随机数生成器的程序,其实并没有它们以为的那么多的随机选择。比如,一个这样的程序要为SSL(安全网络浏览)和SSH(安全远程登录)生成秘钥。严格来说,这些秘钥必须是随机的:如果你可以猜到我的秘钥,你就可以破解我使用该秘钥保护的任何东西。这意味着你有能力读取加密的通讯信息,[登录到远程服务器][8],或者[伪造看起来似乎是真实的信息][9]。这个漏洞是2006年第一次引入,而且[进入到Ubuntu中][10](另一个流行的linux发行版,广泛应用于网络服务器)。漏洞影响到数以千计的服务器而且[存在了很长一段时间][11],因为只是给受影响的服务器打补丁还不足以解决问题,必须替换掉任何在漏洞存在情况下生成的秘钥。 顺便说一句,为伪随机数生成器寻找熵是个[著名][12]的[难题][13]。事实上,在今天来看要解决这个问题依然是个[巨大的挑战][14]。随机错误难以检测,因为当你盯着输出看时,每次运行程序结果都不一样,就像随机的一样。弱随机性很难发现,但是它可以使(貌似)安全的加密系统失效。不过,Debian中的那个漏洞很醒目,被发现后[在安全社区][15][引起了很多嘲笑][16]。 于是有人问,这是个故意设置的后门吗?似乎不大可能。做出这个更改的代码维护者 [Kurt Roeckx][17],后来成为[Debian项目的主管][18]。这意味着他是个可靠的家伙,不是为了插入漏洞而由NSA伪造出来的身份。想进入Debian项目组的核心,需要做出巨大的努力,那真是出了名的难进。这样看来,错误根本不是有意为之,而是[一系列失误][19]导致的,而且后果严重。 漏洞确实是在一个透明的环境下发生的。所做的任何一件事都是公开的。但是漏洞还是引入了,而且长时间未被注意到。部分原因在于,透明引起了很多混乱,导致本应发现这个显而易见的漏洞的人们也都没太在意。 另外,也因为漏洞本身太过微妙,一个随意的观察者很难发现修改带来的影响。 这是否意味着软件透明没什么帮助? 我可不这么认为。许多人都赞同透明软件要比不透明软件更安全。但是这也并不表示漏洞不会产生,或者认为有其他人都看着呢而我们自己就可以掉以轻心。 至少,多年以后,透明可以让我们回顾,究竟是什么导致了某个漏洞--本文例子中,就是工程上的纰漏,而非人为破坏。 --- via: https://freedom-to-tinker.com/blog/kroll/software-transparency-debian-openssl-bug/ 译者:[l3b2w1](https://github.com/l3b2w1) 校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出 [1]:https://freedom-to-tinker.com/blog/felten/software-transparency/ [2]:http://www.debian.org/security/2008/dsa-1571 [3]:https://www.openssl.org/ [4]:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=363516 [5]:http://valgrind.org/ [6]:http://marc.info/?l=openssl-dev&m=114651085826293&w=2 [7]:http://svn.debian.org/viewsvn/pkg-openssl/openssl/trunk/rand/md_rand.c?rev=141&view=diff&r1=141&r2=140&p1=openssl/trunk/rand/md_rand.c&p2=/openssl/trunk/rand/md_rand.c [8]:http://www.exploit-db.com/exploits/5622/ [9]:http://plog.sesse.net/blog/tech/2008-05-14-17-21_some_maths.html [10]:http://www.ubuntu.com/usn/usn-612-1/ [11]:http://cseweb.ucsd.edu/~hovav/dist/debiankey.pdf [12]:http://xkcd.com/221/ [13]:http://dilbert.com/strips/comic/2001-10-25/ [14]:https://factorable.net/weakkeys12.extended.pdf [15]:http://www.links.org/?p=327 [16]:http://www.xkcd.com/424/ [17]:http://www.roeckx.be/journal/ [18]:http://lists.debian.org/debian-devel-announce/2009/02/msg00009.html [19]:http://research.swtch.com/openssl