咨讯

网络安全公司Codenomicon将这个漏洞命名为"心脏出血",并为它制作了一个logo,以唤起公众的警惕

很多需要加密通信的网站都会用到HTTPS协议
4月上旬,全球许多知名网站被爆存在一个名为"心脏出血"的安全漏洞,这被称为史上最严重的网络安全漏洞。这个漏洞使得用户在许多互联网应用,包括网银中的账号、口令等重要信息会被人轻易窃取。"心脏出血"漏洞是怎么产生的?我们应如何应对?为此,本刊专访了中国科学院信息工程研究所信息安全国家重点实验室常务副主任林东岱研究员。

林东岱研究员:中国科学院信息工程研究所信息安全国家重点实验室常务副主任
记者/方 晨
什么是"心脏出血"漏洞?
科学世界:"心脏出血"(Heartbleed)漏洞据说与OpenSSL有关,它到底是如何产生的?
林东岱:这要先从计算机协议说起。我们知道,计算机只是一台台机器,不同的计算机要连接成一个系统一起完成一项任务,之间就需要有一个"协议",也就是一套规则,规定相互之间如何通信等。计算机协议有很多种,用来完成不同的任务,例如我们常见的TCP/IP协议是用来进行网络数据传输的,FTP协议是用于文件传输的,HTTP协议是用于网页(超文本)传输的,SMTP协议是用于电子邮件传输的,等等。
在最初制定这些协议时,人们很少考虑到安全性的问题。大家关心的是如何实现工作中需要实现的功能,而没有想到将来还可能会有人利用这些协议来做坏事。当时,计算机网络也没有现在这么普及,只是用于科学研究等一些非常专业的领域。但是,当计算机网络应用到社会的方方面面之后,用户就不再是那么单纯,例如有些人会做一些破坏活动等,这时这些协议的安全问题就暴露出来了。
所以,现在有一些协议,除了完成特定的功能,还有一些安全的目标。这样的协议就叫"安全协议",例如HTTPS、SSH(Secure Shell)等。信息安全的目标有很多方面,有的是保证机密性,有的是保证完整性,还有对用户的认证等。我觉得互联网上最大的安全问题就是认证问题。
现实生活中,虽然也有电话诈骗的情况,但我们通过见面或打电话还是比较容易确认对方的身份。而在互联网上,身份信息只不过是一串数字,如何判断这串数字背后的真实身份是一个很重要的问题。其实我们经常要输入账户口令(password),这就是一种最普通的身份认证。互联网上还有一些"认证协议",就是用来判断用户的身份。
我们要在互联网上进行安全通信,首先就要知道对方是谁,否则,通信的保密等就都没有意义了。在身份认证可靠的基础上,才有后续的加密、保证数据完整性等问题。HTTP是一种传输协议,它的应用非常广,不光是网页,还有很多基于万维网(World Wide Web,简称WWW)技术的应用也用到这个协议来传输信息。以HTTP协议为核心的万维网诞生之后,身份认证和保密通信的需求很大,于是就诞生了SSL协议。
SSL协议,即"安全套接层"协议,就是用来提供安全认证和安全加密功能的。这个协议里包括了一系列的保护机制。首先是身份认证,认证后的双方再协商用什么样的密码算法加密需要传输的信息。SSL协议的应用非常广。
科学世界:那么HTTP协议和SSL协议之间是什么关系?
林东岱:SSL协议是在HTTP协议之上的一个认证协议,先通过SSL协议进行安全认证,然后再通过HTTP协议来传输信息。加上了SSL协议的HTTP协议,就标记为HTTPS。也就是说,HTTPS协议执行的时候要先调用SSL协议。
科学世界:通常的网站,哪些要用到SSL?
林东岱:SSL也并不是专门为HTTP来做的。除了HTTPS开头的网站外,其他一些应用,包括SSH(用于远程登录)、FTP(用于文件传输)等,还有很多管理软件,也都会需要SSL来提供认证或加密数据传输。
科学世界:这次的"心脏出血"漏洞就是出在SSL协议上?
林东岱:其实SSL协议本身并没有什么问题,问题是出在协议的实现上。
大家对SSL协议的需求很大,很多开发人员都需要用到这个协议。在计算机领域,有很多人义务从事"开源"的工作,他们中的一些人将这个协议实现后,把源代码公开,免费让大家来使用。这些开放源代码的SSL套件,就是OpenSSL。
在SSL协议实现的过程中,有一位开发者增加了一个扩充的功能,叫"心跳"(Heartbeat)。两台计算机联网通信时,经常需要判断对方是否还"活着",是否还有"心跳"。如果对方死机或关机了,就不能进行下一步的通信。"心跳"功能,就是定时地发送一条信息给对方,判断对方计算机是否有响应。如果对方计算机将信息原样发回,就说明它还有"心跳"。如果对方没有响应,我们就会切断通信,以免浪费资源。
但是,这个扩充的功能在实现的时候出了一点问题。本来一方(例如用户)发出信息,会要求对方(例如服务器)将信息原样返回,这样,用户就知道服务器是在响应自己。但是在用程序实现"心跳"功能时,却在无意中留下了一个安全漏洞。当用户发送这条信息给服务器时,没有要求服务器回复相同长度的信息,而是让服务器每次都回复64k的信息。这64k的信息虽然包含着原信息,但比原信息要长。例如原信息也许只有1k字节,返回的信息却有64k字节。也就是说,服务器除了发回证明自己还有"心跳"的1k有效信息,还会多发送63k的多余信息给用户。
用户发过来的1k字节的信息是随机保存在服务器的内存中的,所以服务器发回响应信息时,除了提取自己内存中的1k字节原信息,还会将内存中这1k字节信息后面的63k信息提取出来,凑够64k,发回给用户。这样,用户不但得到了服务器发回的正常"心跳"响应,同时还得到了服务器的内存中的其他信息。
问题就出在这些多余的信息中,因为这些多余的信息中可能包含着其他用户在服务器的内存中保留的重要信息,例如账号口令等。如果用户要利用这个安全漏洞,就可以不断地向服务器发送"心跳"验证信息。由于每次发送的信息都会随机保存在服务器的内存中的不同位置,这样服务器就会将自己内存中不同位置的信息不断地发回给用户。把这些信息拼凑起来,就可能完整地得到其他用户的私密信息。这个出问题的扩展功能叫做"心跳",所以这个可能泄露用户重要信息的安全漏洞就被称为"心脏出血"。
科学世界:也就是说开发者虽然实现了验证"心跳"的功能,但是没有考虑到会有人来利用这些多余的信息。
林东岱:是的。通常开发者会专注于实现功能,而不容易想到有人会来利用这些多余的信息。现在我们已经知道,是一位德国的开发者为了优化程序、提高效率增加了这个扩充功能。这个功能增加后,由一位芬兰的专家进行了检查,但也没有注意到这个漏洞。不过,并没有人去追究他们的责任,因为他们也不是有意为之。他们的工作都是义务的,而且这些源代码也都是在网上公开的。
附件: