文/Jing Tian
CertShim:利用動態(tài)鏈接鞏固SSL證書驗證
文/Jing Tian
最近發(fā)現(xiàn)的一系列SSL軟件棧(OpenSSL/ GnuTLS)的漏洞嚴重威脅到互聯(lián)網(wǎng)通信的安全。其中最為顯著的漏洞是客戶端無法正確地驗證服務(wù)器端的SSL證書。這些漏洞或者是庫函數(shù)實現(xiàn)本身的問題,或者是由軟件工程師的錯誤應(yīng)用而造成的[1]。雖然各種安全補丁和方案被提出來解決這個問題,實際的安裝和應(yīng)用卻差強人意。用戶或者需要徹底替換現(xiàn)有的庫函數(shù)實現(xiàn),或者需要等待第三方的軟件提供商來增強現(xiàn)有的應(yīng)用版本來應(yīng)對潛在的攻擊。
本文提出一種新的解決方案——CertShim,來針對如何正確的驗證服務(wù)器端的SSL證書。CertShim的優(yōu)勢在于用戶不需要替換現(xiàn)有的庫函數(shù)實現(xiàn),或者升級現(xiàn)有的應(yīng)用, 即可隨時糾正現(xiàn)有軟件棧漏洞。
CertShim的基本思想是利用軟件庫的動態(tài)鏈接來隨時改變核心函數(shù)的行為,從而實現(xiàn)根據(jù)最新的安全分析來隨時更新本地實現(xiàn)而不需要改變上層應(yīng)用。如圖1所示,CertShim位于SSL庫函數(shù)和SSL應(yīng)用中間,相當于一個中間層。所有SSL應(yīng)用對SSL庫函數(shù)的實現(xiàn)都會先經(jīng)過CertShim。
作為一個中間層,CertShim主要起到以下三個作用:
一是糾正應(yīng)用層對SSL實現(xiàn)層的錯誤調(diào)用,例如通過改變應(yīng)用函數(shù)調(diào)用的參數(shù)來確定最基本的安全檢查被開啟而不是被關(guān)閉。
二是提供其他安全認證策略和方案。例如,用戶可以根據(jù)不同的應(yīng)用來設(shè)置不同的安全策略和方案。CertShim既支持Covergence[2],也支持DANE[3]。
三是支持庫函數(shù)的動態(tài)補丁。例如,用戶可以添加自定義的主機名驗證來增強原函數(shù)功能。
目前版本的CertShim主要實現(xiàn)了以下庫函數(shù)調(diào)用的hook:
除了C/C++常用的libssl、libgnutls,CertShim也提供對JDK6/7的支持。從SSL庫函數(shù)實現(xiàn)看,CertShim涵蓋了OpenSSL,GnuTLS和JSSE。從數(shù)據(jù)傳輸庫函數(shù)實現(xiàn)看,CertShim也涵蓋了對其他語言的支持,其中包括cURL、urllib、urllib2、httplib和python ssl等。從應(yīng)用程序看,CertShim支持Ubuntu常用軟件中的的95%。后續(xù)版本除了會涵蓋其他SSL庫函數(shù)實現(xiàn),也會添加對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] 詳細實現(xiàn)和論證,請參閱發(fā)表論文:https:// github.com/daveti/daveti/raw/master/paper/ccs14/ccs14a.pdf