新聞

Rust編譯器被發現存在記憶體安全漏洞,開發者在GitHub通報,即使程式未使用unsafe關鍵字,仍可繞過生命周期檢查,讓原本應被拒絕的程式通過編譯,執行時可能存取已失效的記憶體。Rust團隊已將問題列為高優先級,目前修補尚未完成。

Rust透過所有權與借用檢查,限制程式參照資料的有效時間,避免資料失效後仍被讀取。依照設計,不符合生命周期限制的程式應在編譯階段遭到阻止,未使用unsafe的Rust程式碼,原則上不應產生這類記憶體安全問題。

但有開發者發現,Rust結構(struct)即便已設定生命周期限制,編譯器仍可能接受不符合限制的欄位賦值。原始範例使用'static限制型別參數,原本不能存入只在局部程式區塊有效的字串參照,編譯器卻仍允許將其放進Option欄位。問題涉及編譯器對型別與生命周期限制的檢查,程式還能透過結構實例銷毀時執行的Drop方法,將參照保留在其他位置,讓原始資料失效後仍可被讀取。

通報者的測試程式不僅通過編譯,執行後還讀到記憶體遭其他資料覆寫的內容。使用記憶體檢測工具進一步檢查,也確認程式存取了已超出有效範圍的記憶體,證實編譯器未能阻止原本不應允許的操作。

原始通報指出,問題存在於Nightly開發版,且至少可追溯至Rust 1.85.0穩定版。其他開發者陸續提出不同的重現程式,其中一個案例使用2015年10月發布的Rust 1.4.0也能通過編譯,顯示漏洞已存在近11年。

Rust維護者指出,雖然繞過檢查的方式不複雜,但要實際造成記憶體安全問題,通常需要刻意設計資料銷毀時執行的處理程式,較不可能由一般程式無意間觸發。考量漏洞多年未被發現,Rust開發團隊將其列為P-high,而非最高優先級P-critical,目前公開討論也未提到漏洞已遭實際攻擊利用的案例。

已有開發者針對問題提交修補提案,在編譯器中階表示(MIR)階段增加檢查,確認暫存變數的型別是否符合限制。提案仍在審查中,尚未合併,Rust團隊也尚未公布修補版本與發布時程。