在 2012 的 CRIME 之後,2013 年另一組人馬發表了另一種對 SSL/TLS 的攻擊手法,承襲奇特的字組合成有意義的縮寫名稱的命名風格,這次的攻擊手法名為 BREACH (Browser Reconnaissance & Exfiltration via Adaptive Compression of Hypertext)。
這種攻擊手法架構上與 CRIME 接近,另外也同樣假設攻擊者可以作到以下兩項前提:
1. 監聽密文。
2. 操弄使用者送出某種 HTTP request。
BREACH 不像 BEAST 需要操弄到很有彈性的 request data,只要能夠送出一般的 HTTP request 即可,也就是 ASCII 字元即可。這一點和 CRIME 一致。請參考本站對 CRIME 的介紹,以及對 BEAST 的介紹。
與 CRIME 不同的地方是,BREACH 是透過觀察 server response 來達到攻擊目的。 它有以下三項前提:
1. Server 使用 HTTP 壓縮。注意,這和 SSL/TLS 壓縮不同,HTTP 壓縮至今 (2014/6) 仍非常常見,而 SSL/TLS 壓縮在今日幾乎無人使用了。
2. Server 會將 client request 中的部份資料反映在 response 裡。
3. Server response 中含有重要的資料。
舉例如下:
Client 送出資料如下,其中 canary 的值是攻擊者想要取得的重要資料,例如假設它是 session key,而攻擊者一開始不知道,所以操弄 Client 送出 <guess>:
GET /owa/?ae=Item&t=IPM.Note&a=New&id=canary=<guess>
Server 送回的 response 資料如下,包含了我們送出的 <guess> 字串,以及正確的 canary 的值:
(...)
<span id=requestUrl>https://malbot.net:443/owa/forms/
basic/BasicEditMessage.aspx?ae=Item&t=IPM.Note&
amp;a=New&id=canary=<guess></span>
(...)
<td nowrap id="tdErrLgf"><a href="logoff.owa?
canary=d634cda866f14c73ac135ae858c0d894">Log
Off</a></td>
(...)
(...) 是省略的部份,另外我也稍微斷了行,讓字串看起來不會太長,比較好讀一點(希望)。
如果你已經理解 CRIME,或者先看過我們對於 CRIME 的介紹了,看到以上的例子,可能就會有點感覺,或者大概猜到接下來攻擊者會怎麼做。
攻擊者觀察 server 送回來的 response,觀察其長度,定為 L1。然後攻擊者窮舉 <guess>,一次一個位元組,先從第一個位元組開始。窮舉過程中,嘗試找出最短 L1,因為壓縮的原則,只要重複字串就會產生比較高的壓縮率,因此長度會較短。找出第一個字元後,再改變第二個字元,依此類推,直到找全全部的字元為止。
實際運作上,<guess> 的初始字串可能是 0{} 或 {}0,這是基於假設 { 或者 } 符號不會出現在 canary 的值裡面,所以被拿來當作 padding。將 0 放至於 padding 前與後兩種情況是為了對付 Huffman coding。對 {} 符號的假設意味著攻擊者需要針對攻擊對象有一些事前調查,例如知道字符名稱、長度,或可能字元等等資訊。
實作方法可以參考作者網站,這裡有一段作者提供的簡短 Youtube 影片。Github 上有人提供實作版本。
以上就是我們對於 BREACH 原理的介紹。BREACH 與 SSL/TLS 版本無關,與金鑰長度也無關,實際上與 SSL/TLS 本身皆無關,只要符合以上所說的假設前提,即有可能破解 SSL/TLS 加密保護的資料,進而作到 session hijacking,或是取得重要資料。因為BEAST 需要突破 SOP,這除非搭配瀏覽器或者 Java VM 的漏洞才可。而 CRIME 需要使用 SSL/TLS 壓縮協定,現今已經相當罕見,這種情形發生的同時,瀏覽器可能也舊到會有許多更容易攻擊的弱點。因此,BREACH 比之 BEAST 和 CRIME 而言,是三者之中最可能運用在實際環境的攻擊手法。
防範方式就是避免以上所說的假設前提發生,說來簡單,但最好作法就是事前的避免。
沒有留言:
張貼留言