在加密學中,密文填塞攻擊Padding Oracle attack,字面譯為填充神諭攻擊)是指使用密文的填充驗證信息來進行解密的攻擊方法。密碼學中,可變長度的明文信息通常需要經填充後才能兼容基礎的密碼原語英語cryptographic primitive。此攻擊方式依賴對密文是否被正確填充的反饋信息。密文填塞攻擊常常與分組密碼內的密碼塊鏈接解密模式有關。非對稱加密算法,如最優非對稱加密填充算法,也可能易受到密文填充攻擊。[1]

對稱加密

在對稱加密中,填充神諭攻擊英語oracle attack可應用在分組密碼工作模式上,其反饋的「神諭」(通常為服務器)信息將返回泄漏密文填充的正確與否。攻擊者可在沒有加密密鑰的情況下,透過此信息的神諭密鑰解密(或加密)信息。

對密碼塊鏈接進行密文填充攻擊

對密碼塊鏈接進行解密需要先解密所有密文組,再驗證填充,隨後移除PKCS7填充,最後再返回解密後的明文信息。 若服務器返回「填充無效」信息而非「解密失敗」錯誤,則攻擊者可利用服務器本身進行密文填塞來解密(或加密)信息。

Thumb

進行密碼塊鏈接解密的數學公式為

如上文所述,進行密碼塊鏈接解密時會將每個明文塊與先前的密文塊進行異或比較。 因此,若塊更改了一個字節,則塊中的對應字節也會被修改。

假設攻擊者擁有密文塊,且欲解密第二個密文塊來獲得明文。 攻擊者可以更改的最後一個字節(即),並發送至服務器。 服務器隨後將返回最後一個解密塊()的填充是否正確(是否等於0x01)。 若填充正確,攻擊者則能確定的最後一個字節是,即。 若填充不正確,攻擊者則可以將的最後一個字節更改為下一個可能的值。 在最不理想的情況下,攻擊者需要進行256次嘗試(即嘗試每個字節)來尋找的最後一個字節。若解密的明文塊內包含填充信息或用於填充的字節,攻擊者則還需要進行額外的嘗試來排除不同的可能性。[2]

在確定的最後一個字節後,攻擊者可以使用相同的手段來獲取的倒數第二個字節。 攻擊者可將的最後一個字節設置為,進而可將的相應字節設置為。 利用上述的相同方式,攻擊者可繼續更改倒數第二個字節,直到填充正確為止(0x02, 0x02)。

若一個密文塊包含了128比特(或16字節)的信息(如AES),攻擊者可在255x16=4080次嘗試中獲取到明文的信息。這比使用暴力破解所需的次嘗試要快得多。

使用密文填塞進行攻擊

使用密文填塞的攻擊方法起初由塞爾日·瓦德奈英語Serge Vaudenay於2002年發布。[3]攻擊者隨後利用此方法投入實際,用於應對SSL[4] 和IPSec[5][6]。除此之外,此攻擊方法也用於多個網頁框架上,如JavaServer FacesRuby on Rails[7]ASP.NET[8][9][10]Steam遊戲客戶端。[11]2012年,此方法被證明為應對加固安全設備的有效方式。[12]

雖然早期的攻擊方法均已被大多數TLS實現修復,但在2013年,網絡上出現了名為幸運十三攻擊的新變種,它使用側信道來重新利用軟件中的缺陷。截止2014年上半年,儘管幸運十三攻擊理論上對特定機器依然有效(參見信噪比),但研究學者們認為此方法在現實中已無威脅。截至2015年 (2015-Missing required parameter 1=month!),對解密互聯網加密協議的最活躍攻擊方法為降級攻擊,如Logjam[13]和Export RSA/FREAK[14]攻擊,此類方法會欺騙客戶端使用舊版安全性相對較低的但兼容性較高的加密算法。另外,一種名為POODLE英語POODLE[15](2014年下半年出現)將降級攻擊(降級至SSL 3.0)與對老版本不安全協議的密文填充攻擊相結合,進而破解傳輸中的數據。2016年5月,研究人員發現OpenSSL在修復幸運十三時引入了另一個填充神諭,此缺陷被標記為CVE-2016-2107。[16][17]

參考文獻

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.