最近,根據某國際安全小組的研究表明,金融巨頭Visa旗下部分受HTTPS保護的網站最近被發現了一種漏洞,它的存在可以讓黑客注入惡意代碼,訪客瀏覽器將會訪問到惡意內容。
加密重用造成的Forbidden Attack
據統計,受影響一共有184臺服務器,其中部分屬于德國證券交易所(Deutsche B rse)和波蘭銀行協會(Zwizek Banków Polskich),它們被發現容易受到某加密技術漏洞的攻擊,我們稱之為“Forbidden Attack”。此外,還有7萬臺web服務器被發現存在風險,雖然實際執行攻擊會比較困難。
這些數據來自于1月份的全網掃描,當時Deutsche B rse就修補了這個漏洞。但是在上周三的時候,研究人員發現Visa和Zwizek Banków Polskich的漏洞似乎仍然存在,而且官方并沒有回復安全研究員私下提交的漏洞信息。
該漏洞源于不正確的傳輸層安全協議,在數據被加密時,錯誤重用了相同的加密隨機數。TLS的規范其實已經寫明,這些數據只能使用一次,當多次重用時,則會導致Forbidden Attack。這種攻擊能讓黑客自行生成密鑰去認證網站內容。這個漏洞利用的首次提交,是 以評論的形式寫給國家標準技術研究所的。之所以叫這個名字,是因為其正確加密的基本原則,是必須臨時而獨特的。
在TLS握手中,那184臺HTTPS服務重復使用了客戶端瀏覽器首次連接到HTTPS網站的那個隨機數,違背了加密的基本原則。因此,黑客只要有能力監控連接傳輸的內容,比如處于同一個不安全的wifi環境下,他們就可以將惡意內容注入到傳輸數據流里,而客戶端瀏覽器并不能檢查出任何差錯。
研究人員在一篇名為《忽視隨機數的惡果:TLS GCM實戰偽造內容攻擊》的paper中寫道:“這是可靠性驗證的失敗,即使只在同一個時間段里重用一個隨機數,也能讓黑客通過HTTPS進行偽造內容攻擊。”這項研究的結果,也將作為8月份拉斯維加斯黑帽的大會某議題的基礎材料。
黑客污染HTTPS認證過的內容的中間人攻擊,已經擊破了TLS的基本保證。黑客可以繞過保護,添加惡意JS代碼或者添加能誘惑訪客輸入密碼、社會安全碼或者其他敏感數據的WEB內容。雖然這個漏洞讓Forbidden Attack很好的文檔規范化了,新的研究結果仍值得我們注意如何利用它去對抗HTTPS保護的網站,網上也有相應的POC代碼。
下面則是一段演示視頻:
https://www.youtube.com/watch?v=qByIrRigmyo
GCM隨機數重用攻擊visa.dk的POC
這篇paper是由研究人員Hanno B ck、Aaron Zauner、Sean Devlin、 Juraj Somorovsky、and Philipp Jovanovic共同撰寫,里面警告我們網上約7萬HTTPS服務器,可能會因為偽隨機數算法生成的“隨機數”而遭受這類攻擊。只要有足夠多的WEB請求,黑客就有很大可能性去重用其中一個來執行攻擊。然而這樣所需WEB請求的數量是比較大的,約2的30次方個請求里取得重復隨機數的可能性為3%, 2的35次方個請求后能100%成功。正如paper的標題所述,Forbidden Attack針對的是AES-GCM,世界上最廣泛的TLS對稱加密協議。
在研究人員發現的7萬站點中,黑客需要往WEB連接里填充TB級別的數據,從而創建足夠多的請求。因此,這種攻擊的理論性可能會高于實際意義。但是,這仍然被大多數運用HTTPS保護的組織當作不可接受的風險。研究人員目前確定了幾個TLS實例中生成了偽隨機數,其中有IBM的DominoWEB服務器,已于3月打上了補丁。還有個Radware的負載均衡器的案例,也 已經修復了。
自研究人員發布掃描結果后,許多漏洞網站已經修復了。但是只有工程師們深刻意識到這個問題,事情才能顯著改善,這也是研究人員發布這篇paper的原因。
Zauner 在郵件中寫道,“我敢肯定一年以后我再去掃描一遍,還是會有很多的漏洞案例。可能還有更多方法可以利用它,誰知道呢?”
GCM工作機制淺析
那么,像GCM或者類似CTR模式的CCM,為什么不能在發送的信息中進行隨機數重用呢?下面我們將就GCM的工作機制進行解釋一番:
當使用AES GCM時,我們并不會運行AES加密的數據。而我們會使用AES去加密標志自增計數器創建的各區塊,這就造就了不可預知的比特流(密鑰數據流)。然后,我們會用需要加密的數據流與之進行XOR運算。而最初的計數區塊,就是用來與其他加密文本一起生成身份驗證標記的。
如果我們單獨看AES加密算法,可以知道用相同的密鑰去加密相同的數據,是會得到相同的加密文本的,這也是我們為啥需要CBC模式下的IV。那么我們在GCM里面重用相同的隨機數會發生什么呢?
假設有兩個不同的消息A和B,我們如果在其中使用了同一隨機數N,這些消息的第一個區塊會被這樣加密:
C = AES(counter(N,1)) ⊕ A
C = AES(counter(N,1)) ⊕ B
這基本上意味著,我們如果使用相同計數器和相同的隨機數去XOR兩個加密的區塊,會得到XOR的文本:
C ⊕ C = B ⊕ A
如果我們知道其中一個純文本,我就可以用加密文本與之XOR,從而得到密鑰數據流。最后,我們就能解密另一段使用同樣的密鑰和隨機數加密的文本了(這點受限于已知文本長度)。
*參考來源:AR、BS,FB小編dawner編譯,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)