電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 72|回復: 0
收起左側(cè)

Android 全力押注 Rust,Linux 卻在原地踏步?谷歌:用 Rust 重寫固件太簡單了!

[復制鏈接]

454

主題

454

帖子

3643

積分

四級會員

Rank: 4

積分
3643
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-21 09:02:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
點擊上方“C語言與CPP編程”,選擇“關注/置頂/星標公眾號
干貨福利,第一時間送達!
最近有小伙伴說沒有收到當天的文章推送,這是因為微信更改了推送機制,導致沒有星標公眾號的小伙伴刷不到當天推送的文章,無法接收到一些比較實用的知識和資訊。所以建議大家加個星標??,以后就能第一時間收到推送了。

編譯 | 核子可樂、Tina | 轉(zhuǎn)自 InfQ谷歌最近使用 Rust 編程語言重寫了 Android 虛擬化框架中受到保護的虛擬機固件,并且建議涉及固件處理項目的開發(fā)者也同樣積極擁抱這種內(nèi)存安全語言。
                1 Rust 在 Linux 上遇阻,但在 Android 上受寵        在谷歌發(fā)布的博客中,Android 工程師 Ivan Lozano 和 Dominik Maier 深入研究了使用 Rust 替換舊版 C 和 C++ 代碼的技術細節(jié)。
Lozano 和 Maier 介紹稱,“大家可以看到,使用 Rust 代碼來提高安全性其實相當簡單易行,我們甚至會演示 Rust 工具鏈如何應對特殊的裸機目標!

對于 Rust 這樣一門以學習難度高而聞名的編程語言來說,“簡單易行”的說法似乎有點超出普遍認知。
另外,讓 C 和 C++ 開發(fā)人員嘗試用 Rust 的視角觀察世界同樣困難重重。就在上周,Rust for Linux 項目的一位維護者剛剛選擇辭職(此項目旨在將 Rust 代碼納入基于 C 的 Linux 內(nèi)核),理由就是 Linux 內(nèi)核開發(fā)人員對 Rust 的強烈抵制。
在今年早些時候,一位 Linux 內(nèi)核貢獻者在某場技術會議的熱烈討論中明確表示,“不會吧,你們不會強迫我們所有人都學習 Rust 吧。”
盡管受眾態(tài)度并不積極,但谷歌還是對潛在支持者拿出了足夠的耐心和鼓勵。Lozano 和 Maier 指出,以往的固件通常使用內(nèi)存不安全語言(例如 C 和 C++)編寫而成,因此缺乏高級安全機制。而 Rust 提供了一種避免內(nèi)存安全漏洞(包括緩沖區(qū)溢出和釋放后使用)的方法,成功阻遏了這些在大規(guī)模代碼庫中占據(jù)多數(shù)的重大漏洞來源。
他們強調(diào)稱,“Rust 提供了一種內(nèi)存安全的 C 和 C++ 替代方案,有著足以與之媲美的性能表現(xiàn)和代碼體量!贝送猓琑ust 還支持與 C 代碼的互操作性,且不會帶來任何額外開銷。
就連美國政府最近也一直在強調(diào)這個議題,并在各領先科技企業(yè)及非營利項目的支持下,嘗試用 Rust 語言重寫關鍵開源項目及組件。去年,網(wǎng)絡安全與基礎設施安全局(CISA)就建議軟件供應商“將有關法律并最終消除其產(chǎn)品線中的內(nèi)存安全漏洞,作為公司的最高目標之一!
谷歌已經(jīng)接受了這一觀點,今年 3 月,谷歌得出結論稱,其 Rust 開發(fā)人員的生產(chǎn)力已經(jīng)達到 C++ 工程師的兩倍。
谷歌 Android 編程語言工程總監(jiān)兼 Rust 基金會董事會主席 Lars Bergstrom 也表態(tài)說,“我們意識到 Rust 在構建技術棧各個層面的安全可靠軟件方面,正在發(fā)揮極其關鍵的作用。”
“在谷歌,我們正推動在 Android、Chromium 等平臺上使用 Rust 語言,借此減少內(nèi)存安全漏洞。我們還致力于同 Rust 生態(tài)系統(tǒng)開展合作、推動語言落地,并為開發(fā)人員提供順利遷移所必需的資源和培訓支持。這波將 Rust 引入嵌入式及固件開發(fā)的嘗試,解決了技術棧中又一關鍵安全難題!

