openssl硬件引擎加解密漏洞
2011-03-14赵春平凌志祥
赵春平 凌志祥
江南计算技术研究所 江苏 214083
0 引言
openssl是一个开源的SSL协议实现,它采用C语言作为开发语言,因此 openssl具有优秀的跨平台性能,并被广泛使用。openssl支持Linux、Windows、BSD、Mac、VMS等平台,这使得openssl具有广泛的适用性。openssl目前最新的版本是1.0.0d。 有很多系统都是用openssl来构建安全的通信,比如apache的httpd中的ssl模块、openldap等优秀的开源软件。
openssl主要由三部分组成:crypto库、ssl库以及openssl命令。其中crypto库中实现了大量的对称算法、非对称算法和摘要算法,并且这些算法都支持硬件引擎。
1 openssl硬件引擎
openssl是一个自包含的软件,它不依赖于第三方库,它实现了各种软算法。为了支持硬件以提高性能,openssl通过引擎机制来支持硬件算法。当用户调用上层的对称加解密函数时,如何没有注册对应算法的引擎,openssl使用默认的软算法;当用户注册了某个算法的硬件引擎时,openssl将会调用该硬件引擎的算法。下面简要介绍对称计算中,openssl如何使用硬件引擎。
openssl的对称计算主要crypto/evp/evp_enc.c中实现,调用接口和主要数据结构在evp.h中定义。对称计算主要有两个数据结构,如下所示:
对称计算调用接口主要有:
(1)对称计算初始化
(2)进行对称计算
(3)获取余下的对称计算结果
从接口可以看出,用户调用 openssl进行对称计算时,主要使用的数据结构为 EVP_CIPHER_CTX,该结构主要包括了对称算法信息以及硬件引擎。如果无硬件引擎,将使用软算法。openssl进行对称计算时,使用的是 EVP_CIPHER结构中的 do_cipher函数指针。硬件引擎的加载是在EVP_CipherInit_ex中完成的。在EVP_CipherInit_ex的实现中,如果指定了对称计算引擎,EVP_CIPHER_CTX中的cipher将指向硬件引擎所实现的 EVP_CIPHER,后续的update操作和final操作都将使用硬件引擎提供的函数。
do_cipher函数对数据进行对称计算,其参数主要有:输入缓冲区、输出缓冲区以及输入长度。输入缓冲区和输出缓冲区可以是不同的内存地址。该函数返回非0时表示成果,返回0表示对称计算失败。不过对于软算法,基本上不可能出现计算失败的情况,而如果用硬件来做对称计算,由于硬件以及硬件接口的原因,则有可能出现对称计算失败。
2 openssl硬件引擎加解密漏洞
在 openssl的各个 SSL协议版本实现中(包括当前的1.0.0d),无论在ssl握手阶段还是数据发送和接收阶段,对于数据的加解密运算都会调用函数EVP_Cipher进行运算(分别对应文件d1_enc.c、s2_enc.c、s3_enc.c和t1_enc.c)。s3_enc.c中调用方式如下:
该函数将对称计算直接调用了do_cipher。
在openssl运行时,该函数的输入缓冲区rec->data与输出缓冲区 rec->input指向相同的内存地址,并且不判断其返回值,由此会带来安全问题。
特定情况下,openssl采用硬件引擎进行ssl握手和通信时,当客户端和服务端因为某种硬件原因导致加解密失败时,由于它没有检查EVP_Cipher函数的返回值(硬件引擎加解密函数会有返回值,但上层并不判断),数据的传输将变成明文通信。即使仅仅因为一方硬件原因导致加密失败,当前发出的数据也将是明文。SSL通信一旦变成明文通信,用户将很难察觉。
此漏洞虽然被利用的概率较低,但一旦出现上面描述的特定情况,将会带来巨大的安全问题。
修补该漏洞很简单,仅仅判断返回值,如果出错立即终止SSL连接即可。
3 漏洞的验证
作者在两台 linux操作系统上对该漏洞进行了验证,为了便于抓包,其中一台装在虚拟机上。硬件引擎替换了RC4算法,并进行了加解密故障模拟,引擎名称为 TestEngine,openssl版本为1.0.0a。
在服务端运行命令:
./openssl s_server -CAfile demoCA/cacert.pem -ssl3 -cipher RC4-SHA -cert cert.pem -key key.pem -engine TestEngine
在客户端运行命令:
./openssl s_client -ssl3 -cipher RC4-SHA -host 192.168. 1.24 -cipher RC4-SHA -engine TestEngine
然后通过wireshark进行抓包,服务端中的Hello消息如图1所示。
图1 服务端中的Hello消息
服务Hello消息表明加密使用RC4算法。
发送的应用数据如2所示。
图2 发送的应用数据
图2中,传输的数据是明文。不仅仅传输的数据是明文,其他的握手数据也是明文。
[1] rfc2246,The TLS Protocol Version 1.0.2009.
[2] WDKDocs_12112009.chm, windows wdk.2009.