愛伊米

Rust 1.56.1 釋出,解決 Unicode 安全漏洞問題

出品|開源中國

作者|白開水

Rust 1。56。1 現已釋出。此版本引入了兩個新的 lints,以減輕最近披露的一個安全問題CVE-2021-42574 的影響:

在 Unicode Specification through 14。0 的雙向演算法中發現了一個問題。它允許透過控制序列對字元進行視覺重新排序,可用於製作原始碼,呈現與編譯器和直譯器攝取的標記的邏輯順序不同的邏輯。攻擊者可以利用這一點對接受 Unicode 的編譯器的原始碼進行編碼,從而將目標漏洞引入人類審查者不可見的地方。

Rust 1.56.1 釋出,解決 Unicode 安全漏洞問題

Rust 官方表示,他們於今年 7 月 25 號收到了報告並開始著手修復。雖然這問題本身不是 rustc 的缺陷,但他們正在採取積極措施來減輕其對 Rust 開發人員的影響。其建議所有使用者立即升級,以確保他們的程式碼庫不受該安全問題的影響。

Rust 1。56。1 引入了兩個新的 lints,以檢測和拒絕包含受影響的 codepoints;而 Rust 1。0。0 到 Rust 1。56。0 中則不包括這樣的 lints。公告指出,如果你不對這些 codepoints 的存在進行 out-of-band checks,你的原始碼就容易受到這種攻擊。

為了評估生態系統的安全性,Rust 團隊分析了曾經在 crates。io 上釋出的所有 crate 版本(截至 2021-10-17),只有 5 個 crate 的原始碼中存在受影響的程式碼點,而且沒有出現任何惡意的情況。

Rust 1。56。1 中有兩個新的 deny-by-default lints,可以檢測受影響的 codepoints,分別在 string literals 和 comments 中。這些 lints 將阻止包含這些 codepoints 的原始碼檔案被編譯,從而保護使用者免受攻擊。

如果你的程式碼對這些 codepoints 有正確的用途,官方建議用相關的轉義序列來替換它們。錯誤資訊會建議使用正確的轉義。

如果你不能升級你的編譯器版本,或者你的程式碼庫還包括非 Rust 原始碼檔案。官方不擇建議定期檢查以下 codepoints 是否存在於你的版本庫和你的依賴中:U+202A、U+202B、U+ 202C、U+202D、U+202E、U+2066、U+2067、U+2068、U+2069。

安全研究員 Ross Anderson指出,鑑於該漏洞是 Unicode 問題,所以它不僅會影響 Rust;還會影響 C、C++、C#、JavaScript、Java、Rust、Go 和 Python 等其他頂級語言,並懷疑它適用於大多數其他現代語言。

此外,其還發現了一個類似的安全問題;即CVE-2021-42694,涉及識別符號內的 homoglyphs。不過從 Rust 1。53。0 開始,Rust 已經包含了對該攻擊的緩解措施。由於 Rust 1。0。0 到 Rust 1。52。1 版本中缺乏對 non-ASCII 識別符號的支援,因此不受影響。

更多詳情可檢視官方公告:https://blog。rust-lang。org/2021/11/01/Rust-1。56。1。html