有網(wǎng)友指出,Rust 在 Android 上進展順利的關鍵就在于 Lars Bergstrom 的態(tài)度:
“我們來看一下這位的頭銜:谷歌 Android 編程語言工程總監(jiān),同時也是 Rust 基金會董事會主席。我認為,將 Android 系統(tǒng)全面采用 Rust 語言的進程可能會比 Linux 內(nèi)核更順利推進,因為他是負責人,有權解雇那些不按要求進行 Rust 改造的人!
而在 Linux 圈子里,Alex Gaynor 和 Geoffrey Thomas 在 2019 年 Linux 安全峰會上表示,大約三分之二的 Linux 內(nèi)核漏洞源于內(nèi)存安全問題。而 Rust 理論上可以通過其本質(zhì)上更安全的應用程序接口(API)完全避免這些問題。
Torvalds 對這一切怎么看?早幾年的時候,他屬于“觀望派”——“我對這個項目感興趣,但我認為它是由對 Rust 非常熱衷的人推動的,我想看看它在實際中會如何運作!
Torvalds 還表示:“個人而言,我并不在‘推動’Rust 的行列中,但考慮到它所承諾的優(yōu)勢和避免一些安全隱患的可能性,我對它持開放態(tài)度,不過我也清楚有時承諾未必能兌現(xiàn)!
去年底,在 Linux 基金會的日本開源峰會上,Linus Torvalds 和 Dirk Hohndel(Verizon 開源部門負責人)討論了 Rust 語言在 Linux 內(nèi)核中的使用,Torvalds 表示,“Rust 的使用在不斷增長,但目前我們還沒有任何內(nèi)核部分真正依賴 Rust。對我來說,Rust 是一個在技術上合理的東西,但對我個人而言,更重要的是,我們作為內(nèi)核和開發(fā)者,不能停滯不前!

這個表達有人解讀為“Linus 個人對 Rust 不是那么贊賞,但 Linux 總需要嘗試一些新的東西”。
另一方面也有人反駁說,“如果 Linus 沒有從根本上相信 Rust 是一種應該在內(nèi)核中占有一席之地的語言,那么 Rust 也不會獲得內(nèi)核支持!
在今年的 KubeCon 上,Linus Torvalds 和 Dirk Hohndel 再次談到了如何將 Rust 語言引入 Linux。Torvalds 對 Rust 的應用速度未能如預期般加快感到失望,“我原本指望著更新速度會更多,但問題在于不少老一代內(nèi)核開發(fā)人員更習慣于使用 C 語言,而不太熟悉 Rust。他們不太愿意學習一種在某些方面與老辦法截然不同的新語言。因此,Rust 的普及受到了一些阻力!
除此之外,Torvalds 還評論道,“另一個原因在于,Rust 自身的基礎也并不是十分牢靠!笨梢哉f,相比 Lars Bergstrom,實際上 Torvalds 對 Rust 的態(tài)度一直很審慎。
                2 作為 Android 的新默認語言,Rust 的推進一直很順利        2021 年,谷歌宣布將 Rust 選定為 Android 開源項目(AOSP)代碼新貢獻的默認語言。
