文/Jing Tian
CertShim:利用动态链接巩固SSL证书验证
文/Jing Tian
最近发现的一系列SSL软件栈(OpenSSL/ GnuTLS)的漏洞严重威胁到互联网通信的安全。其中最为显著的漏洞是客户端无法正确地验证服务器端的SSL证书。这些漏洞或者是库函数实现本身的问题,或者是由软件工程师的错误应用而造成的[1]。虽然各种安全补丁和方案被提出来解决这个问题,实际的安装和应用却差强人意。用户或者需要彻底替换现有的库函数实现,或者需要等待第三方的软件提供商来增强现有的应用版本来应对潜在的攻击。
本文提出一种新的解决方案——CertShim,来针对如何正确的验证服务器端的SSL证书。CertShim的优势在于用户不需要替换现有的库函数实现,或者升级现有的应用, 即可随时纠正现有软件栈漏洞。
CertShim的基本思想是利用软件库的动态链接来随时改变核心函数的行为,从而实现根据最新的安全分析来随时更新本地实现而不需要改变上层应用。如图1所示,CertShim位于SSL库函数和SSL应用中间,相当于一个中间层。所有SSL应用对SSL库函数的实现都会先经过CertShim。
作为一个中间层,CertShim主要起到以下三个作用:
一是纠正应用层对SSL实现层的错误调用,例如通过改变应用函数调用的参数来确定最基本的安全检查被开启而不是被关闭。
二是提供其他安全认证策略和方案。例如,用户可以根据不同的应用来设置不同的安全策略和方案。CertShim既支持Covergence[2],也支持DANE[3]。
三是支持库函数的动态补丁。例如,用户可以添加自定义的主机名验证来增强原函数功能。
目前版本的CertShim主要实现了以下库函数调用的hook:
除了C/C++常用的libssl、libgnutls,CertShim也提供对JDK6/7的支持。从SSL库函数实现看,CertShim涵盖了OpenSSL,GnuTLS和JSSE。从数据传输库函数实现看,CertShim也涵盖了对其他语言的支持,其中包括cURL、urllib、urllib2、httplib和python ssl等。从应用程序看,CertShim支持Ubuntu常用软件中的的95%。后续版本除了会涵盖其他SSL库函数实现,也会添加对JDK8的支持。
(作者单位为University of Florida)
图1
[1] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, D., and Shmatikov, V. The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software. In Proceedings of the 2012 ACM conference on Computer and communications security (Raleigh, NC, USA, 2012), CCS ’12, ACM, pp. 38-49
[2] http://convergence.io/
[3] https://datatracker.ietf.org/wg/dane/documents/
[4] 详细实现和论证,请参阅发表论文:https:// github.com/daveti/daveti/raw/master/paper/ccs14/ccs14a.pdf