去年我寫了 2021 年 Rust 生態版圖調研報告 | 星辰大海(上)[1] 和 (下)[2] ,大家能看到 Rust 在各個行業領域中開始暫露頭角。2022 年,在政治動蕩、經濟下行和疫情肆虐的世界大環境下,Rust 卻迎來了高質量的發展。2022 年,我愿稱之為 Rust 發展元年。
系列目錄
- Rust 2022 漫談
- Rust 2022 全球商業應用盤點
- Rust 2022 安全參考
- Rust 2022 開源生態盤點
Rust 2022 漫談
踏上新的征程:Rust 2024
Rust 2021 Edition 發布以后,官方就開始制定 Rust 2024 Edition 的路線圖了。Rust Edition 是每三年發布的一個大版本(版次)。在 2022 年 4 月,官方博客宣布 Rust 2024 Roadmap 。讓我們了解一下 Rust 的下一步愿景是什么。
Rust 2024:廣泛應用
Rust 的目標是成為一門賦予每個人構建可靠且高效軟件能力的語言。Rust 不僅需要設計和實現一種具有優秀庫和優秀工具的優秀語言,還需要維護一個優秀的支持社區。
Rust 2024 Edition 的目標是廣泛使用,即,讓越來越多的人開始使用 Rust 。為了達到這個目標,2024 Edition 需要關注以下三個重點:
- 拉平 Rust 語言的學習曲線。讓 Rust 更容易為新用戶和現有用戶所用,并讓解決難題變得更容易。這樣可以吸引更多新的 Rust 用戶。
- 增強 Rust 用戶間的彼此合作。
- 讓 Rust Project (語言自身項目)的貢獻者更加方便
拉平學習曲線
建立大型 Rust 用戶團隊的公司報告說,Rust 工程師的典型的上崗時間約為 3-6 個月。當然,一旦人們學習了 Rust,他們通常會喜歡上它。即便如此,許多人表示在使用它時感覺“認知開銷”很高,而“學習曲線”仍然是不使用 Rust 的最常見原因。事實是,即使在您了解了 Rust 借用檢查器的工作原理之后,仍然有許多“小細節”需要正確處理才能讓您的 Rust 程序編譯。
對于 Rust 2024 目標是讓開發者能夠直接關注問題域的“固有復雜性”,并盡可能避免來自 Rust 的“意外復雜性”。
實現這一愿景的計劃是專注于四個高級目標(按從廣義到精確的順序):
- 更精確的分析,更少的繁瑣:通過改進借用檢查器、類型推斷等,使編譯器能夠更好地識別代碼何時正確。識別并消除“樣板”模式,例如必須在各處復制和粘貼同一組 where 子句。
- **更輕松地表達自己:必要時擴展語言,以便開發者可以更直接地表達他希望代碼執行的操作。在某些情況下,這采用語法糖的形式(例如let-else),但在其他情況下,它可能意味著擴展類型系統以能夠描述新模式(例如泛型關聯類型)。
-
改進異步支持:將我們的
async/await
支持擴展到當前的“MVP”之外,以包括 trait 中的async fn
、async drop
和支持異步愿景文檔路線圖所需的其他功能。 -
提升
dyn Trait
可用性:**拓寬可以使用dyn
的 trait 集,并使使用dyn
更接近于使用泛型。
增強 Rust 用戶間的彼此合作
Rust 結合了所有權和借用、底層系統控制以及過程宏等強大的可擴展性機制,使其成為編寫庫的絕佳語言。而且,多虧了 Cargo,在程序中使用一個庫只需要幾行代碼。盡管如此,仍有許多事情是庫作者不能做或不容易做到的。例如,他們無法控制用戶看到的錯誤消息或部署需要特殊選擇加入的“Unstable”功能。Rust 2024 希望通過幫助管理功能生命周期或擴展庫的功能來構建使庫作者能夠更好地為用戶服務的功能。
Rust 2024 希望追求能夠在生態系統中進行更多探索的變化,實現這一愿景的計劃是專注于四類工作:
- 功能生命周期:幫助庫作者在功能從實驗階段過渡到最終完成階段時為其提供支持。幫助庫作者管理他們的開發生命周期和演變。
- 更豐富的抽象:擴展語言讓庫作者表達更豐富的抽象。比如支持 GAT ,讓開發者編寫更通用的庫。
- 定制開發人員體驗:許可庫作者可以定制開發人員體驗,例如,定制未實現 trait 或引入自定義 lints 時用戶收到的錯誤消息。
- 互操作性:庫生態系統可以輕松協調,使庫協同工作,而無需將它們捆綁在一起。庫作者可以根據需要編寫可在多種環境中移植或特定于一種環境的代碼。
讓 Rust Project 的貢獻者更加方便
Rust 語言自身也是一個 Rust 項目,雖然 Rust 語言項目非常活躍,但是當潛在貢獻者想要對 Rust 項目貢獻時,可能無法弄清楚感興趣或想要貢獻的某些特定事物的狀態。因此 Rust 官方團隊需要一個系統,以便這些貢獻者可以很容易地知道 Rust 項目的狀態而更容易地找到貢獻點。
Rust 2024 實現這一愿景的計劃是將重點放在四類工作上。
- 一目了然地看到狀況。潛在貢獻者能夠很容易地識別出語言團隊正在積極開展哪些工作,以及這些設計已經取得了多大進展。希望每一個跟蹤問題都能清楚地識別出需要哪些 "下一步 "來推動該特定功能的完成,并確保這些步驟被清楚地記錄下來,供可能的貢獻者參考。
- 清晰的所有者和清晰的溝通。Rust是通過共識運作的,但這并不意味著每個人都必須知道所有的細節。因此需要一個系統,對需要完成的工作有明確的所有者,最好是不在 Lang 團隊中的所有者。簡單的分工會導致日后的沖突,所以我們也需要頻繁的溝通和更新,以確保每個人都能了解事情的整體發展方向,并盡早地提出問題。
- 高效、開放的流程與工具支持。官方團隊一直在尋找方法來改善他們的運作方式。他們注意到的一點是,由機器人或其他工具支持的流程往往能更好地工作。
2022 語言改進看點
2022 年 Rust 語言一共發布 11 個穩定版本(1.58~1.66),從語言特性、編譯器到庫 API 均有改進。下面分別從這三方面羅列了一些看點。
語言特性
-
字符串格式化支持捕獲變量的形式
{ident}
-
*const T
現在支持常量上下文中解引用 -
泛型結構體中使用
Unsize
的規則更加寬松 ,參考 relaxed_struct_unsize 跟蹤 issue - 穩定新的 asm!和 global_asm!適用于 x86、x86_64、ARM、Aarch64 和 RISC-V
-
穩定解構賦值,比如支持這種形式
(a, (b.x.y, c)) = (0, (1, 2));
- 穩定常量泛型參數支持默認參數值,并移除類型和 const 參數的順序限制
-
穩定
#[cfg(panic = "...")]
為"unwind"
或"abort"
-
const fn
簽名現在已經支持 泛型 trait 限定、 返回位置的impl Trait
和 函數指針的創建傳遞轉換,以及extern "C"
或extern "Rust"
- NLL 穩定,當前編譯器僅使用基于 MIR 的借用檢查
-
穩定
let else
- 穩定泛型關聯類型 (GAT),重要特性,允許開發者可以更方便地開發更加通用的庫和框架。
-
未初始化的整數、浮點數和原始指針現在被視為立即 UB。使用
MaybeUninit
是處理未初始化內存的正確方法。 -
不允許對
Pin
(哪怕 T 在本地)實現Drop
- 重復的生命周期參數將不被自動省略
編譯器
- 升級到 LLVM 14
- 出現 lint 錯誤后不要中止編譯
- 錯誤消息在更多地方指向 trait bound obligations 的來源
- 將 -Z strip 穩定為 -C strip
- 添加了更多的 Tier 3 編譯目標
- 編譯器內部完成了統一跨所有平臺的 可重入鎖 ReentrantMutex 實現
- 為優化編譯啟用 MIR 內聯這為真實世界的 crate 提供了 3-10% 的編譯時間改進。查看性能結果。
庫 與 API
-
copy
和copy_nonoverlapping
重新啟用調試檢查 -
Duration::new
和相關的一系列函數可以用于常量上下文 -
穩定
ops::is_break
和ops::is_continue
-
穩定
std::available_parallelism
,該函數可以返回程序應使用的默認并行度的估計值,即它可以同時執行的計算數量的限制。也會考慮CPU 配額。例如,在一個有 8 個虛擬 CPU 但配額只允許 50% 使用率的容器中,available_parallelism
將返回 4。 -
常量上下文中新支持了很多 API ,比如
<*const T>::offset
和<*mut T>::offset
- 用基于 futex 的 RwLock 取代了 Linux 上基于 pthread 的 RwLock,另外 Mutex 和 Condvar 也正在被改進
-
標準庫中修復了許多不正確的使用
mem::uninitialized
的情況 -
增加
thread::scope
的支持
其他
- rustdoc 支持遞歸顯示所有 Deref 實現
-
Cargo 支持支持縮寫
--release
為-r
- Cargo 將在二進制文件之前完成庫的文檔化
-
在
std::io
中添加/proc/self/mem
. 有關的文檔 - Cargo 現在可以從workspace繼承設置,以便可以將設置集中在一個地方
-
Rustup組件
rust-analyzer
現已在穩定channel上可用。 -
BTreeMap
修復了一個健全性錯誤,允許在容器之前刪除它借用的數據。
點評:今年最重要的語言特性就是泛型關聯類型(GAT )的穩定。GAT 的穩定帶給了 Rust 更高級的抽象方式,允許庫和框架開發者開發出更加通用的工具。
Rust 社區熱點觀察
Rust for Linux 進入 Linux 內核
“參考:Rust for Linux 文檔
今年最熱的熱點就是 Rust for Linux 進入 Linux 6.1 內核。
在今年10 月,初始的 Rust 基礎設施已被合并到 Linux 6.1。意味著未來 Rust 編程語言將用于內核驅動程序和其他子系統的代碼。但初始的 12.5k 行新代碼只提供了底層的基礎設施和一些非常基礎的集成,據稱未來的 PR 將添加更多的子系統抽象、多個 Rust 編寫的驅動程序等等。目前,構建具有 Rust 支持的 Linux 內核仍然是可選的。
在 11 月,領導 Rust for Linux 工作的 Miguel Ojeda發布了一組優化補丁( 28 個),為內核提供了更多的 Rust 核心支持代碼。這些新的補丁很可能會在 Linux 6.2 合并窗口中看到。
整個 Android 12 和 13 系統中,Rust 代碼中發現的內存安全漏洞為零
近日, Google 發文稱 Android 中使用了內存安全語言 Rust 之后,發現內存安全漏洞的數量在過去幾年/版本中大幅下降,從 2019 年到 2022 年,內存安全漏洞的年度數量從 223 個下降到 85 個。2022 年是內存安全漏洞不再占 Android 大部分漏洞的第一年。
在 Android 13 中,大約 21% 的新原生代碼(C/C++/Rust)是 Rust。AOSP 中大約有 150 萬行 Rust 代碼,涵蓋新功能和組件,例如 Keystore2、新的超寬帶 (UWB) 堆棧、DNS-over-HTTP3、Android 的虛擬化框架 (AVF) 以及各種其他組件及其開源依賴項。
迄今為止,在 Android 的 Rust 代碼中發現的內存安全漏洞為零。
我們不希望這個數字永遠保持為零,但考慮到兩個 Android 版本中新 Rust 代碼的數量,以及使用它的安全敏感組件,這是一個重要的結果。它表明 Rust 正在實現其防止 Android 最常見漏洞來源的預期目的。在許多 Android 的 C/C++ 組件(例如媒體、藍牙、NFC 等)中,歷史漏洞密度大于 1/kLOC(每千行代碼有 1 個漏洞)。基于這個歷史漏洞密度,使用 Rust 很可能已經阻止了數百個漏洞進入生產環境。
在 Android 的 Rust 中使用 unsafe 似乎按預期工作。它很少被使用,當它被使用時,它是一種封裝行為,更容易推理和審查安全性。比如,UWB 代碼中 unsafe 有兩種用法:一種是實現對存儲在 Java 對象中的 Rust 對象的引用,另一種是用于拆解該對象。Unsafe 在這種情況下非常有用,因為對這段代碼的額外關注使我們能夠發現可能的競爭條件并加以防范。
Rust 在 Android 平臺上的使用正在增長,但這還沒有結束。為了實現提高 Android 范圍內的安全性、穩定性和質量的目標,Android 團隊決定需要在本機代碼的任何地方使用 Rust。目前正在用 Rust 實現用戶空間 HAL。在受信任的應用程序中添加了對 Rust 的支持,已將 Android 虛擬化框架中的 VM 固件遷移到 Rust。隨著 Android 從 C/C++ 遷移到 Java/Kotlin/Rust,預計內存安全漏洞的數量將繼續下降。
Rust 語言引入了吉祥物彩蛋
當你使用 Rust 吉祥物 定義變量時,
fnmain(){
let=1;
}
Rust 編譯器會拋出專屬的錯誤:
error: Ferris cannot be used as an identifier
--> src/main.rs9
|
2 | let = 1;
| ^^ help: try using their name instead: `ferris`
本來是非官方吉祥物,這個彩蛋也許是來自官方的一種文化認可。
rust-analyzer 被納入 rust-lang 官方倉庫中
rust-analyzer 現在已經成為了 Rust 官方的一員。VSCode 、NeoVIM 和 Emacs 等編輯器對 ra 有很好的支持。如果你使用基于 IntelliJ 平臺的 IDE,如 CLion、IDEA 或 PyCharm,則不需要 rust-analyzer,而應該使用JetBrains 的IntelliJ Rust插件。
2019 年 rust-analyzer 社區剛起步構建 IDE 的基礎,到 2020 年,RFC2912中 就提倡:“將 rust-analyzer 作為官方的 LSP(語言服務器協議)實現”。RFC 在社區的壓倒性支持下被接受:它仍然是有史以來投票最多的 Rust RFC。讓 ra 成為官方的一員將持續推動該 RFC 的落地。接下來,將 rust-analyzer 宣傳為 Rust IDE 支持的極有可能的未來,收集反饋,并根據其積極結果,淘汰當前推薦的語言服務器 RLS。
來自開源作者的吶喊:“請記住,我的項目是零收入”
開源項目Kind和HVM的作者 Victor Taelin ,收到一位社區中有影響力的人的如是批評:“這個項目背后的人往往會建立令人印象深刻的東西,但后來他突然放棄了這些東西,然后去做點別的……”。這份批評讓 Victor 非常難過,因為這位來自社區有影響力的人也給予了 Victor 很多靈感。
Victor 公開聲明:“我們只是沒有資金!看,這不是大公司的工作,甚至不是大團隊的工作。80% 的代碼仍然是我做的。有一些朋友幫忙,但他們大多是兼職,自愿,還在學習這東西,所以幫助有限。**然而,什么都沒有被放棄。我們只是受到我們微小規模的限制。我沒有報酬,這不是一家營利性公司,我只是一個創造酷炫、免費技術以推動人類進步的人。我熱愛我的工作!不過,如果您確實希望看到我的想法更快地發展,請考慮對它們進行投資”。
Victor 說:不管怎樣,HVM 和 Kind 都在積極、熱情的開發中,并將繼續向前發展,即使有點慢!
來自社區的另一位回復非常暖心:“老實說,即使你放棄了你的項目,我仍然會感謝你的工作。你的輸出是創新的,我可以看到它們影響未來的 PL 發展。就我個人而言,我認為你對我自己產生了積極的影響,并且確實幫助激發了我對類型理論的興趣。綜上所述,請不要讓一些誤導性的批評使您沮喪。只要繼續做你最擅長的事情,你就會知道這些年來你已經贏得了很多感激的支持者。”
Rust 1.65 穩定版發布
Rust 1.65 穩定版發布帶來了 Rust 最重要的特性:泛型關聯類型。該特性的重要性可以這么說:如果沒有它, Rust 將停滯不前。GAT 非常通用,可以實現許多當前無法編寫的模式。有關更多信息,請查看穩定公告。
虛幻引擎集成 Rust
社區中有人將 Rust 集成到了 虛幻引擎(Unreal Engine )5 中,發布了 unreal-rust。unreal-rust
使用基于 Bevy 的實體組件系統 (ECS),然后 Rust 通過 C FFI 與 Unreal 通信,在 Unreal 之上編寫AActor
并以 Rust 友好的方式公開其 API。
雖然是個人項目,但非常有創意。
Asahi Lina 談她用 Rust 編寫內核驅動程序的經歷
Asahi Lina 用 Rust 編寫了新的 Apple AGX GPU 驅動程序(M1 和 M2)。這些 GPU 運行固件并且具有相當復雜的需要宿主機管理的共享內存數據結構,所以 Lina 一直傾向于 Rust。在使用 Rust 之后,Asahi Lina 如是說:「關于內核中的 Rust 是否有用存在很多奇怪的爭論......根據我的經驗,它比我想象的更有用!我從第一個渲染到一個穩定的桌面,可以運行游戲、瀏覽器等。在我的驅動程序上工作了大約兩天!所有并發錯誤都隨著 Rust 消失了!內存在需要釋放時被釋放!一旦你學會了讓 Rust 與你一起工作,我覺得它會引導你編寫正確的代碼,甚至超出語言的安全承諾。這真的很神奇!」
NSA 發布關于如何防范軟件內存安全問題的指南
美國國家安全局 (NSA) 發布了一份指南,以幫助軟件開發人員和操作員預防和緩解軟件內存安全問題,這些問題占可利用漏洞的很大一部分。建議使用內存安全的Rust 語言。
NSA 方面表示,內存安全問題在可利用的漏洞中占比很大。并引用了微軟的數據指出,該公司從 2006 年到 2018 年 70% 的漏洞是由于內存安全問題造成的;谷歌的 Chrome 在幾年內也發現了類似比例的內存安全漏洞。
該組織認為,惡意的網絡行為者會利用不良的內存管理問題來訪問敏感信息、頒布未經授權的代碼執行、以及造成其他負面影響,而這些通常會危及設備并成為大規模網絡入侵的第一步。
Rust 連續 7 年榮獲 Stackoverflow 最受歡迎語言
每年面向百萬開發者的Stackoverflow 調研結果顯示,Rust 再次拿下最受歡迎語言,今年是連續第七年收獲此殊榮。并且,在今年 11月的 TIOBE 編程語言排行榜中,Rust 也首次進入了前二十,暫排第 17 位。
Rust 基金會成員增加到了 39 家
在 2021 年2 月9 日 Rust 基金會成立之初,只有Mozilla、Amazon、華為、谷歌、微軟五家創始白金成員,截止到今天(2022.12月)已經有 39 家不同領域的頭部公司成為了Rust 基金會成員,共同推動 Rust 在各自領域的落地。
本節小結
2022 年,是新的起點。在 2021 Edition 發布之后,官方又起草和制定了 2024 Edition 路線圖,并且在該路線圖的指導下開啟了新的征程。Rust 2024 的目標是讓 Rust 廣泛應用。
2022年,Rust 語言特性上取得了重大進展,穩定發布了泛型關聯類型。這一特性的發布將解鎖 Rust 語言高階統一抽象,促進生態庫和框架的長足發展,以及 Rust 異步特性向零成本抽象的目標更近了一步。
2022 年,最受人們關注的是 Rust for Linux 進入Linux 內核這件事。雖然當前進入內核的只是初步基礎補丁,但這關鍵的一步已經為未來 Rust 在 Linux 內核領域發展奠定了很好的基礎。
2022 年,也是收獲碩果的一年。Google Android 團隊宣布,2022 年是內存安全漏洞不再占 Android 大部分漏洞的第一年。Android 13 已經有大約 21% 的新原生代碼(C/C++/Rust)是 Rust。AOSP 中大約有 150 萬行 Rust 代碼,涵蓋新功能和組件。并且,迄今為止,在 Android 的 Rust 代碼中發現的內存安全漏洞為零。
2022 年,我們也看到社區中一些個人開發者,雖然遭遇不公平的流言蜚語,依然對 Rust 熱愛依舊,在零收入的狀況下默默地使用 Rust 實現自己的開源項目。
2022 年,可以說是 Rust 語言的發展元年。隨著越來越多的公司采用 Rust ,Rust 變得越來越受歡迎。展望未來,我們衷心希望 Rust 2024 Edition 發布目標,讓 Rust 廣泛應用,可以圓滿實現。
Rust 2022 全球商業化應用盤點
- Rust 基金會成員應用盤點
- Rust 初創產品
- Rust 領域應用
- 總結
2022 年是 Rust 語言距離穩定版正式發布以來已經走過的第七年。從 Rust 發布以來,就一直受到廣大開發者的歡迎。在 Stackoverflow 來自 180 個國家 7萬3千多名開發者的投票調查中,Rust 連續七年榮獲最受歡迎的編程語言,87% 的開發人員希望使用 Rust 。
2022 年也距離 Rust 基金會成立的第二年。在 2021 年2 月9 日 Rust 基金會成立之初,只有Mozilla、Amazon、華為、谷歌、微軟五家創始白金成員,截止到今天(2022.12月)已經有 39 家不同領域的頭部公司成為了Rust 基金會成員,共同推動 Rust 在各自領域的落地。
2022 年在 Rust 基金會成員公司之外,也有不少公司開始使用 Rust。其中包含初創企業,使用 Rust 從頭構建產品;也有成立多年的老牌公司,使用 Rust 來改進生產。Rust 開發者數量也逐漸增多。據開發者調查分析公司 SlashData 發布了一份題為“第 22 屆開發者國家狀況”的報告指出,從 2020 年 Q1 季度到 2022 年 Q1 季度,Rust 語言的開發者用戶量從 60 萬猛增到了 220 萬。TIOBE 編程語言排行榜2022 年 11 月榜單中,Rust 語言進入了前 20 。
可以說,2022 年是 Rust 語言開始廣泛應用的元年。本文就讓我們來盤點一下 Rust 在全球商業化領域的應用狀態。
Rust 基金會成員應用盤點
“Rust 基金會成員投資 Rust ,尤其是白金成員們,是在投資 Rust 的可持續性,他們認為應該使用這種語言來構建可持續且安全節能的解決方案。
白金成員如何應用 Rust
在 AWS,Rust 已迅速成為大規模構建基礎設施的關鍵。Firecracker是一種開源虛擬化技術,為AWS Lambda和其他無服務器產品提供支持,它于 2018 年公開發布。AWS 使用 Rust 來交付Amazon Simple Storage Service(Amazon S3)、Amazon Elastic Compute Cloud(Amazon EC2)、Amazon CloudFront等服務。2020 年,推出了Bottlerocket,這是一個用 Rust 編寫的基于 Linux 的容器操作系統。Amazon EC2 團隊使用 Rust 作為新AWS Nitro 系統組件的首選語言,包括敏感應用程序,例如Nitro Enclaves(用于處理機密數據的隔離 EC2 環境)。
此外,過去一年,Amazon Prime Video 使用了 WASM 和 egui 為超過 8k 多種設備類型更新其應用向數百萬客戶提供內容(例如游戲機、電視、機頂盒和流媒體等)。他們認為對 Rust 和 WebAssembly 的投資得到了回報,經過一年的開發,共編寫了 37,000 行 Rust 代碼,顯著地提高了性能、穩定性和 CPU 消耗并降低了內存利用率。
Google 將 Rust 應用于Chromium、 Android 和 Fuchsia OS 中,其中 Chromium 對 Rust 支持是實驗性的。開發者可以使用 Rust 為 Android 和 Fuchsia OS 開發組件,并且 Rust 在 Android 和 Fuchsia OS 內部代碼使用超過了一定的比例,尤其是 Fuchsia OS 中 Rust 代碼占比已經超過 50%。因為其內部 Cpp 代碼比較多,所以 Google 聯合 Meta (原 Facebook) 一起開發了 cxx 用于和 Cpp 安全交互。在今年 10 月份,Google 又推出基于開源 RISC-V 芯片的嵌入式系統的新型安全操作系統 KataOS。Sparrow 是 KataOS 的參考實現,它運行在seL4 之上,幾乎完全用 Rust 編寫。該操作系統不適用于臺式機或智能手機,而是用于物聯網,可能用于智能家居。目標是為嵌入式硬件或邊緣設備構建可驗證的安全操作系統,例如用于捕獲圖像的網絡連接相機,這些圖像在設備上或云中處理以進行機器學習。在最新發布的 Android 13 版本中,Google 也宣布在 Android 13 中,大約 21% 的新原生代碼(C/C++/Rust)是 Rust。AOSP 中大約有 150 萬行 Rust 代碼,涵蓋新功能和組件。并且,迄今為止,在 Android 的 Rust 代碼中發現的內存安全漏洞為零。 為了實現提高 Android 范圍內的安全性、穩定性和質量的目標,Android 團隊表示需要能夠在代碼庫中需要本地代碼的任何地方使用 Rust。
華為的目標是引領通信系統軟件向安全可信演進,其中 Rust 語言正在發揮很大的作用。華為希望通過部分 C/C++ 代碼的遷移,在保證高性能的同時,擁有更高的安全性。在此過程中, 為開發者提供一套自動化工具支持:基于開源的 C2Rust 轉譯工具, 首先從 C 代碼生成 Rust 代碼, 然后通過源到源變換工具自動重構。在華為內部還基于 Actor 的并發編程模式開發了 Rust 庫,方便程序員充分利用 Rust的語言特性, 例如async/await
等開發異步程序。華為也為 Rust 社區貢獻了許多重要的功能特性。例如,為 Rust 編譯器提交了一系列代碼,使得 Rust 編譯目標可以支持ARM AArch64 32
位大端變體ILP32芯片組, 用于華為的通信產品中。這些改進使得華為和友商可以在這些常用網絡硬件架構上執行Rust 原生程序。這些代碼已經通過華為的 Rust 專家Amanieu d'Antras
提交給了LLVM 編譯器,libc 庫, 以及Rust 編譯器等開源社區。華為國內工程師 李原 也為 Rust 做了很多貢獻,其中包括修復了多個當前并行編譯導致的程序錯誤,(比如串行并行模式在迭代器panic場景的行為一致性、并行編譯死鎖處理的ICE問題)、分析并優化了多個編譯過程中頻繁鎖同步導致并行編譯效率降低的問題(比如生成attributes編號、生成生命周期依賴分析表等等)、優化了編譯器中多處診斷信息的生成,(比如查詢中layout深度限制、錯誤using語句的提示信息、let語句中默認類型的提示信息等),并且在2022年李原主導發起重啟 Rust 編譯器并行編譯工作組,準備為加速 Rust 編譯器并行編譯做出貢獻。
Meta(原Facebook )從 2016 年開始使用 Rust,也就是該語言的 1.0 版發布一年后。Rust 是它用于 Diem(以前的 Libra)穩定幣區塊鏈、Mononoke 源代碼控制服務器和Meta 的“用于區塊鏈的新的安全編程語言”Move的主要語言。 選擇 Rust 而不是 C++ 對 Meta 來說是一個重大決定,因為它的大部分后端代碼都是用 C++ 編寫的,這使其成為顯而易見的選擇。據 Meta 稱,在 Mononoke 被認為取得成功后,Rust 的采用勢頭強勁,吸引了具有 Python 和 JavaScript 背景的工程師。現在,Rust 與 Hack、C++ 和 Python 一起成為主要受支持的服務器端語言。Meta現在建議將 Rust 用于編寫命令行界面 (CLI) 工具和“性能敏感的后端服務”。Meta 內部也針對 Rust 建立了專門的新手訓練營,用于培養 Rust 工程師。Meta 對 Rust 生態的重要貢獻之一是 cxx
,用于 Rust 和 Cpp 之間的安全交互。在 2022年 7 月,Meta 首次宣布 Rust 成為 Meta 支持服務器端使用的編程語言。
Microsoft 擁有世界上最大的 C/C++ 代碼庫之一。從 Windows 和 Office 到 Azure 云,其所有核心產品都在其上運行。從2019年開始,微軟開始尋找內存安全的語言,與此同時,引入了 Rust 進行嘗試。隨后在 GitHub 上開源了 Rust for Windows 庫 ,供 Rust 開發者們無縫地使用 Windows API。此外,Azure 孵化的團隊 DeisLabs 開始嘗試用 Rust 構建 Krustlet 來允許開發人員在 Kubernetes 中運行多個 WebAssembly 模塊的服務。2022 年微軟 Azure首席技術官Mark Russinovich表示,C 和C++不應該用于新項目。“是時候停止使用 C/C++ 啟動任何新項目,并將 Rust 用于那些需要非 GC 語言的場景。為了安全性和可靠性,業界應該宣布這些語言已被棄用”。他在 Twitter 上表示,表達的是個人觀點,而不是微軟的新政策。
“2022 年 DeisLabs 初創團隊離職后出來創業創建了 Fermyon 公司 ,專注于 WebAssembly 云產品。
JFrog 于 2022 年 9 月宣布加入了 Rust 基金會成為白金會員。JFrog 提供了一個DevOps 平臺 ,并且支持多種主流編程語言。JFrog 加入 Rust 基金會的目的就是為了與 Rust 社區和 Rust 基金會合作,幫助保護軟件供應鏈。JFrog 將識別并消除 Rust 平臺和生態系統面臨的安全威脅,并修正 Rust 平臺問題以防止進一步的風險。隨著物聯網(IoT)、云計算和大數據的出現,網絡安全威脅也越來越大。在過去兩年中,Rust 編程語言的使用量增加了兩倍,達到 220 萬開發人員。JFrog 與非營利組織的合作反映了其從最近采用的覆蓋組織軟件供應鏈的安全解決方案中獲益的戰略。
金牌成員如何應用 Rust
Shopify 是加拿大跨國電商公司,在 2022 年 12 月份宣布加入 Rust 基金會,成為基金會第一個金牌會員。Shopify 在服務端一直使用 Ruby 語言,從2021年開始,Shopify 團隊開始使用 Rust 實現YJIT,這是一種新的 CRuby 即時 (JIT) 編譯器 ,到今年合并到了 Ruby 3.1 版本中。在最近的一次性能測試中,YJIT 的性能比 Ruby 解釋器 CRuby 快了 38%。
除此之外, Shopify 也決定采用 Rust 作為公司的系統編程語言,比如編寫高性能網絡服務器。在 Shopify 看來,Rust 的一致性、性能、社區生態、生產力、安全和互操作性是他們采用 Rust 用于系統編程的原因。
銀牌會員及普通贊助商如何應用 Rust
Rust 基金會的銀牌成員逐漸增多,目前已經達到了 28 家公司。這些公司分布在各個領域。此外,還包括三家非會員普通贊助商。在文后的「Rust 其他領域應用」小節將統計他們的應用信息。
Rust 初創產品
2022 年也可以算作是 Rust 創業元年。因為今年陸續有好幾家采用 Rust 的創業公司拿到了巨額融資。
Fermyon
首當其沖的是 Fermyon 技術公司。在今年十月份,Fermyon 宣布拿到了 2000 萬美元的 A 輪融資。并且發布了 Fermyon Cloud 平臺。
Fermyon Cloud 旨在使基于 WebAssembly 的應用程序和微服務的[1]部署變得快速和容易。使用 Fermyon 的 Spin 構建工具(基于 Rust 實現),為 WebAssembly 編譯和打包應用程序,然后可以立即將其部署到 Fermyon Cloud。Fermymon 的工具鏈處理將應用程序代碼投入生產所需的所有基礎設施配置和部署步驟,使應用程序開發人員無需了解有關底層基礎設施的任何信息。
WebAssembly 起源于瀏覽器,針對高安全性和低資源消耗進行了優化。通過將 WebAssembly 引入服務器環境,應用程序可以享受相同的優化,同時使用通用代碼庫部署到各種環境:云、邊緣、物聯網或任何組合。Fermyon 以這些概念為基礎,將 WebAssembly 引入數據中心和云端。Fermyon 希望實現類似于 Java 的“一次編寫,隨處運行”的承諾,同時又具有 Heroku 的易用性。它使開發人員無需過多考慮基礎架構,從而有助于消除應用程序開發中的摩擦。
“使用 Fermyon Spin,開發人員可以快速創建 WebAssembly 微服務應用程序,現在使用 Fermyon Cloud,開發人員可以在不到兩分鐘的時間內從零開始實現并部署應用程序。這是 WebAssembly 在云中實現的承諾:快速開發、快速部署、快速執行。”,Fermyon 的聯合創始人兼首席執行官 Matt Butcher 在一份聲明中如是說。
新終端 Warp
雖然現在的常用的終端模擬器也有很多好用的,比如 Rust 實現的高性能跨平臺現代化終端模擬器alacritty。但它們的內核其實還是一個傳統的終端模擬器。現代開發者,要使用終端做很多事,從構建代碼、執行和部署,與版本控制系統交互到與云端交互等。作為開發者日常離不開的工具,在當下日益增長的開發需求的時代,現在的終端模擬器卻沒有幫助開發者提升更多工作效率。
而 Warp 的出現,讓我看到了終端模擬器進化的下一代形態。Warp 在 2022 年 4 月 5 號推出其公開測試版并宣布獲得 2300 萬美元的資金,它正試圖通過構建一個旨在提高開發人員生產力的新命令行終端來改變這一現狀。Warp 值得關注的功能特性是對團隊協作的支持,可以共享團隊的終端模擬器會話,可以方便地解決團隊之間溝通的問題。其他功能還有很多,包括集成了云端,可以讓團隊方便地共享剪切板等。更多功能可以去這里查看。
我還沒有來得及自己的去挖掘 Warp 的具體功能,但是單從這些功能特性上來看,正如 Figma CEO Dylan 所說,Warp 這個產品和 Figma (在服務端和 wasm 模塊 也使用 Rust)很像,都是All in One,并且連接了云端,為團隊協作提供了很多方便的功能。并且在商業模式上,都屬于產品驅動增長(PLG, Product-led Growth)型公司。事實上,正是 Figma CEO 領投了 Warp ,跟投的還有 Elad Gil (AirBnB、Pinterest、Stripe 和 Square 的早期投資者)、Jeff Weiner(領英執行董事長兼前CEO)和 Marc Benioff(Salesforce 創始人兼 CEO)。Dylan 認為 Warp 和 Figma 正是可以提升用戶十倍工作效率的那種工具,他也承認投資 Warp 有賭博的成分。
Warp 選擇使用 Rust 語言來實現。使用 Rust 技術棧(包括 WebAssembly)也方便構建跨平臺支持。在底層,使用 Metal (Mac 的 GPU API)直接用 GPU 進行 UI 渲染。之所以使用 GPU 進行渲染,是因為團隊想擺脫 CPU 上面的許多軟件和架構瓶頸,來適應更高分辨率的顯示器。選擇 Metal 而不是 OpenGL 作為 GPU API,因為 Warp 把 MacOS 作為第一個平臺。Xcode 中的 Metal 調試工具非常出色,使 Warp 團隊能夠檢查紋理資源并輕松測量幀速率和 GPU 內存大小等重要指標。Mac 平臺現在也是大多數開發者選擇的重要生產力工具。
但是,目前 Rust 對 GPU 支持并不是很完善,沒有開箱即用的合適的 UI 庫。團隊考慮過Azul和Druid,但這兩者都處于實驗階段,所以團隊決定和 Atom 編輯器聯合創始人Nathan Sobo合作,使用他創建的一個受 Flutter 啟發的 Rust UI 框架,不久后應該會開源。在未來,會支持更多的渲染后端,比如OpenGL 和 WebGL(會通過 wasm 支持)。同時也和 Nathan 合作,在 Warp 中構建了一個文本編輯器。Warp 也 fork 了Alacritty的模型代碼,用于處理數據模型,為 Warp 界面中的塊實現提供了幫助。
看得出來,Warp 作為一個商業產品,它并沒有將其產品的全部代碼進行開源。但他們在實現產品過程中,通過解決 Rust GUI 和 GPU 渲染相關的問題,沉淀出一些工具和庫,會以開源的方式貢獻給社區。雖說要走 PLG 路線,開源社區非常重要,但也并不是說盲目地之間把產品全部開源出來。還是要根據自己的商業模式和產品形態做出最好的權衡。
初創數據庫領域公司
今年在數據庫領域的初創公司可以算得上是扎堆出現了。
在 2022 年 4 月,Rust 社區知名開發者 Jon Gjengset 宣布成為ReadySet 公司的聯合創始人,準備將其博士論文中的 Noria 數據庫研究成果進行落地為 ReadySet ,為數據庫提供 SQL 緩存引擎,可幫助開發人員構建高性能的實時應用程序,而無需更改代碼或切換數據庫。該公司目前 A 輪融資 2900 w 美元。
在 2022 年 4月,已經融資千萬美元的數據庫初創企業 Singularity Data Singularity Data(奇點無限公司)宣布開源 Rust 實現的云原生的支持SQL的流式數據庫 RisingWave 。RisingWave 于 2021 年初開始用 Cpp 創建,在七個月之后用 Rust 重寫。對于早期創業公司來說,這是一個瘋狂的決定。特別是在競爭激烈的環境中,對科技初創公司來說,時間幾乎就是一切。
流媒體服務
實時事件流媒體公司 InfinyOn 籌集了 500 萬美元的種子資金,由 Gradient Ventures 和 Fly Ventures 領投,Bessemer Venture Partners、TSVC 等參投。InfinyOn 使用由 Rust 開發的動態數據可編程平臺 Fluvio 。Fluvio 擁有超過 1,000 個 Github star,在開發人員和開源社區中越來越受歡迎。
“在 Java 時代構建的遺留數據平臺會生成大型二進制文件,需要大量內存,并且從邊緣到核心的操作具有挑戰性。這些也缺乏實時決策的在線處理能力,”InfinyOn 的聯合創始人兼首席技術官 Sehyo Chang 說。“我們通過消除對 ETL 工具的需求來簡化數據架構,提供更具成本效益的平臺,內存減少高達 80 倍,并通過內存安全解決方案提供最大的安全性。”
“我們整合來自不同來源的醫療保健數據:物聯網、患者和醫生的輸入。借助 InfinyOn,我們可以使用現代工具快速高效地完成這項工作。它是用 Rust 編寫的,與 Kafka 相比,這使得團隊更容易集成。” Nammu 首席執行官 Chris Brucker 說。
InfinyOn 可以輕松地從多個來源提取、整形和轉換數據,并實時計算結果。雖然仍處于 Beta 階段,但早期采用者已在 InfinyOn 的概念驗證中看到了與替代解決方案相比的顯著優勢。除了易用性和開發速度之外,與其他供應商相比,供應商還看到了總擁有成本的顯著降低。
Rust 其他領域應用
軟件定義汽車:Rust 的關鍵作用
“關鍵字:軟件定義汽車
汽車標準組織 Autosar——其成員包括福特、通用、寶馬、博世、大眾、豐田、沃爾沃等——在 4 月份宣布在其功能安全工作組 (WG-SAF) 中成立一個新的子組,以探索 Rust 如何能夠用于其參考平臺之一。SAE International 還成立了一個工作組來研究汽車行業中與安全相關系統的 Rust 。在 5 月份 Autosar 和 Rust 團隊進行了一次交流 ,探討Safe Rust 在汽車領域是否可以構造一個合規的安全子集,討論內容就是 Ferrocene Rust 安全子集。
“隨后 Autosar 官網撤銷了成立新的 Rust 工作組的新聞,也許是要等待 Ferrocene Rust 的成果。另外,在今年9月份,Volvo 汽車公司的技術專家和系統架構師Julius Gustavsson 接受了采訪,他坦言,想在 Volvo 中推動 Rust 開發。
Ferrocene Rust 安全子集
Ferrous Systems 和 AdaCore 在今年2月份宣布,他們將聯手開發 Ferrocene——一種符合安全要求的 Rust 工具鏈,旨在支持各種受監管市場的需求,例如汽車、航空電子設備、太空和鐵路。這意味著根據各種安全標準對 Ferrocene Rust 編譯器進行汽車安全性等級 ASIL 的 D 級(D 代表最高程度的汽車危險)認證,這項工作最終將包括必要的動態和靜態分析工具的開發和資格認證。Ferrous Systems 和 AdaCore 也在尋找經過安全認證的庫,包括語言支持 (libcore) 或其他用戶庫。我們的目標是針對與這些市場相關的各種架構和操作系統。這一愿景需要時間才能實現,而 Ferrous Systems 和 AdaCore 準備從關注某些特定方面開始。最終,我們的目標是像支持任何其他與高完整性應用程序開發相關的編程語言一樣全面地支持 Rust。Ferrocene 語言規范目前正在制定中,預計年底發布。
其他公司
在 Rust 基金會銀牌會員中還有 ARM 也在致力于推動 Rust 在軟件定義汽車中落地。
即時通信: Threema
“關鍵字:即時通信
Threema 是一款跨平臺、隱私安全且開源的即時通信工具。
密碼管理工具:1Password
“關鍵字:跨平臺
1Password 很早就使用 Rust 來構建其 Windows 客戶端。在 2019 年將其支持瀏覽器擴展的邏輯引擎從 Go 移植到了 Rust ,然后就開始了 Rust 跨平臺的應用實踐。直到 2022 年 11 月,1Password 也開源了其跨多種語言生成一致的類型模式 的 Typeshare 庫。Typeshare 可以幫助開發者實現跨語言無縫同步共享數據類型,這是跨平臺安全開發的利器。
GUI :目標取代 Qt
“關鍵字:Qt、GUI
全球知名Qt咨詢和UI/UX設計服務公司 tQCS 的合作伙伴有兩家都加入了 Rust 基金會銀牌會員。分別是:
- KDBA :在嵌入式系統、3D 圖形以及跨桌面、嵌入式和移動平臺的工作方面擁有多年經驗, KDAB 是 Qt 項目的主要貢獻者。
- Slint: 極大地簡化了取代 Qt 需求的嵌入式平臺的 GUI 開發。支持 Rust/Cpp/Javascript ,有設計友好的 UI 標記語言。其創始人同樣來自 Qt 項目主要貢獻者,QtQml 引擎的主要開發者。
云存儲:Dropbox
“關鍵字:云存儲
Dropbox 是最早使用 Rust 并取得成功的公司之一。Dropbox將 Rust 用于其部分文件同步引擎。以及一個新的視覺交流工具 Dropbox Capture ,旨在使團隊能夠輕松地使用屏幕記錄、視頻信息、屏幕截圖或GIF來異步分享他們的工作。
邊緣計算:Cloudflare
“關鍵字:邊緣計算、serverless
Cloudflare 在其核心邊緣邏輯中使用 Rust 來替代內存不安全的 C。Cloudflare worker 支持 Rust 和 WebAssembly 。在今年 9 月份,Cloudflare 還宣布正在用 Rust 實現一款可以替代 Nginx 的代理服務器 Pingora 。
迪士尼公司(Walt Disney Company)
“關鍵字:WebAssembly 、渲染引擎
迪士尼公司正在用 Rust 構建其 NCP GUI 框架,從迪士尼的這一職位招聘信息中可以得出這一結論。從該公司 2021 年發布的信息“介紹 Disney+ 應用程序開發工具包 (ADK)”來看, 使用 Rust 主要是構建代號為“m5”的 Native Client Platform v2 (NCPv2) 框架。他們選擇了 Rust,以 WebAssembly(WASM) 為目標,以便在限制更新基于 C 的運行時的能力的任何固件更新周期之外簡化 Web 部署和應用程序可更新性。該項目已經持續進行了快三年了,現在已經達到了從手持終端到電視,網頁等全平臺使用同一個渲染引擎來渲染它們的動畫。
特斯拉
“關鍵字:高性能機器人模擬器、固件驗證
雖然馬斯克在今年2月份于推特上面宣稱他是 Rust 語言的粉絲,同時也承認特斯拉主要使用 Cpp 和 Python 。但從今年11月份發布的兩個 Rust 職位來看,特斯拉也開始采用了 Rust 。其中一個是特斯拉機器人模擬引擎團隊的招聘,正在尋找 Rust 開發人員來擴展用 Rust 編寫的高性能機器人模擬引擎。另外一個是 Rust 固件驗證工程師 ,但該職位對于 Rust 的要求只是“有任何 Rust 經驗者優先,但不是必需的”。
Tweedegolf :與太空公司宇宙飛船
“關鍵字:PTP、衛星、宇宙飛船、太空
這次 Rust 真的要上天了。Gama 將發射太陽帆宇宙飛船,并且是公開將 Rust 送入太空的公司之一。提供軟件服務的應該是這家公司:Tweedegolf ,該公司也是 Rust 基金會銀牌會員。他們的開源倉庫里有一個 Rust 實現的 PTP (精確時間協議) 庫,這個PTP一般用在衛星的時間源,比NTP更精確。但這個是 PoC 實現,不知道這次發射的飛船上有沒有用。從另外的項目 嵌入式開發板 pcf85063a (一般用于計時鬧鐘)rust 驅動來看,這次上天的 Rust 程序很可能和精確計時相關。
Gama 太陽帆的衛星于 2023 年 1 月 3 日由 SpaceX 獵鷹 9 號成功送入軌道。
荷蘭 Lightyear 太陽能汽車公司采用 Rust
“荷蘭Lightyear公司將在今年晚些時候開始向客戶交付全球首款可量產的太陽能汽車
在 Tweedegolf 公司的博客網站上透露,由 Lightyear 公司的軟件架構師Jorrit 在 Tweedegolf 公司組織的高科技行業 Rust 線下聚會分享了 Lightyear 公司如何在Lightyear核心平臺的開發中使用 Rust 。可能是隱私原因,并沒有放出該分享的視頻和ppt資料。
文件數據存儲:Qumulo
“關鍵字:混合云文件數據管理
Qumulo(混合云文件數據管理領域領導者) 和 西部數據 這兩家公司是合作企業,通過部署基于西部數據UltrastarTM 大容量HDD和高性能SSD的Qumulo可擴展文件數據平臺,IHME(健康指標與評估研究所)每天可處理高達2PB數據,推進公共流行病研究、統計和預測。Qumulo 贊助了 RustConf 2022 大會。
老牌數據庫公司:PostgreSQL
“關鍵字:數據庫、postgresql
PostgreSQL 贊助了 RustConf 2022 大會,沒有發現 PostgreSQL 公司內部有使用 Rust 的痕跡。但是在 GitHub 有一個致力于用 Rust 編寫 PostgreSQL 擴展的項目 pgx,其中核心開發者 Ana 博客也有很多相關文章。
企業數據分析:Redjack
“關鍵字:數據分析Redjack 號稱來自美國國家情報機構的技術,每年監控和保護超過 8% 的互聯網公共 IP 空間和超過 100 萬億次商業通信,提高可操作的數據使組織能夠提高分析的速度和準確性,從而實現大規模運營的安全性和彈性。Redjack 也贊助了 RustConf 2022 大會,以此推斷 該公司也有采用 Rust 的可能性。
數據科學與人工智能
“數據科學、AI
Rust 基金會銀牌會員中也包括數據科學和人工智能領域的公司:
- Watchful,以傳統標簽解決方案無法實現的速度和規模為 AI 標記數據。
汽車物聯網
“關鍵字:IoT
Wyliodrin 使用Rust,Tock OS和Android保護設備并構建安全高效的系統。將 Rust 嵌入式實時操作系統 Tock OS 推入商業應用中。該公司也加入了Rust 基金會銀牌會員。
消息推送服務商:OneSignal
“關鍵字:消息推送
消息推送服務商 OneSignal 在 2017 年就開始使用 Rust 了,提供了 Rust Client 來支持推送通知、電子郵件、短信和應用內自助式客戶參與解決方案。
自動化貨運列車:Parallel Systems
“關鍵字:貨運自動化列車
自動化貨運列車 Parallel Systems,相信貨運的未來是鐵路,所以研發了零排放的自動化電動貨運跑在鐵路上,Rust 語言是該公司技術棧的通用語言。該公司也贊助了 RustConf 2022 大會。
Rust 開發工具、平臺與工具鏈支持
“關鍵字:開發工具
基于 Rust 實現了一些好用的開發工具,比如:
- tabnine,一款基于機器學習的代碼自動完成開發工具。
- Open Source Security ,該公司加入了Rust 基金會銀牌會員,致力于為 Rust 生態推廣做出貢獻,目前主要是贊助 GCC Rust 的實現。截止到 2022 年 12 月,GCC Rust 前端將在 GCC 13 中合并!
- Embecosm ,提供開源軟件工具鏈和嵌入式操作系統服務。Embecosm 也是 GCC Rust 前端的贊助商。
- grafbase,構建和部署 GraphQL 后端的服務平臺。
- Rust for Linux,Linux 6.1 內核版本合并了初始的 Rust 基礎設施,為未來的內核驅動程序和其他內核代碼啟用 Rust 編程語言打好了基礎。在 11 月 11 號,Rust for Linux 又提交了很多補丁代碼到上游內核中。一旦所有這些 Rust 基礎設施就位,我們將看到在更突出的現實世界驅動程序開始過渡到 Rust 代碼之前需要多長時間,以獲得新的硬件支持或在 Rust 中重寫現有的 C 驅動程序代碼。Rust 在 Linux 內核中的首批主要用戶之一預計將是 Apple M1/M2 圖形的 DRM 驅動程序。
安全監控
“關鍵字:資產安全、事件監控
該領域目前在 Rust 基金會銀牌會員中包括以下公司:
- Spectralops,監控、分類和保護代碼、資產和基礎設施,以防止暴露的 API 密鑰、令牌、憑證和高風險安全錯誤配置。
- Sentry,應用程序監控平臺。
軟件咨詢
“關鍵字:軟件咨詢
目前也涌現出一些 Rust 咨詢公司,下面是加入 Rust 基金會銀牌會員的公司:
- knoldus,
- Ferrous Systems
- mainmatter
- Tag1
游戲 與 渲染引擎
“關鍵字:游戲
Rust 在游戲領域目前還在發展中。游戲公司動視暴雪作為普通贊助商加入了 Rust 基金會,并且在 2021 年發布了一份由動視暴雪旗下工作室 Treyarch 撰寫的 「用于游戲工具的 Rust 編程語言 」 調研報告。Treyarch 自 2018 年以來, 一直在逐步將 Rust 集成到我們的工具和管道中。
另外還有一家值得關注的游戲公司是 Embark,該公司贊助了 Rust 游戲引擎 Bevy 和 Fyrox,并且開源了 rust-gpu 致力于使 Rust 成為 GPU 著色器的一流語言和生態系統。
電商
“關鍵字:電商
Rust 也被用于電商領域。
- 美國最大的家具電商公司 Wayfair 旗下的開源項目 Tremor,已經進入 CNCF。去年 九月份還召開了一次小型的線上的 Tremor Conf 。從2018年開始, tremor 就是跑在了 wayfair生產環境中,每天處理10兆字節的數據,或每分鐘100億條消息,每秒1000萬個指標。tremor 降低了成本,減少了復雜性,鞏固和簡化了操作環境,以激發SRE的樂趣,減少NOC的工作量,并降低運營成本。Rust 為 Wayfair 省掉數千個核心和TB級的內存的成本
- cargurus ,英國的一家二手車電商網站,也成為了 Rust 基金會普通贊助商成員。
Web3 與 區塊鏈
“關鍵字:Web3 、同態加密、隱私計算、區塊鏈、數字貨幣、零知識證明
Rust 在 Web3 和 區塊鏈領域已經成為了主流語言。在這些領域耳熟能詳的公司和項目很多:
- Diem ,前身叫 Libra ,曾經是 Facebook 的穩定幣項目,但是現在已經被 Silvergate Capital Corporation 收購。
- 超新公鏈aptoslabs 和 sui,都是 Diem 團隊成員離職創業的兩個項目,它們的共同點是都使用 Rust 實現的 Move 語言作為智能合約語言。
- parastate,波卡生態多鏈智能合約平臺,是 Rust 基金會銀牌會員。
- Zama,為數據科學和AI構建開源同態加密解決方案,是 Rust 基金會銀牌會員。
- Keyrock ,部署了專有且高度可擴展的數字資產做市技術,是 Rust 基金會銀牌會員。
- matter-labs ,擴展以太坊零知識證明 。
- 日本區塊鏈技術孵化公司 TECHFUND ,也加入了 Rust 基金會銀牌會員。
- 其他。
本節小結
Rust 是一門通用的語言,并且多樣化也是 Rust 語言的設計原則之一。本文試圖通過羅列 Rust 在各個領域的成功應用案例,來幫助人們了解 Rust 適合落地的業務場景。然而,本文遠遠未能覆蓋 Rust 應用的全部角落,還有我們看不到的地方,正在默默地采用 Rust 。本文也幾乎沒有羅列國內使用 Rust 的公司,但國內也有公司準備逐步采用 Rust ,只是進展比較慢。
“P.S 你也可以在 GitHub 上查看別人維護的全球范圍內使用 Rust 的公司列表。
Rust 就像一陣“春雨”,隨風潛入夜,潤物細無聲。感謝閱讀。
Rust 安全參考 | 2022 年 Rust 安全漏洞分類盤點
本文是對 Rust 安全數據庫[1] 中記錄的 Rust 及其生態庫安全問題的梳理。希望可以對廣大 Rust 開發者的代碼安全性有所啟發。
漏洞分類
Rust 安全數據庫中記錄的安全問題分為兩大類:安全漏洞(Vulnerability)和非健全(Unsound)問題。
安全漏洞又具體分為以下幾類:
- 代碼執行(Code Execution)
- 內存損壞(Memory Corruption)
- 權限提升(Privilege Escalation,在操作系統級別或應用程序/庫內部)
- 文件泄露/目錄遍歷(File Disclosure / Directory Traversal)
- 網絡安全(Web Security,例如 XSS、CSRF)
- 格式注入(Format Injection),例如 shell 轉義、SQL 注入(以及 XSS)
- 加密失敗(Cryptography Failure,例如機密性破壞、完整性破壞、密鑰泄漏)
- 隱蔽通道(例如 Spectre、Meltdown)
- 代碼中的恐慌(panic)標榜為“panic-free”(特別是如果對網絡 DoS 攻擊有用)
- 內存暴露(memory-exposure)
- 線程安全(thread-safety)
此外,RustSec 還會對生態庫的健全性[2] 進行跟蹤,而不管它們是否是漏洞。因為 當使用來自安全代碼的 crate 可能導致未定義行為[3]時,往往伴隨著健全性問題。
“健全性(Soundness)是一個類型系統概念(實際上源于邏輯學研究),意味著類型系統在某種意義上是“正確的”,即類型良好的程序實際上具有所需的屬性。對于 Rust,這意味著類型良好的程序不會導致未定義的行為[4]。然而,這個承諾只適用于安全代碼;對于
unsafe
代碼,由程序員來維護這份契約。
對于安全漏洞或非健全問題發生的原因或機制,RustSec 則使用關鍵字來進行標識。但是 RustSec 的關鍵字太多了,所以我對關鍵字也進一步做了一個分類。
分類 | 漏洞機制 | 備注 | 類型 |
---|---|---|---|
memory safety[5] | alias (多個可變借用) | 2022 年還未見有該漏洞 | 漏洞 |
double free | 2022 年還未見有該漏洞 | ||
use-after-free[6] | incorrect-lifetime | 2022 年 一例 RUSTSEC-2022-0028: Vulnerability in neon[7] | 漏洞 |
wasm | 2022 年 一例 RUSTSEC-2022-0016: Vulnerability in wasmtime[8] | 漏洞 | |
segfault | 2022 年 一例 RUSTSEC-2022-0002: Vulnerability in dashmap[9] | 漏洞 | |
memory-layout | cast | 2022 年 一例 RUSTSEC-2022-0052: Unsoundness in os_socketaddr[10] | Unsound |
cell | 2022 年 一例 RUSTSEC-2020-0164: Unsoundness in cell-project[11] | Unsound | |
ddos[12] | oom | 2022 年兩例 RUSTSEC-2022-0055: Vulnerability in axum-core[13] 和 RUSTSEC-2022-0035: Vulnerability in websocket[14] | 漏洞 |
untrust data | 2022 年一例 RUSTSEC-2021-0143: Vulnerability in kamadak-exif[15] | 漏洞 CVSS分 6.5MEDIUM | |
directory-traversal | Windows | 2022 年 兩例:RUSTSEC-2022-0069: Vulnerability in hyper-staticfile[16] 和 RUSTSEC-2022-0043: Vulnerability in tower-http[17] | 漏洞 |
html | xss | 2022 年一例 RUSTSEC-2022-0003: Vulnerability in ammonia[18] | 漏洞 |
integer-overflow | out-of-bounds | 2022 年一例 RUSTSEC-2022-0051: Vulnerability in lz4-sys[19] | 漏洞 CVSS Score 9.8CRITICAL |
out-of-bounds-read | out-of-bounds-read | 2022 年一例 RUSTSEC-2022-0046: Vulnerability in rocksdb[20] | 漏洞 |
side-channel | timing-attack | 2022 年一例 RUSTSEC-2022-0018: Vulnerability in totp-rs[21] | 漏洞 CVSS Score 4.2MEDIUM |
stack-overflow | stack-overflow | 2022 年一例 RUSTSEC-2022-0004: Vulnerability in rustc-serialize[22] | 漏洞 |
subtype | variance/cell | 2022 年一例 RUSTSEC-2020-0164: Unsoundness in cell-project[23] | Unsound |
type-confusion | type-confusion | 2022 年一例 RUSTSEC-2020-0165: Unsoundness in mozjpeg[24] | Unsound |
typosquatting | typosquatting (惡意偽造同名 crate) | 2022 年一例 RUSTSEC-2022-0042: Vulnerability in rustdecimal[25] | 漏洞 |
unaligned-read | windows | 20222 年一例 RUSTSEC-2021-0145: Unsoundness in atty[26] | Unsound |
uninitialized-memory | uninitialized-memory | 20222 年兩例 RUSTSEC-2022-0067: Unsoundness in lzf[27] 和 RUSTSEC-2018-0022: Vulnerability in temporary[28] | Unsound 和 漏洞 |
unsound | covariant | 2022 年一例 RUSTSEC-2022-0007: Unsoundness in qcell[29] | Unsound |
“注:CVSS 即通用漏洞評分系統,參見文后安全術語介紹部分。
CVSS 危害級別劃分:
-
分值范圍
[0.1 - 3.9]
–> 低危害性 -
分值范圍
[4.0 - 6.9]
–> 中危害性 -
分值范圍
[7 - 10]
-> 高危害性
2022 年漏洞分類排行 Top 3
按出現漏洞次數由多到少的漏洞分類排行:
- 內存損壞[30] ,2022 年一共出現 19 個此類安全問題。包括一個嚴重危害等級的漏洞和一個高危害等級的漏洞。導致內存損壞的 Bug 包括:整數溢出、越界訪問、數據競爭(無鎖并發內存順序指定錯誤)、Unsafe Rust 中未做邊界驗證、Use-After-Free 等。
- 拒絕服務[31],2022 年一共出現 14個此類安全問題。包括五個高危害等級的漏洞。導致內存損壞的 Bug 包括:緩沖區溢出、未驗證請求長度、深度嵌套、棧溢出、資源泄露、無限循環等。
- 內存暴露[32] ,2022 年一共出現 9 個此類安全問題。導致該問題的 Bug 包括:越界讀取(驗證不充分)、Use-After-Free 、使用未初始化內存、懸垂指針等。
2022 年安全漏洞摘要介紹
內存相關漏洞
RUSTSEC-2022-0002:dashmap 中的引用出現 UAF
由Ref(和類似類型)的一些方法返回的引用可能會超過Ref并逃脫鎖。這將導致未定義的行為,并可能導致一個段錯誤。
- https://rustsec.org/advisories/RUSTSEC-2022-0002.html[33]
- https://github.com/xacrimon/dashmap/issues/167[34]
RUSTSEC-2022-0008:Windows-rs 中 Delegate 函數缺乏 Send
限定
- https://rustsec.org/advisories/RUSTSEC-2022-0008.html[35]
- https://github.com/microsoft/windows-rs/issues/1409[36]
RUSTSEC-2022-0012: Arrow2 在 Safe 代碼中出現雙重釋放(double-free)
Ffi_ArrowArray
結構體錯誤實現 #derive(Clone)
,因為它是一個 FFi 綁定,實現 Clone 會導致出現兩份指針,從而導致雙重釋放。
- https://github.com/jorgecarleitao/arrow2/issues/880[37]
- https://rustsec.org/advisories/RUSTSEC-2022-0012.html[38]
RUSTSEC-2022-0003: ammonia 中存在格式化注入漏洞
clean_text
中錯誤映射 HTML 的 Form Feed,導致注入漏洞。
lethtml=format!("",clean_text(user_supplied_string));
-
https://github.com/rust-ammonia/ammonia/pull/147[39]
RUSTSEC-2022-0006: thread_local
crate 中的 RawIter::next
存在數據競爭
主要是因為內存順序指定錯誤而引起的,解決起來也比較簡單,修改為正確的內存順序即可。
-
https://rustsec.org/advisories/RUSTSEC-2022-0006.html[40]
-
https://github.com/Amanieu/thread_local-rs/issues/33[41]
RUSTSEC-2022-0016:wasmtime
的 externref
在啟用 epoch
中斷時會導致 UAF
epoch 中斷會導致 wasmtime 在執行 GC 時錯誤回收還在使用的內存,從而導致 UAF。
-
https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-gwc9-348x-qwv2[42]
-
https://rustsec.org/advisories/RUSTSEC-2022-0016.html[43]
DoS 漏洞
RUSTSEC-2022-0004:rustc_serialize
解析深度嵌套的 JSON 時棧溢出
該漏洞會導致 DoS(denial-of-service)風險。
//觸發漏洞示例代碼
fnmain(){
let_=rustc_serialize::from_str(&"[0,[".repeat(10000));
}
推薦使用 serde 作為 rustc_serialize 的替代品。
https://rustsec.org/advisories/RUSTSEC-2022-0004.html[44]
Unsound
RUSTSEC-2022-0007: qcell crate 中 TCell
或 TLCell
的內存能被惡意代碼訪問
因為生命周期參數型變未使用正確而引起的問題,導致惡意代碼可以對同一片內存獲取兩個可變引用。解決方法是把類型參數的協變(Covariant)改為不變(Invariant)。
structInvariant(fn(T)->T);
pubstructTCellOwner'static>{
//AllowSendandSync,andQisinvariant
typ:PhantomData>,
}
pubstructTCellSized>{
//useInvariantforinvariantparameter,notinfluencing
//otherauto-traits,e.g.UnwindSafe(unlikeothersolutionslike`*mutQ`or`Cell`)
owner:PhantomData>,
//It'sfinetoSendaTCelltoadifferentthreadifthecontainted
//typeisSend,becauseyoucanonlysendsomethingifnothing
//borrowsit,sonothingcanbeaccessingitscontents.
//
//`UnsafeCell`disables`Sync`andalreadygivestheright`Send`implementation.
//`Sync`isre-enabledbelowundercertainconditions.
value:UnsafeCell,
}
-
https://rustsec.org/advisories/RUSTSEC-2022-0007.html[45]
-
https://github.com/uazu/qcell/issues/20[46]
RUSTSEC-2022-0010:Enum錯誤實現 trait時 enum_map 宏可能會導致 UB
enum_map!
受影響版本在使用宏時未正確檢查枚舉的長度,信任用戶提供的長度。
當Enum
trait 中的 LENGTH
與 EnumArray
trait 中的數組長度不匹配 時,可能會導致枚舉映射初始化為未初始化的類型,進而允許攻擊者執行任意代碼。
這個問題只能在手動實現 Enum trait 時發生,它永遠不會發生在使用#[derive(Enum)].
觸發此漏洞的示例代碼如下所示:
enumE{
A,
B,
C,
}
implEnumforE{
//LENGTH長度不等于EnumArray長度
constLENGTH:usize=2;
fnfrom_usize(value:usize)->E{
matchvalue{
0=>E::A,
1=>E::B,
2=>E::C,
_=>unimplemented!(),
}
}
fninto_usize(self)->usize{
selfasusize
}
}
implEnumArrayforE{
typeArray=[V;3];
}
let_map:EnumMapString>=enum_map!{_=>"Hello,world!".into()};
-
https://rustsec.org/advisories/RUSTSEC-2022-0010.html[47]
-
https://gitlab.com/KonradBorowski/enum-map/-/blob/master/CHANGELOG.md#version-202[48]
Rust 官方安全通告
Cargo 安全公告
在 2022 年 9月份,Rust 安全響應工作組被告知 Cargo 沒有阻止提取從備用注冊表下載的一些格式錯誤的包。當 Cargo 下載包時,能夠將包上傳到備用注冊表的 攻擊者可能會填滿文件系統或損壞任意文件。這些問題已分配給 CVE-2022-36113 和 CVE-2022-36114。這些漏洞的嚴重性對于備用注冊表的用戶來說是“低”的。依賴crates.io[49]的用戶不受影響。
-
任意文件損壞 (CVE-2022-36113)。Cargo 允許包包含一個
.cargo-ok
符號鏈接,Cargo 將提取該鏈接。然后,當 Cargo 嘗試將 “ok”寫入“.cargo-ok”時,它實際上會將符號鏈接指向的文件的前兩個字節替換為“ok”。這將允許攻擊者使用 Cargo 提取包來破壞機器上的一個文件。
-
磁盤空間耗盡 (CVE-2022-36114)。Cargo 沒有限制從壓縮檔案中提取的數據量。攻擊者可以將一個特制的包上傳到備用注冊表,該 包提取的數據遠遠超過其大小(也稱為 “zip 炸彈”),使用 Cargo 耗盡計算機上的磁盤空間下載包。
這兩個漏洞都存在于 Cargo 的所有版本中。Rust 1.64 已包括對它們的修復。
Regex 安全公告
在 2022 年 3月份,Rust 安全響應工作組被告知 regex
包沒有正確限制它解析的正則表達式 (regex) 的復雜性。攻擊者可以利用此安全問題執行拒絕服務,方法是
將特制的正則表達式發送到接受不受信任的正則表達式的服務。使用受信任的正則表達式解析不受信任的輸入時,不存在已知漏洞。此問題已分配為 CVE-2022-24713。當 regex
包用于解析不受信任的正則表達式時,此漏洞的嚴重性 為“高”。regex
crate 的其他用途不受此漏洞影響。
建議使用 regex 1.5.5 版本及之上的版本。
安全術語介紹
CVSS 通用漏洞評分系統[50] (Common Vulnerability Scoring System, CVSS)。旨在評估安全漏洞的嚴重性,是全球各組織使用的公開標準。該標準由FIRST制定,并由其組織團隊SIG(The CVSS Special Interest Group)改進和推廣。
通過漏洞難易程度以及對機密性、完整性、可用性的影響綜合評估后,生成一個0到10分之間的評分值,此分值即是CVSS得分。CVSS 主要用于評估漏洞的嚴重性,而不是對風險的評估。風險評分是需要每個企業根據企業特性的風險要素,進行識別后再進行風險判別。
CVSS 通過三個方面進行評估:
-
基礎得分(Base Score):根據漏洞的固有特征反映漏洞的嚴重程度,不受時間因素影響,并假定在不同部署環境中產生合理的最壞情況的影響;
-
時間得分(Temporal Score):評價漏洞被利用的時間窗的風險大小,比如官方發布了補丁則會降低評估分數;
-
環境得分(Environment Score):需要在特定環境下評估。通常由最終用戶根據自己的使用環境給出。使用業界通用的CVSS標準需遵循以下原則:
-
一般使用CVSS基礎得分進行漏洞嚴重等級評估;
-
評估時必須基于攻擊場景,且攻擊后能對系統造成了機密性、完整性、可用性的影響;
-
有多個攻擊場景時,最終得分選擇最高得分場景;
-
被嵌入調用的庫存在漏洞,要根據該庫在產品中的使用方式,確定漏洞的攻擊場景后進行評估;
-
不考慮攻擊目標的環境緩解措施(如設置防火墻),以體現漏洞真實嚴重程度;
-
不考慮特定配置,即如果攻擊成功需要特定的配置則在該配置存在的情況下進行評分;
-
安全缺陷不能被觸發的場景或不影響CIA(機密性/完整性/可用性),CVSS評分為0分。
審核編輯 :李倩
-
生態系統
+關注
關注
0文章
701瀏覽量
20709 -
程序編譯
+關注
關注
0文章
9瀏覽量
5456 -
Rust
+關注
關注
1文章
228瀏覽量
6572
原文標題:Rust 安全參考 | 2022 年 Rust 安全漏洞分類盤點
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論