谷歌在 Android 項目中使用的其他內(nèi)存安全語言還包括 Java 以及與 Java 兼容的 Kotlin。C 和 C++ 仍然是 AOSP 中的主導語言,但 Android 13 是首個大部分新代碼都由內(nèi)存安全語言編寫的版本。在谷歌于 2021 年 4 月首次將 Rust 用于 AOSP 之后,短短一年后,這種編程語言在新代碼貢獻量中就占比約 21%。
在 Android 的新代碼中使用 Rust,也是為了減少與內(nèi)存相關的漏洞。2019 年發(fā)布的 Android 10 版本存在 223 項內(nèi)存安全漏洞,而 Android 13 的已知內(nèi)在安全問題已經(jīng)大幅減少至 85 個。
Android 安全軟件工程師 Jeffery Vander Stoep 于 2022 年指出,內(nèi)存安全漏洞占 Android 總漏洞的比例從 76% 下降到了 35%。隨著內(nèi)存安全漏洞的減少,谷歌還發(fā)現(xiàn)關鍵及遠程可利用漏洞的數(shù)量同樣有所縮減。
Vander Stoep 補充說,這一變化并非源自代碼貢獻者的“靈光乍現(xiàn)”,只是人們開始使用更好的工具來完成工作。Android 團隊計劃加強對 Rust 的使用,但這也并不意味著要在其系統(tǒng)編程中徹底淘汰 C 和 C++。
他在推文中解釋道,“如果一定要為此番成就找個理由,那我個人的答案就是‘謙遜’。Android 團隊中的各個部門都一直在關注‘我們怎樣才能做得更好’這個關鍵問題,同時也有毅力堅持到底并做出改變,包括系統(tǒng)層面的變革!
“謙遜本身也應該是雙向的。Rust 并不能解決所有問題,C/C++ 在某些領域仍將是開發(fā)實踐中最實用的選擇,至少在相當長的一段時間內(nèi)依舊如此。這很正常!
“我們將隨時間推移努力減少這種情況,同時繼續(xù)擴大我們的 Rust 使用率,并不斷投資和部署對 C/C++ 代碼的改進。”
Vander Stoep 還提到,相關性也并不等同于因果關系,但必須承認內(nèi)存安全漏洞的百分比(即在高嚴重性漏洞中的比例)確實與新代碼使用的語言類型有著很強的關聯(lián)趨勢。谷歌表示,模糊測試等安全工具也在打擊內(nèi)存安全漏洞方面貢獻了重要力量。
Vander Stoep 表示,“我們將繼續(xù)投資于工具開發(fā)以提高項目的 C/C++ 安全性。在過去幾個版本當中,我們在生產(chǎn) Android 設備上引入了 Scudo 強化分配器、HWASAN、GWP-ASAN 以及 KFENCE。我們還在現(xiàn)有代碼庫當中擴大了模糊測試的覆蓋范圍。使用這些工具發(fā)現(xiàn)的漏洞既有助于預防新代碼中出現(xiàn)類似的問題,也有助于在上述評估中及時揪出舊代碼中存在的漏洞。這些重要工具對我們的 C/C++ 代碼至關重要。然而,單憑這些還不足以解釋我們從安全漏洞中觀察到的趨勢性變化,其他同樣部署了這些技術的項目也并未發(fā)生如此重大的結構性變化。因此我們認為,Android 從內(nèi)存不安全語言向著內(nèi)存安全語言的持續(xù)轉(zhuǎn)變才是改善其安全態(tài)勢的一大核心因素!
他當時還指出,Android 13 中共包含 150 萬行 Rust 代碼,約占所有代碼新貢獻的 21%(Android 本身有數(shù)千萬行代碼)。而且谷歌也沒有在 Android 的 Rust 代碼中發(fā)現(xiàn)任何內(nèi)存安全漏洞。
Vander Stoep 指出,“這表明 Rust 語言正一步步實現(xiàn)其預期目標,即防止 Android 中最常見的漏洞來源。在 Android 的不少 C/C++ 組件(包括媒體、藍牙和 NFC 等)當中,過往內(nèi)存漏洞的密度已經(jīng)超過了 1/kLOC(即每千行代碼一個漏洞)。以這樣的歷史水平為基準,對 Rust 語言的使用很可能已經(jīng)將數(shù)百個漏洞阻擋在了生產(chǎn)環(huán)境之外。”
在 Android 項目之內(nèi),谷歌使用 Rust 建立用戶空間硬件抽象層(HAL),并在越來越多的受信應用程序之內(nèi)添加對 Rust 的支持。去年,谷歌還曾發(fā)布過公告,表示他們用 Rust 編程語言重新實現(xiàn)了 Linux 內(nèi)核中的 Android Binder 代碼,Binder 負責進程間通信(IPC)等任務。與 C 版 Binder 相比,Rust Binder 的 IPC 基準測試結果顯示出良好的前景,但仍需在實際工作負載下進行進一步測試。至少在 Binder 吞吐量的基準測試中,Rust 版本與 C 版本的性能差異約為±2%。
如今谷歌進一步在現(xiàn)有固件代碼庫中部署了 Rust。
根據(jù)谷歌軟件工程師 Ivan Lozano 和 Dominik Maier 的文章,使用 C 和 C++ 編寫的舊固件代碼庫可以通過“直接替換為 Rust”來受益,以保證操作系統(tǒng)底層敏感層的內(nèi)存安全。
“我們希望證明這種方法對于固件是可行的,能夠以高效且有效的方式實現(xiàn)內(nèi)存安全,”Android 團隊表示。
“固件充當硬件和高級軟件之間的接口。由于缺乏高級軟件中標準的軟件安全機制,固件代碼中的漏洞可能會被惡意攻擊者危險地利用,”谷歌警告說,并指出現(xiàn)有的固件由用內(nèi)存不安全的語言(如 C 或 C++)編寫的龐大的傳統(tǒng)代碼庫組成。
“簡單地用 Rust 編寫任何新代碼都可以減少新漏洞的數(shù)量,并隨著時間的推移減少現(xiàn)有漏洞的數(shù)量,”Android 軟件工程師表示,建議開發(fā)人員通過編寫一個薄的 Rust shim 來替換現(xiàn)有的 C 功能,該 shim 在現(xiàn)有 Rust API 和代碼庫期望的 C API 之間進行轉(zhuǎn)換。
“shim 作為 Rust 庫 API 的包裝器,連接了現(xiàn)有的 C API 和 Rust API。當用 Rust 替代重寫或替換現(xiàn)有庫時,這是一種常見的做法!
參考鏈接:
https://www.theregister.com/2024/09/06/google_rust_c_code_language/
https://security.googleblog.com/2024/09/deploying-rust-in-existing-firmware.html
https://www.zdnet.com/article/google-after-using-rust-we-slashed-android-memory-safety-vulnerabilities/
https://www.reddit.com/r/rust/comments/18e6qrl/linus_on_rust_in_the_linux_kernel_december_2023/
https://www.phoronix.com/news/Google-Linux-Binder-In-Rust
——EOF——你好,我是飛宇。日常分享C/C++、計算機學習經(jīng)驗、工作體會,歡迎點擊此處查看我以前的學習筆記&經(jīng)驗&分享的資源。
我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進群交流。

歡迎你添加我的微信,我拉你進技術交流群。此外,我也會經(jīng)常在微信上分享一些計算機學習經(jīng)驗以及工作體驗,還有一些內(nèi)推機會。


加個微信,打開另一扇窗
經(jīng)常遇到有讀者后臺私信想要一些編程學習資源,這里分享 1T 的編程電子書、C/C++開發(fā)手冊、Github上182K+的架構路線圖、LeetCode算法刷題筆記等精品學習資料,點擊下方公眾號會回復"編程"即可免費領取~
感謝你的分享,點贊,在看三  

回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表