文/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