[关闭]
@EricaHe 2015-08-26T05:22:48.000000Z 字数 2716 阅读 791

The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software(Simplified ver.)

论文笔记 SSL


作者:Martin Georgiev,Subodh Iyengar,Suman Jana,Rishita Anubhai,Dan Boneh,Vitaly Shmatikov

单位:The University of Texas ​at Austin,Stanford University


​Abstract & Introduction

在许多要求高安全性的应用和库中,SSL都没能被很好的实施,使得其安全性下降,这之中的根本原因在于一些SSL的API设计非常糟糕,给了程序员许多令人困惑的设置和选项,从而使得程序员对许多参数、选项、返回值等等该如何设置产生了误解。论文主要研究了在一些无浏览器的软件中SSL的使用情况,并重点关注了客户端对服务器端的认证,对各类库错误使用SSL的情况进行了具体地列举,在最后也给出了一些意见与建议。


Overview of SSL

1. 威胁模型

一个活跃的中间人攻击者

2. SSL证书认证

本文主要考虑以下2个方面:


SSL Abstractions

1. SSL Libraries

OpenSSL

JSSE

JSSE中有一个底层的API叫SSLSocketFactory,它会根据SSL客户端设定的不同而采用不同方式来进行主机名验证。
在这个API中有一个函数叫checkIdentity,是用来进行主机名验证的,该函数会通过参数algorithm,来决定采用HTTPS还是LDAP进行操作,如果参数algorithm为NULL或为空,则跳过该步骤,并且不产生任何的提示。
于是这就产生了一个问题,尽管在HttpsClient和HttpsURLConnection在创建SSL客户端时会要求调用SetHostnameVerification来设定algorithm参数,一些应用软件通过原始的SSLSocketFactory函数来创建SSL客户端时,algorithm参数默认是NULL,于是主机名验证就被静默跳过了,而这一点却没有在API的文档中提出,只在JSSE reference guide的中一个不起眼的位置看到关于这一点的提醒。

2. Data-transporter libraries

Apache HttpClient

Weberknecht

cURL

PHP

Python


Experimental Testbed

  1. 一个自签名的证书,common name与host和client尝试传输的相同
  2. 一个自签名的证书,但common name是不正确的
  3. 一个合法的证书,由一个被信任的CA颁发给一个叫AllYourSSLAreBelongTo.us的域名

如果使用以上任何一个证书,能够与客户端成功建立起SSL连接,则需要进一步的分析与调查。


对于实验结果而言,基本可分为以下几类


Suggestion

For application developers

For SSL library developers


Conclusion

  1. 论文证明了许多标准SSL库经常错误地实现SSL证书认证,甚至根本没有认证,这些错误被许多对安全有着极高要求的应用和软件所继承,使得这些应用或软件无法抵御中间人攻击

  2. 论文也对如何更加安全地在非浏览器的软件中使用SSL连接提出了一些建议:如1)进行更完善的黑盒测试和代码分析;2)设计更加严谨的认证技术和代码语言,从而使得自动检查SSL使用的正确性得到实现,并且减少对于一些重要参数和设置的误读;3)为SSL和其他网络安全协议设计更好的API。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注