填充預言機攻擊如何工作?
我不確定填充 oracle 攻擊是如何工作的。
我沒有得到的是如何一次更改一位允許一個人利用(獲取密鑰)ASP.NET 機器。
誰能解釋一下?
定義/介紹
我們定義(這僅用於我們的範例):
- $ enc() $ 和 $ dec() $ 作為使用CBC模式的加密和解密函式,具有恆定密鑰。任何分組密碼都可以
- $ \oplus $ 是異或運算。
- $ n $ 純文字塊的數量。
- 一個塊的字節長度是 $ 16 $ (即 128 位)。
- $ m_1 $ 通過 $ m_n $ 純文字塊。
- $ c_0 $ 通過 $ c_n $ 密文塊,而
- $ c_0 $ 是初始化向量(即我們這裡還有一個塊!)。
- 對於每個塊,第二個索引指向字節,即 $ m_{1,0} $ 是我們純文字的第一個字節。
- $ x_1 $ 通過 $ x_n $ 是中間解密值,之後 $ dec() $ 在異或之前。
- 單個等號 $ = $ 用於賦值,雙等號 $ == $ 進行比較。
解釋什麼 $ x $ 意思是,這裡又是CBC解密公式。對於每個加密塊 $ c_i $ ,我們確定 $ m_i $ 經過:
$ m_i $ = $ x_{i} \oplus c_{i-1} $ ,(和值 $ dec(c_0) $ 也被命名為 $ x_0 $ )
對於第一個塊,我們使用 IV 如下:
$ m_0 $ = $ dec(c_0) \oplus iv $
我建議快速瀏覽這些圖像以進行解密和加密(閱讀整個Wikipedia 文章也不會受到傷害)。
設想
對於這種攻擊,我們需要一個所謂的填充預言機,例如一個 Web 應用程序。這個填充預言機接受任意密文,並給出關於純文字是否無效或解密失敗的不同消息。
讓我們想像一下這個填充:
對於所有純文字,最後一個塊被填充到 16 個字節的長度,如下所示,
the end.\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x08
. 如果最後一個塊是 15 字節長,則填充是簡單的\x01
. 如果最後一個塊是 16 字節長,即如果消息的長度是 16 的倍數,\x10
則附加一個由 15 個任意值組成的塊。這意味著,最後一個塊總是用 0 到 15\xFF
個字節填充,直到最後一個,這給出了我們填充的長度。解密後,現在可以讀取最後一個字節並在最後切斷給定數量的字節。等於 0 且大於 16 的值無效並返回填充錯誤。
我們將 Oracle 定義如下:
$$ O(c) = \left{ \begin{array}{l l} 0 & \quad \text{if $c$ has a valid padding and }\ & \quad \text{decryption yields a well-formed plain text} \ 1 & \quad \text{if the padding was valid, but the plain text}\ & \quad \text{was not well-formed (contained \xFF)} \ 2 & \quad \text{if $c$ has an invalid padding}\ \end{array} \right. $$
Web 應用程序期望純文字為 XML(或 JSON 或其他),並在解析失敗時報告不同的錯誤。對於我們的簡化場景,假設存在純文字(刪除填充後)不能包含的邪惡字元,例如
\xFF
攻擊
要使這種攻擊起作用,您需要一個有效的密文 $ c $ ,不需要知道正確的明文值 $ m $ .
我們將開始逐塊、逐字節地解密。我們從第一個塊開始,它是最後一個字節。
讓我們取前兩個密文塊 $ c_0c_1 $ ,並將它們發送到預言機。自從 $ c_0 $ 只是 IV,oracle 獲得了純文字的第一個塊(16 個字節)。現在,這取決於值,但填充很可能是錯誤的,所以你會得到一個填充錯誤。
現在通過 XORing 值 $ j $ 從你
\x00
的\xFF
最後一個字節 $ c_0c_1 $ 塊,您將獲得總共 256 個不同的結果。這些結果,我們稱之為 $ \tilde{C}_j $ , 用所有可能值中的最後一個字節組成密文,雖然\x00
是\xFF
隨機分佈的。將它們全部發送到預言機將產生 16 個 $ O(\tilde{C}_j) < 2 $ . 這意味著,最後一個字節解密為有效字節,如\x01 through \x10
. 在這 16 個值中 $ j $ ,一個必須對應明文字節\x10
。按位比較將幫助您注意到,它們都具有相同的第五位(從右數,最右邊是 1),除了一位。異常結果對應於0x10
。讓我們記住這個 $ j $ -值作為 $ s $ .無論價值 $ s $ 有,我們可以用 XOR 它
\x11
,然後得到純文字\x01
。我們現在有一個帶有有效\x01
填充的塊。(哦,順便說一句。 $ s \oplus j $ 是最後一個純文字字節 $ c_1 $ )現在我們有了一個帶有有效 \x01 填充的塊,我們還有 15 個字節要查找。我們知道,只要我們
\xFF
在純文字中有一個無效字節,Web 應用程序就會停止並說出來。所以現在,我們可以遍歷每個字節並找到如下純文字:讓 $ c $ 成為目前塊並且 $ p $ 純文字
結果 $ i $ 從 1 到 8(塊中的每個字節):
$ \quad $ 為了 $ j $ 從 0 到 255(所有 ascii 值):
$ \quad $ $ \quad $ $ \hat{c}_{i,j} = c_0c_1…(c_i \oplus j)…c_n $
$ \quad $ $ \quad $ 如果 $ O(\hat{c}_{i,j}) == 1 $ :
$ \quad $ $ \quad $ $ \quad $ $ p_i = j \oplus 0xFF $
對塊對重複此過程 $ c_1c_2 $ , $ c_2c_3 $ , …
免責聲明
這是一個簡化的例子,我試圖強調所有的簡化。我絕不是加密專家,我的知識有限。如果您發現任何未提及的簡化或明顯錯誤,請發表評論/編輯 :) 我強烈建議您閱讀此部落格中對 XML 加密填充 oracle 的良好解釋。關於攻擊的論文也很不錯:Breaking XML Encryption
TODO:這篇文章沒有很好地解釋為什麼 CBC 方案具有延展性,我不介意是否有一個好的圖表可以包含在內。
所有詳細資訊均已在 2011 年 IEEE 安全和隱私研討會的論文中發表:Web 中的密碼學:ASP.NET 中的密碼學設計缺陷案例