Mayhem - 繞過 sudo 和 OpenSSH 身份驗證的記憶體位損壞攻擊

美國伍斯特理工學院的研究人員推出了一種新型的Mayhem 攻擊,利用Rowhammer 動態隨機存取記憶體位元失真技術來改變程式中用作標誌的堆疊變數的值,以決定身份驗證和安全檢查是否已通過了。攻擊的實際範例演示了繞過 SUDO、OpenSSH 和 MySQL 中的身份驗證,以及更改 OpenSSL 庫中安全性相關檢查的結果。

此攻擊可應用於使用檢查來比較不為零的值的應用程式。易受攻擊的程式碼範例:int auth = 0; ... // 驗證成功後更改 auth 值的驗證碼 if(auth != 0) return AUTH_SUCCESS;否則返回 AUTH_FAILURE;

在此範例的上下文中,對於成功的攻擊,足以破壞與堆疊上的 32 位元 auth 變數關聯的記憶體中的任何位元。如果變數中的任何位元被損壞,則該值將不再為零,且條件運算子將確定身份驗證是否成功完成。此類驗證模式在應用程式中非常常見,例如在 SUDO、OpenSSH、MySQL 和 OpenSSL 中。

Mayhem - 繞過 sudo 和 OpenSSH 身份驗證的記憶體位損壞攻擊

該攻擊也可以應用於「if(auth == 1)」形式的比較,但在這種情況下,其實現變得更加複雜,因為需要扭曲的不是 32 的任何位,而是最後一位。此方法也可用於影響處理器暫存器中變數的值,因為當上下文切換、函數呼叫或訊號處理程序觸發時,暫存器的內容可以暫時刷新到堆疊上。在暫存器值在記憶體中的一段時間內,可能會在該記憶體中引入失真,並且更改後的值將恢復到暫存器中。

Mayhem - 繞過 sudo 和 OpenSSH 身份驗證的記憶體位損壞攻擊

為了扭曲這些位,使用了 RowHammer 類別攻擊的修改之一。由於 DRAM 記憶體是二維單元陣列,每個單元由電容器和電晶體組成,因此對相同儲存區域執行連續讀取會導致電壓波動和異常,從而導致相鄰單元中的少量電荷損失。如果讀取強度很高,則相鄰單元可能會失去足夠的電荷,下一個再生週期將沒有時間恢復其原始狀態,這將導致單元中儲存的資料值發生變化。為了防範 RowHammer,晶片製造商添加了 TRR(目標行刷新)機制,該機制可以阻止特殊情況下的單元損壞,但不能防範所有可能的攻擊變化。

為了防止混亂攻擊,建議在比較中不要使用對與零的差異或與一的一致性的評估,而是使用具有非零八位元組的隨機種子值進行匹配檢查。在這種情況下,為了設定變數的期望值,需要精確地扭曲大量比特,與一位的扭曲相比,這是不切實際的。不可攻擊程式碼範例:int auth = 0xbe406d1a; ... // 如果驗證成功,則將 auth 值設為 0x23ab8701 的驗證碼 if(auth == 0x23ab8701) return AUTH_SUCCESS;否則返回 AUTH_FAILURE;

指定的保護方法已被 sudo 開發人員使用,並包含在版本 1.9.15 中作為 CVE-2023-42465 漏洞的修復。他們計劃在對主要易受攻擊的項目進行修復後發布用於執行攻擊的程式碼原型。

來源: opennet.ru

添加評論