openssl硬件引擎加解密漏洞

2011-03-14 06:44赵春平凌志祥
网络安全技术与应用 2011年3期
关键词:加解密明文服务端

赵春平 凌志祥

江南计算技术研究所 江苏 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.

猜你喜欢
加解密明文服务端
新时期《移动Web服务端开发》课程教学改革的研究
奇怪的处罚
在Windows Server 2008上创建应用
PDF中隐私数据的保护方法
电子取证中常见数据加解密理论与方法研究
奇怪的处罚
四部委明文反对垃圾焚烧低价竞争
网络数据传输的加解密系统研究
摸清黑客套路防范木马侵入