Tls

TLS 對 VM 重置攻擊是否安全?

  • January 30, 2016

TLS 協議對 VM 重置攻擊是否安全?

背景:想像一下在虛擬機 (VM) 中執行加密軟體。虛擬機重置攻擊是一種軟體狀態在某個時間點設置檢查點(快照),允許向前執行,然後重置(回滾)到前一個快照並繼續向前執行的攻擊。在某些情況下,這允許強大的攻擊。標準模型中存在安全的協議,但對 VM 重置攻擊並不安全。

那麼,TLS(作為一種協議)對這種攻擊是否安全?有沒有攻擊?是否有任何 TLS 密碼套件容易受到 VM 重置攻擊?


先前的工作: Ristenpart 等人。在以下論文中表明,一些 TLS實現容易受到 VM 重置攻擊:

托馬斯·里斯滕帕特和斯科特·伊萊克。 當好的隨機性變壞時:虛擬機重置漏洞和對沖部署的密碼學。NDSS 2010。

然而,他們的攻擊都是針對 TLS 的特定實現,並利用失敗來重新植入 RNG。換句話說,它們似乎代表了實現的失敗,而不是協議本身的失敗。似乎一個足夠仔細的實現可以通過在適當的點向 PRNG 添加額外的熵來屏蔽這些攻擊。

我的問題是:TLS 中是否存在任何協議級 VM 重置漏洞?


*威脅模型:*這是一個更詳細的威脅模型。該軟體在虛擬機內執行。攻擊者可以像往常一樣通過網路自由地與軟體互動。此外,攻擊者還獲得了兩個額外的權力:在任何時候,攻擊者都可以保存虛擬機目前狀態的快照;並且在任何時候,攻擊者都可以將虛擬機回滾到之前的某個快照,然後讓它從那裡繼續執行。

很容易發明在標準模型中安全但在此模型中不安全的協議。例如,想像一個生成臨時密鑰對的協議 $ K_A,K_A^{-1} $ 對於一次性簽名方案,簽署臨時公鑰 $ K_A $ 使用長期 RSA 簽名密鑰,接收來自攻擊者的一些消息,然後使用臨時簽​​名密鑰對一些消息進行簽名。在標準模型中,這與使用 RSA 簽名一樣安全。但在虛擬機重置模型中,這是不安全的:攻擊者可以在系統生成臨時密鑰對後立即對系統進行快照,讓它向前執行以發出一條由臨時私鑰簽名的消息;然後將其回滾到快照並從那裡向前執行,觀察由同一臨時私鑰簽名的第二條消息。一旦攻擊者觀察到由同一一次性私鑰簽名的兩條消息,攻擊者就可以偽造其他消息。因此,這證明了協議級 VM 重置漏洞可能存在。但是 TLS 協議容易受到攻擊嗎?

不,TLS 對 VM 重置攻擊並不安全。虛擬機重置攻擊至少可以實現兩種攻擊,我想不到:

  1. AES-GCM 隨機數通常由消息計數器值確定性地生成。如果您在本地對等方發送純文字消息之前設置快照,該消息將在重置為快照後更改,您將有一個嚴重的隨機數重用漏洞。如RFC 5288中所述,每個數據包發送的 64 位顯式隨機數可以等於消息計數器。目前的 TLS 1.3 草案刪除了顯式 nonce,並將其替換為隱式消息計數器 xor:ed 與從主密鑰派生的靜態 IV 值。chacha20-poly1305 草案中指定了相同的隨機數生成,因此具有相同的漏洞。傳統的 CBC 密碼套件不太容易受到攻擊,特別是如果用於加密然後mac模式。**編輯:**在實踐中,VM 引擎可能被實現為在掛起時自動關閉所有 TCP 連接,並且在重置後恢復時不一定重新連接。這可能有助於使針對直接通過 TCP 的正常 TLS 連接的攻擊不太實用。其他類型的通道上的 TLS 和 UDP 上的 DTLS 可能是另一回事。
  2. 在與會話相對應的任何致命警報之後,會話主機密應該被丟棄,例如無法驗證完成的消息。能夠重置本地對等點的攻擊者顯然能夠規避這一點。這意味著例如攻擊者可能會嘗試使用屬於另一個對等方的會話 ID 來執行會話恢復,即使在初始失敗之後也是如此。此類針對會話狀態的攻擊不依賴於 VM 引擎在重置為快照時離開網路堆棧的狀態。

如果你從客戶端/伺服器關係的角度來分解它,我認為它可能會提供一些見解。TLS 既不是顯式的也不是隱式的易受攻擊,就像你說的,它取決於實現。

例如:如果使用 TLS 的伺服器是虛擬化的,那麼回滾到該點可能會引入重播。但是,如果您正在談論客戶端與伺服器進行身份驗證,那麼除非存在其他一些因素,例如錯誤或某些東西或錯誤的實現,否則您不會遇到這個問題 - 這就是為什麼當您註銷站點並恢復虛擬機到過去,您仍然處於註銷狀態,但是如果您要將伺服器恢復到該點(比如說在備份或其他東西中),您可能會遇到這個問題,尤其是在 cookie 尚未過期的情況下。雖然,通過適當的安全“最佳實踐”可能會得到緩解。

如果您可以欺騙伺服器上的時間,儘管那裡也可能存在問題。TLS 中沒有任何固有的東西,因為有許多協議可能存在問題,這就是為什麼它被稱為它的名稱。這有幫助嗎?簡而言之,我的觀點是,眾所周知,還有其他因素,並且協議本身的安全性可能與您的伺服器獲得 pwnd 幾乎沒有關係。

引用自:https://crypto.stackexchange.com/questions/32203