CBC 是使用於 block cipher 演算法的一種模式,block cipher 包括常見的 3DES 或 AES 這些加密演算法,block 的意思就是它們的輸入是固定長度,例如 128 bits 或 256 bits,然後輸出長度和輸入長度一樣,有點像是一塊固定大小的東西進來,然後一塊固定大小的東西出去,進來的是欲加密的明文,出去的是加完密的密文。這就是 block cipher。
所以你可以想見,假如原來的明文很長,有可能會出現兩個以上重複的 block,這樣一來加密的結果也會重複,所以從加密的結果,可以推測出明文的部份資訊。這種加密模式稱為 Electronic Code Book (ECB) 模式。
CBC 模式就是把前一塊密文 C0 和這一塊要加密的明文 P1 先 XOR,然後再去加密,所以它可以看作以下函式:
C1 = Encrypt(Key, C0 ⊕ P1)
依此類推,C2 = Encrypt(Key, C1 ⊕ P2)。
而一開始的 C0 因為沒有東西可以跟它 XOR,所以演算法會產生一組 Initialization Vector (IV),長度與 block 一致,然後 C0 = Encrypt(Key, IV ⊕ P0)。
這就是 CBC 模式。因此你可以想像,透過 CBC 模式,即使明文中有兩處一模一樣的 block,加密完後它們也會長得不同。每份明文都會有一個 IV,然後透過 CBC 一直串下去,產生出一整份的密文。對 HTTP 來說,關鍵在於怎樣算是「一份明文」呢?因為 HTTP 協定是 stateless 的協定,也就是每次 client 送一個 request,server 回應一個 response。SSL/TLS 的規格中因此定義了 Record 的概念,把應用軟體所丟出來的資料切割成一個又一個的 Record,在表頭定義 Record 的長度,然後每一個 Record 就看作一份明文。使用 CBC 的方始有兩種可能:
1. 每一個 Record 都是獨立的,一個 Record 就產生一個新的 IV。
2. 全部的 Record 都使用同一個 IV,不斷地從前面 Record 累積下來的密文串接下去。
而有問題的 SSL/TLS 版本,就是使用以上的第二種方式。嘿嘿,所以只要攻擊者可以取得 Ci-1 和 Ci,就有辦法可以推測出 Pi,只是這辦法相當難,它是這樣運作的:
假設攻擊者可以作到下面兩件事:
1. 偷看每一個 C。這不難作到,例如透過 sniffer 就可以。
2. 操控 client 傳送出某些特製的資料。這難,而 BEAST 就是在這方面努力。要操控 HTTP 沒想像中困難,例如只要透過一個 <img src="..."> 就可以控制 client 送出某些你安排好的 request,但是要很有彈性的操控,例如指定要 client 送出某些 bytes 就沒那麼容易,透過 applet 或是 wesocket 可以作到 。但是麻煩是 Same Origin Policy (SOP) 讓 client 端的 applet 或是 websocket 都只能夠在同一個網站下執行,除非被跨的那個網站有特別允許。
假設我們可以作到以上兩件事,模擬情況是我們已經觀測到 Ci-1 和 Ci 這兩組密文,但是我們不知道 Pi-1 或 Pi,現在我們的目標是求得 Pi,所以我們先窮舉一個 P,並假設它等於 Pi。
再來,我們操控 client 傳送出 Ci ⊕ Ci-1 ⊕ P 的資料,當 SSL/TLS 加密這塊資料時,就會變成以下:
Ci+1 = Encrypt(Key, Ci ⊕ (Ci ⊕ Ci-1 ⊕ P)) = Encrypt(Key, Ci-1 ⊕ P)
如果我們窮舉出的那個 P 真的等於 Pi 的話,那麼 Ci+1 就會等於 Ci。反過來說,我們只要觀察 Ci+1 是否等於 Ci,就可以知道我們窮舉出的 P 是否正確。只要透過不斷地窮舉,我們就可以找出真正的 Pi。
因此,這個攻擊法並不是找出 SSL/TLS 的金鑰,而是解密出其中某塊明文。
BEAST 手法搭配控制 Record 的長度,來讓窮舉的過程更快速。它只要設計讓 Record 的最後一個 byte 是想要窮舉的字元,然後每次只要針對最後一個 byte 來窮舉,找到對的最後一個 byte,再平移下一個 byte,最後找出所有要找的字串。
這個方法可以找出 cookie,因此可以得到 session key。
BEAST 手法還需要突破 SOP 限制,發明人所公佈的影片就是透過一個 Java (JVM) 的 0-day 來突破 Java Applet 的 SOP 限制。
這就是 BEAST 以及它的原理。
在 TLS 1.1 以後將此問題修正了。可是,嘿嘿,攻擊者可以透過一個 TCP FIN 來給你個 downgrade attack,讓 client 改用 TLS 1.0,請參考這裡。
所以較安全的方式還是 TLS 1.2。
沒有留言:
張貼留言