2014/04/15

OpenSSL的HeartBleed漏洞

最近OpenSSL的HeartBleed漏洞鬧得沸沸揚揚,讓很多使用者與開發者都心存恐懼。那到底什麼是HeartBleed漏洞?

從SSL/TLS的heartbeat機制講起
OpenSSL是SSL/TLS protocol的實作之一。目前這個漏洞也要從這個通信協定談起。詳細的內容大家可以參考wiki的文章,這裡不多做贅述。一般使用者最常使用到的應該就是其上層的https協定了。

當通訊的兩端建立起安全通道(secure channel)後,為保持此通道不會被結束,client端可以送heartbeat信號給server,而server則會回應給client。
如下圖,client會先送任意的內容及此內容的長度給server,server會再將此內容與長度回覆給client。這個內容的最大長度是64K bytes。



這種heartbeat機制是很常用的機制,很多協定或應用都會使用這樣的機制。但為什麼OpenSSL出了問題?

首先,OpenSSL只有1.0.1 ~ 1.0.1f這幾個版本有問題,之前的版本並沒有問題,之後的版本也修復了這問題。

其次,出問題是因為OpenSSL在實作上的問題,不是SSL/TLS通信協定的問題。
OpenSSL在實作上會開一個64K bytes的buffer space,供來自所有clients的通訊共用。當有來自client的heartbeat時,OpenSSL會將送來的內容寫到此buffer,再將符合長度的內容由此buffer回傳給client。
於是,這就產生了問題。如下圖,當有心的client送的內容只有5 bytes長,卻宣稱有25 bytes;OpenSSL server並沒有去查真正的內容是多少,完全信任client所宣稱的長度,所以會老老實實的送回25 bytes的資料給client。



我們可想想,如果client只送1-byte的內容,卻宣稱長度有64K bytes,則等於獲得了整個buffer的內容。再從這裡去過濾所得到的內容,或許就可以得到其他clients與server間的對話內容。(想想網路銀行、購物網站等等,他們不都是用https來傳送你的銀行帳號、信用卡號、識別碼...等等的機密或隱私資料嗎)

雖然對有心人來說,很難預測可以從這64K bytes中取得什麼資料,不過不斷地送heartbeat,再透過程式來自動過濾擷取到的資料,還是可以撈到不少有用的資料。

既然事情發生了,怎麼解決?
對server side的管理者來說,先看看有沒有使用OpenSSL,而且是1.0.1~1.0.1f這幾個版本。如果是,那就儘快換掉。
對client使用者來說,你也不知道那些server是用OpenSSL 1.0.1~1.0.1f這些版本。最好是跟相關網站確認他們有沒有這樣的漏洞以及該如何處理。如果資料已被拿走了,最好的方法可能就是把密碼、信用卡等等的趕快換了。

參考1
參考2


沒有留言: