Rust 標準庫中的漏洞

由於 std::fs::remove_dir_all() 函式中的競爭條件,Rust 標準函式庫中已發現一個漏洞 (CVE-2022-21658)。 如果函數用於刪除特權應用程式中的臨時文件,則攻擊者可以刪除通常無權刪除的任意系統檔案和目錄。

該漏洞是由於在遞歸刪除目錄之前不正確地執行檢查符號連結而導致的。 remove_dir_all() 首先檢查檔案是否是符號鏈接,而不是阻止追蹤符號連結。 如果定義了鏈接,則將其作為文件刪除,如果是目錄,則呼叫遞歸內容刪除操作。 問題在於檢查和刪除操作開始之間存在輕微的延遲。

當檢查已經進行,但枚舉目錄進行刪除的操作尚未開始時,攻擊者可以用帶有符號連結的臨時檔案替換該目錄。 如果在正確的時間命中,remove_dir_all() 函數會將符號連結視為目錄並開始刪除連結指向的內容。 儘管攻擊的成功取決於所選的替換目錄時間的準確性,並且不太可能第一次擊中正確的時刻,但在實驗過程中,研究人員能夠在執行漏洞後實現可重複的成功攻擊。幾秒鐘。

從 1.0.0 到 1.58.0(含)的所有 Rust 版本都會受到影響。 該問題目前已以補丁形式解決(該修復將包含在 1.58.1 版本中,預計在幾個小時內發布)。 您可以在以下頁面上監控發行版中漏洞的消除:Debian、RHEL、SUSE、Fedora、Ubuntu、Arch、FreeBSD。 建議所有以提升權限運行並使用remove_dir_all函數的Rust程式使用者緊急將Rust更新到版本1.58.1。 有趣的是,發布的補丁並沒有解決所有系統上的問題;例如,在 REDOX OS 和 macOS 10.10 (Yosemite) 之前的版本中,由於缺少 O_NOFOLLOW 標誌,該漏洞沒有被阻止,該標誌會禁用以下符號鏈接。

來源: opennet.ru

添加評論