谷歌稱用 Rust編寫代碼,五年漏洞數下降了68%
從 Android 12 開始,Google 就在 Android 系統中帶來了 Rust 語言的支持,作為 C/C++ 的替代方案,他們的目標并不是把現有的 C/C++ 代碼都轉換成為 Rust,而是在新編寫的代碼中使用 Rust 語言開發。 通過將越來越多的 Rust 代碼集成到其 Android 操作系統中,Google 在減少漏洞方面的努力最終是獲得了回報。
根據谷歌發布的最新公告:在過去五年的Android 系統版本中,內存安全漏洞的數量大幅下降了68%。這遠遠低于之前在 Chromium 中發現的 70%,使安卓成為大型項目如何在不破壞向后兼容性的情況下逐步、有條不紊地轉向安全領域的絕佳范例。
谷歌表示,實現這一結果的方法是優先使用 Rust 等內存安全語言編寫新代碼,從而隨著時間的推移最大限度地減少新漏洞的引入。與此同時,對舊代碼也進行了最小限度的修改,重點放在重要的安全修復上,而不是進行大范圍的重寫,因為重寫也會破壞互操作性。
谷歌在報告中寫道:根據我們所了解到的情況,很明顯,我們不需要丟棄或重寫所有現有的內存不安全代碼。相反,Android 正專注于將互操作性的安全和便捷作為我們內存安全之旅的主要能力。
多年來的安卓內存安全,資料來源:谷歌
隨著時間的推移,這種策略會使舊代碼變得更加成熟和安全,從而減少與內存相關的漏洞數量,無論這些漏洞是用哪種語言編寫的。
Android 構建策略中的這兩大支柱產生了協同效應,使世界上使用最廣泛的移動平臺的內存漏洞大幅減少。
谷歌解釋說,雖然讓舊代碼基本保持不變似乎有風險,而且新代碼有望得到更好的測試和審查,但事實恰恰相反,盡管這似乎有違直覺。
這是因為最近的代碼修改引入了大多數漏洞,因此新代碼幾乎總是包含安全問題。與此同時,除非開發人員對舊代碼進行大量修改,否則舊代碼中的漏洞就會被消除。
內存漏洞概率與代碼壽命的關系,來源:谷歌
谷歌表示,包括其自身在內,業界在處理內存安全漏洞方面主要經歷了以下四個階段:
- 被動打補?。鹤畛醯闹攸c是在發現漏洞后進行修復。這種方法導致持續的成本,因為需要頻繁更新,而用戶在此期間仍然容易受到攻擊。
- 主動緩解:下一步是實施策略,增加漏洞利用的難度(如堆棧金絲雀、控制流完整性)。然而,這些措施往往需要犧牲性能,并導致與攻擊者之間的貓鼠游戲。
- 主動發現漏洞:這一代人使用模糊處理和消毒器等工具主動發現漏洞。這種方法雖然有用,但只能治標,需要持續的關注和努力。
- 高保障預防(安全編碼): 最新的方法強調通過使用 Rust 等內存安全語言從源頭上預防漏洞。這種 “設計安全 ”方法提供了可擴展的長期保證,打破了被動修復和代價高昂的緩解措施的循環。
- 谷歌解釋稱:通過這些方法,整個行業的產品都得到了顯著增強,我們將繼續致力于應對、緩解和主動查找漏洞。
盡管如此,越來越明顯的是,這些方法不僅不足以在內存安全領域達到可接受的風險水平,而且還會給開發人員、用戶、企業和產品帶來持續且不斷增加的成本。
正如包括 CISA 在內的眾多政府機構在其 “按設計保證安全 ”報告中所強調的,只有采用按設計保證安全的做法,我們才能打破不斷創建和應用修復程序的惡性循環”。
去年 6 月,美國網絡安全和基礎設施安全局(CISA)警告說,在使用最廣泛的開源項目中,有 52% 使用了內存不安全的語言。
即使是用內存安全語言編寫的項目,也往往依賴于用內存不安全語言編寫的組件,因此安全風險的解決非常復雜。
CISA 建議軟件開發人員使用 Rust、Java 和 GO 等內存安全語言編寫新代碼,并將現有項目,特別是關鍵組件過渡到這些語言。