版權聲明:原創做品,如需轉載,請與做者聯繫。不然將追究法律責任。
html
學習聯繫QQ:166080910九、166181515三、2813150558nginx
馬哥Linux運維 更多資訊:www.magedu.com算法
一聲驚雷,今天爆出了一個關於SSL協議的驚天大漏洞,在用完各類poc工具後,咱們不妨來深刻了解下這個高危漏洞的機理。apache
無論你是用網上公佈的檢測網站仍是各個QQ羣瘋傳的poc 腳本,知其然還要知其因此然,讓咱們知道漏洞造成的條件,以及漏洞產生的原理,如何修復這個驚天大漏洞。安全
這一次,騰訊的個別站點也沒有幸免,果斷是坑爹啊。點評ssl服務沒有開啓TLS heartbeat擴展,因此避過一劫,固然任什麼時候候都不能說咱們能夠高枕無憂了,時刻得關注各類漏洞的發佈與修復。服務器
首先咱們看一下某個有問題站點的SSL信息,當咱們用openssl 以客戶端模式鏈接對應網站的443端口的時候,會獲取到對應服務器ssl協議中與TLS擴展相關的信息。網絡
[root@king tests]# /usr/bin/openssl s_client -connect mail.xxx.com:443 -tlsextdebug 2>&1| grep 'TLS' session
TLS server extension "renegotiation info" (id=65281), len=1併發
TLS server extension "session ticket" (id=35), len=0運維
TLS server extension "heartbeat" (id=15), len=1
咱們看到該站點開啓了heartbeat的TLS擴展,而形成本次漏洞問題的根源就是OpenSSL對他的實現。
什麼是SSL協議?
什麼是openssl?
ssl和open ssl有什麼關係?
TLS是什麼?
形成此次漏洞的TLS服務擴展"heartbeat"又是什麼?
當這麼多的疑問迎面而來,咱們仍是見招拆招,逐一瞭解:
SSL是Secure Socket Layer(安全套接層協議)的縮寫,能夠在Internet上提供加密性傳輸通道。
SSL協議保證兩個應用間通訊的保密性和可靠性,可在服務器端和用戶端同時實現支持。使用戶/服務器應用之間的通訊不被攻擊者竊聽,而且始終對服務器進行認證還可選擇對用戶進行認證。
ssl體系結構:
看圖能夠知道,SSL協議是創建在TCP協議上的,咱們知道TCP較UDP協議是可靠地傳輸協議,能夠保證整個傳輸過程數據的完整性。
ssl協議時一套理論,最後要應用到實際的生活中,還得靠具體的人編寫程序來實現。實現一個算法或者說協議是很是龐大艱鉅的工程,這個時候就有兩個大牛開始編寫後來具備巨大影響的OpenSSL軟件包,而後開源出來,後人不斷完善,最後OpenSSL項目組來接手繼續完善。
OpenSSL: The Open Source toolkit for SSL/TLS
OpenSSL是互聯網上最流行的開源密碼庫和TLS實現,不只是諸多Linux和BSD版本操做系統的默認安全通訊機制,也是Apache和nginx等Web服務器的加密引擎。
OpenSSL提供的功能至關強大和全面,囊括了主要的密碼算法、經常使用的密鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程序供測試或其它目的使用。
隨着科學技術和網絡規模的發展,SSL協議經歷了,SSL 1.0 ,SSL2.0、SSL3.0以及TLS1.0等演變,OpenSSL軟件包也是在不斷更新升級,從而支持實現SSL協議的升級版本。
SSL是理論協議,OpenSSL是對其的具體實現。這就跟http協議和apache httpd的關係差很少。
TLS是什麼?
TLS:安全傳輸層協議
(TLS:Transport Layer Security Protocol)
安全傳輸層協議(TLS)用於在兩個通訊應用程序之間提供保密性和數據完整性。該協議由兩層組成: TLS 記錄協議(TLS Record)和 TLS 握手協議(TLS Handshake)。
初看標準定義,感受TLS和SSL貌似沒有什麼區別啊.
是,你能夠理解TLS協議時SSL協議的加強版本。
最新版本的TLS(Transport Layer Security,傳輸層安全協議)是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協議,它創建在SSL 3.0協議規範之上,是SSL 3.0的後續版本。在TLS與SSL3.0之間存在着顯著的差異,主要是它們所支持的加密算法不一樣,因此TLS與SSL3.0不能互操做。
1.TLS與SSL的差別
1)版本號:TLS記錄格式與SSL記錄格式相同,但版本號的值不一樣,TLS的版本1.0使用的版本號爲SSLv3.1。
2)報文鑑別碼:SSLv3.0和TLS的MAC算法及MAC計算的範圍不一樣。TLS使用了RFC-2104定義的HMAC算法。SSLv3.0使用了類似的算法,二者差異在於SSLv3.0中,填充字節與密鑰之間採用的是鏈接運算,而HMAC算法採用的是異或運算。可是二者的安全程度是相同的。
3)僞隨機函數:TLS使用了稱爲PRF的僞隨機函數來將密鑰擴展成數據塊,是更安全的方式。
4)報警代碼:TLS支持幾乎全部的SSLv3.0報警代碼,並且TLS還補充定義了不少報警代碼,如解密失敗(decryption_failed)、記錄溢出(record_overflow)、未知CA(unknown_ca)、拒絕訪問(access_denied)等。
5)密文族和客戶證書:SSLv3.0和TLS存在少許差異,即TLS不支持Fortezza密鑰交換、加密算法和客戶證書。
6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息計算MD5和SHA-1散列碼時,計算的輸入有少量差異,但安全性至關。
7)加密計算:TLS與SSLv3.0在計算主密值(master secret)時採用的方式不一樣。
8)填充:用戶數據加密以前須要增長的填充字節。在SSL中,填充後的數據長度要達到密文塊長度的最小整數倍。而在TLS中,填充後的數據長度能夠是密文塊長度的任意整數倍(但填充的最大長度爲255字節),這種方式能夠防止基於對報文長度進行分析的攻擊。
形成此次漏洞的TLS服務擴展「heartbeat」又是什麼?
The Heartbeat Extension provides a new protocol for TLS/DTLS allowing the usage of keep-alive functionality without performing a renegotiation and a basis for path MTU (PMTU) discovery for DTLS.
TLS心跳擴展爲TLS/DTLS提供了一種容許在不從新進行商議和發送路徑MTU探索包(PMTU)的狀況下而使用保持持續通訊功能的新協議。
A missing bounds check in the handling of the TLS heartbeat extension can be
used to reveal up to 64k of memory to a connected client or server.
漏洞出在OpenSSL對TLS的心跳擴展(RFC6520)的實現代碼中,因爲漏了一處邊界檢查,可能在每次心跳中暴露客戶端與服務器通訊中的64K內存。
網上提供的漏洞細節,看不懂可有忽略,反正我沒有徹底看懂,原理機制明白了就ok了。
Hacker News網友drv在閱讀了漏洞代碼後指出,這是一個低級錯誤。他解釋說:
TLS心跳由一個請求包組成,其中包括有效載荷(payload),通訊的另外一方將讀取這個包併發送一個響應,其中包含一樣的載荷。在處理心跳請求的代碼中,載荷大小是從攻擊者可能控制的包中讀取的:
n2s(p, payload);
pl = p;
這裏p是指向請求包的指針,payload是載荷的指望長度(16位短整數,也就是每次請求64K)。pl指針指向實際的載荷。
而後響應包是這樣構造的:
/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);
載荷長度保存在目標包裏,而後從源包pl將載荷複製到目標包bp。
bug出在載荷長度沒有根據請求包的大小進行檢查。所以,memcpy()發送任意載荷長度(最大64K)加上一個小載荷,就能讀取請求存儲位置以外的任意數據。
下面爲演示圖:
此次漏洞只是影響到了https服務嗎?固然不是了,全部開啓了「heartbeat」 TLS擴展的SSL協議中封裝的其餘協議(http,ftp,ssh,smtp等協議)都至關因而明文傳輸了。
面對這次OpenSSL漏洞問題如何處理?
官方說了,升級到 OpenSSL 1.0.1g 版本。
除此以外,還能夠在邊界設備上作一些行爲攔截,以及對「heartbeat」擴展作處理(從新編譯openssl,添加 -DOPENSSL_NO_HEARTBEATS 參數便可)。
官方漏洞信息:
http://www.openssl.org/news/secadv_20140407.txt
https://tools.ietf.org/html/rfc6520
咱們只是科普,更專業更詳細的漏洞細節信息,感興趣的同窗請自行google。
倉促間從文,不免有紕漏和錯誤之處,歡迎指正。
本文原創做者爲大衆點評高級運維工程師:劉羣英 轉載請註明出處!
本文出自 「馬哥教育Linux」 博客,請務必保留此出處http://my.oschina.net/u/2456754/admin/edit-blog?blog=505638
學習聯繫QQ:166080910九、166181515三、2813150558
馬哥Linux運維 更多資訊:www.magedu.com