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

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

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

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

[復(fù)制鏈接]

427

主題

427

帖子

2834

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2834
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 昨天 09:02 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方“C語(yǔ)言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號(hào)
干貨福利,第一時(shí)間送達(dá)!
最近有小伙伴說(shuō)沒(méi)有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,導(dǎo)致沒(méi)有星標(biāo)公眾號(hào)的小伙伴刷不到當(dāng)天推送的文章,無(wú)法接收到一些比較實(shí)用的知識(shí)和資訊。所以建議大家加個(gè)星標(biāo)??,以后就能第一時(shí)間收到推送了。

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

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

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

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

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


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

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

本版積分規(guī)則

關(guān)閉

站長(zhǎng)推薦上一條 /1 下一條


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