2014年7月1日 星期二

攻擊 SSL/TLS - CRIME

繼 2011 年的 BEAST 之後,2012 年同組人馬發表了另一種攻擊,叫做 CRIME (Compression Ratio Info-leak Made Easy),很奇怪的名字,不過作者說的算。

CRIME 架構上與 BEAST 類似,都屬於 Chosen-Plaintext Attack,也就是說攻擊者必須滿足兩項前提:
1. 要能夠竊聽密文。和 BEAST 情況一樣,這很容易,透過 sniffer 或類似手法即可。
2. 要能夠控制使用者所送出的 HTTP 請求。這和 BEAST 就有點差別,因為 BEAST 是利用 CBC 模式的問題(正確來說應該是 SSL/TLS 錯誤使用 CBC 模式的問題,並非 CBC 本身問題)來達成攻擊目的。所以送出的資料必須要能夠到任意位元組的彈性程度,因此一般來說,應該要搭配 applet 或是 websocket 完成,詳情請見本站文章。而 CRIME 大大改善這個彈性的需求。對 CRIME 攻擊手法而言,不再需要控制到這麼有彈性的 request data,只要一般的 HTTP request 即可,也就是常見的 ASCII 字元即可,例如 GET / POST 等等。

CRIME 就如同它名字所提到的,是透過壓縮 (compression) 來達到攻擊的目的,舉例如下:

假設原本有個 session cookie 其為 session=5c9597f3c82459,當使用者送出以下的 HTTP request:
GET / HTTP/1.1 (...) Cookie: session=5c9597f3c82459 (...)

(...) 代表省略,而且我也省略了 \r\n,反正你知道意思就好。

攻擊者觀察其透過 SSL/TLS 壓縮且加密後的長度,記為 L1。然後攻擊者讓使用者再送出同樣的 HTTP request,在後面加上 session=0,如下:
GET / HTTP/1.1 (...) Cookie: session=5c9597f3c82459 (...) session=0

經過壓縮加密後,長度記為 L2。透過 L1 和 L2 的比較,可以查出 0 究竟是否是正確的第一個字元。因為壓縮演算法偵測到 session= 這個字串,會發現其與前面重複,因此會將其壓縮,例如找一個符號代表它,而偵測到後面的 0 字元,則會獨自用一個符號代表它。這樣窮舉下去,當攻擊者窮舉到 session=5 的時候,整個 session=5 字串都會被壓縮演算法用一個符號代表,因此這個 L2 一定會比其他的 L2 要小。

以上前提是使用 stream cipher 的時候,因此可以明確判斷輸出長度。當使用 block cipher 的時候,攻擊者必須巧妙的搭配 padding 讓長度的差別可以突顯出來,例如 session=5 則在一個 block 內,其餘字串則會 padding 成兩個 blocks。

透過這種判斷長度的方式,攻擊者可以一次窮舉出一個位元組,然後一直到解出完整的 session cookie 為止。

這種手法有個前提:那就是 client/server 必須使用支援壓縮的 SSL/TLS,且 client 端瀏覽器必須送出希望使用 SSL/TLS 壓縮的請求。這與 HTTP 的壓縮功能不同,兩者勿混為一談。

在 TLS 1.2 之後,預設是不使用任何壓縮,因此這種攻擊手法對 1.2 也就無效。

不過 CRIME 給我們一些重要的啟發性:透過壓縮這類我們稱為 side-channel 的方式,加密演算法有可能會失效。side-channel 之稱是因為這類訊息是在我主要目的的溝通管道以外所傳遞出來的。這解釋有點爛,但是你應該可以揣摩。


以上就是 CRIME 的原理與例子,Github 上有人提供測試程式碼,以 python 寫成,不過測試中是使用 HTTP POST,也用了假的網址,而且流程也不是這樣執行的。基本上那個程式碼只是驗證概念而已,如果你懂得我以上所說的原理,你應該可以看懂該程式碼的意思。用 POST 應該會被 SOP (Same Origin Policy) 擋住。

沒有留言:

張貼留言