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

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

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

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

[復(fù)制鏈接]

475

主題

475

帖子

4237

積分

四級會員

Rank: 4

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

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

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

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

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

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


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

回復(fù)

使用道具 舉報

發(fā)表回復(fù)

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

本版積分規(guī)則


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