# Padding Oracle Attack 拆文解字: * Padding: 利用 block encrypt 所需要的 padding 來攻擊演算法 * Oracle: 要透過一個 "oracle" 反饋來得知訊息(訊息 == 解密成功與否) * attack: ... padding oracle attack 是針對加密演算法的攻擊,在已知密文和 IV (initial vector) 的情況下對 IV 進行修改,並透過狀態來破解中間值 條件: * CBC 加密 * padding 屬於 PKCS#5 的填充方式 * 可得知且修改 IV 或密文 * 可得知狀態 文章可以參考[這篇](http://blog.zhaojie.me/2010/10/padding-oracle-attack-in-detail.html)和 原作者 的 [slide](http://netifera.com/research/) ## Padding 在 CBC 加密中,明文會被分成某個固定 bytes 的 block (大小由加密決定),明文通常不會剛好被整除,沒被整除的部分要由 padding 填上某些填充 byte * PKCS#5: * 一種填充標準 * 一定要存在 padding bytes: * 假設 8 bytes 為單位,就算剛好 8 bytes ,最後還會加上 8 個 padding bytes * 填充一個 byte 則填上 0x1 ,兩個則 0x2 0x2 ,三個 0x3 0x3 ......依此類推 * 換句話說解出來最後 byte 有 0x9 以上都是錯的啦 ## Scenario: 有一個網站會將 user 的 ID, password, 公司 id 以 CBC 方式加密傳輸,且每次的 IV 皆不相同 ex: ``` http://sampleapp/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 ``` UID 後的前 8 bytes 為 IV (7B216A634951170f),後面則是加密過的密文 那根據解密結果,會出現三種情況: 1. 根據 IV 和密文解密成功,回傳 200 2. 根據 IV 和密文解密成功,但比對失敗,回傳 200 3. 根據 IV 和密文解密失敗,回傳 505 失敗的意思即解密出來最後的 padding byte 不符合規則,第 2 條則是符合規則但出來的比對錯誤 ### Attack 1 首先 CBC 解密的過程中,會將密文跟上一塊的密文做 XOR 直到第一塊,第一塊的密文則是跟 IV 做 XOR 解出明文 1. 將 IV 修改成 0000000000000000: * 因為透過 url 傳遞,所以 IV 可修改 2. 觀察 status 是否為 505 或 200: * 505 即失敗 * 200 成功但比對失敗 3. 發現 200 後表示中間值最後一個 byte A 跟修改後的 IV 最後一個 byte B 做 XOR 會得到 0x1: * 符合規則才會 200 * $A \oplus B = 1$ * 得到最後一個 byte 的密文 4. 拿 B 去跟 0x1 做 xor 得到中間值最後 byte A 的值: * 拿 A 去跟原本的 IV 做 XOR 即可得到明文最後 byte 6. 修改 IV 最後兩個 bytes B C 使其跟中間值 XOR 為 0x2 0x2: * PCKS#5 的規則 * 因為知道中間值最後 byte 的值,可以先固定(找最後 byte 跟哪個值 XOR 會得到 0x2 ),專心找倒數第二個 byte 即可 7. 以此類推找到 0x8 0x8...0x8 **注意** 這種方式解出來的會是最後一塊的明文,我一直以為是從第一塊開始跟 IV 做 XOR ,不過好像是相反的 ### Attack 2 另一種手法則是知道中間值,想要得到某個明文所必須生成的 IV 原理: 拿得到的中間值跟想要的明文 + padding 做 xor ## 防範 * 發現填充錯誤就馬上斷開不給爆破 * 不要用 PCKS#5 ?