
編譯 | 蘇宓
出品 | CSDN(ID:CSDNnews)
都說 Rust 是內存安全的編程語言,但現實正在敲響警鐘。
近日,Linux 內核維護者 Greg Kroah-Hartman 在郵件列表中確認,主線 Linux 內核中的一段 Rust 代碼被正式登記為 CVE 漏洞。
這也是 Linux 內核 Rust 代碼首次獲得 CVE 編號,引發了社區的廣泛關注。
![]()
![]()
Linux 內核 Rust 代碼首次出現 CVE
這一漏洞出現在用 Rust 重寫的 Android Binder 驅動(rust_binder)中。由于其中包含被標注出來的 unsafe Rust 代碼,在特定并發場景下可能觸發競態條件,導致鏈表中 prev/next 指針發生內存破壞,最終引發內核崩潰。
Greg Kroah-Hartman 在公告中給出了問題代碼的核心片段,其包含了如下 unsafe 操作:
unsafe { node_inner.death_list.remove(self) };這個操作之所以是不安全的,是因為在修改鏈表元素的 prev/next 指針時,必須確保沒有其他線程同時在并行訪問或修改這些指針。
如果該節點確實存在于 remove 所操作的那個鏈表中,那么這是安全的,因為我們對該鏈表擁有獨占訪問權;如果節點根本不在任何鏈表中,也同樣不會有問題。
但一旦節點實際上存在于另一個可能被并發訪問的鏈表中,那么在執行 remove 操作時,就會引發數據競爭,直接破壞鏈表結構。
而遺憾的是,這里正好踩中了這種情況。
問題是如何觸發的?
據 Greg Kroah-Hartman 的解釋,問題發生在 Node::release 的執行流程中,大致步驟如下:
獲取鎖;
將原鏈表中的所有元素移動到一個位于棧上的本地鏈表;
釋放鎖;
遍歷這個本地鏈表進行處理。
當其他線程同時在原始鏈表上使用這個 unsafe 的 remove 方法時,就會導致 prev/next 指針發生內存破壞,最終引發崩潰。
下面就是一次實際出現的崩潰示例:
![]()
針對這一問題,修復思路相對直接:修改 Node::release 的實現,不再先把元素整體移動到本地鏈表中,而是直接在原鏈表上逐個彈出并處理節點,從而避免并發訪問時破壞鏈表結構。
![]()
影響范圍
目前,Linux 內核 CVE 團隊已為該問題分配編號CVE-2025-68260。
該 CVE 影響的是 Linux 6.18 及之后的版本,也就是引入 Rust Binder 驅動之后的內核版本。
值得注意的是,這個問題目前“最多”只會導致系統崩潰,并不存在遠程代碼執行等更嚴重的安全風險。
對于“Rust 內核代碼首次出現 CVE”這一節點性事件,Greg Kroah-Hartman 也給出了相對冷靜的評價:
Rust 并不是一顆能夠解決所有安全問題的“銀彈”,但它確實能在很大程度上提供幫助。隨著 Rust 在內核代碼中的使用越來越廣泛,它有望消除 Linux 內核中大量常見的漏洞類型。
......除了這個漏洞,同時也要注意,僅在今天,就有另外 159 個內核 CVE 是針對 C 語言代碼部分的修復。因此,一如既往,想要整體上保持系統安全,最重要的仍然是及時升級到更新的內核版本。
另外,也有不少網友對于 Rust 的安全性發表自己的見解:
如果 Rust 因為太死板,以至于必須使用 unsafe 才能解決問題,那責任仍然在 Rust 本身。你必須同時考慮安全 Rust 的行為以及必要的 unsafe 代碼。
任何認為僅僅把代碼重寫成 Rust 就能消除所有 bug 的人都是天真得無藥可救的。尤其是考慮到 Rust 允許使用 unsafe 操作。這并不意味著 Rust 相較于 C 沒有價值,只是它的價值并不是能完全消除 bug——而這也從來不是它所宣傳的賣點。
那么,你怎么看?
參考:
https://lore.kernel.org/all/2025121614-CVE-2025-68260-558d@gregkh/
https://news.ycombinator.com/item?id=46302621
![]()
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.