白宮發文,呼籲開發者放棄C、C++:Rust被「欽點」內存安全

機器之心報道

編輯:杜偉、小舟

近日,在一份 19 頁的報告《迴歸基礎構件:通往安全軟件之路》中,白宮國家網絡主任辦公室(ONCD)呼籲開發者使用「內存安全的編程語言」,比如 Rust 語言。報告指出,從一開始就選擇內存安全的編程語言,是以安全設計方式開發軟件的重要途徑。

此外,ONCD 表示,報告中的建議是與包括科技公司、學術界和其他機構合作制定的,並收集了包括惠普、埃森哲和 Palantir 在內等多家科技公司支持報告的意見。

報告地址:https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf

其實,這並不是美國官方機構第一次呼籲放棄使用 C 和 C++ 了。

去年 12 月,美國網絡安全和基礎設施局(CISA)聯合其他機構頒發了一份《內存安全路線圖指南》, 其中就指出了 C 和 C++ 是內存不安全的編程語言,並呼籲軟件開發商採用 Rust、Java 等其他內存安全的編程語言。

來源:https://www.cisa.gov/sites/default/files/2023-12/The-Case-for-Memory-Safe-Roadmaps-508c.pdf

放棄 C、C++,轉向 Rust,只爲內存安全

既然強調了要使用內存安全的編程語言,那首先來了解一下什麼是內存安全。所謂內存安全是指防止處理內存訪問時出現 bug 和漏洞,比如緩衝區溢出和懸空指針。

內存不安全的危害有多大呢?2019 年,微軟安全工程師報告的數據是:大約 70% 的安全問題是由內存安全問題引起的。2020 年,谷歌針對在 Chromium 瀏覽器發現的 bug 也報告了類似的數據。

對於編程語言而言,C 和 C++ 都允許使用直接內存地址來進行任意指針運算,並且沒有邊界檢查。報告中指出,專家發現了一些編程語言既缺乏與內存安全相關的特徵,又在一些關鍵系統中具有高度擴散性,以 C 和 C++ 爲代表。因此,C 和 C++ 被認爲是「不安全的」編程語言。

與 C 和 C++ 相對應,Rust 被認爲是內存安全編程語言的典型示例。Rust 是一門系統編程語言,專注於安全,尤其是併發安全。它支持函數式和命令式以及泛型等編程範式的多範式語言,且 TensorFlow 等深度學習框架也把它作爲一個優秀的前端語言。

在程序員問答網站 Stack Overflow 2021 年度開發者調查報告中,Rust 語言成爲最受開發者喜愛的編程語言。Rust 在系統編程領域很受歡迎,原因之一就是它可以幫助消除與內存相關的安全漏洞。

Rust 內存安全的特性早已得到業內驗證。2021 年 4 月,谷歌就宣佈 Android 加入對 Rust 語言支持。原因是 C 和 C++ 中的內存安全 bug 是最難解決的錯誤源,谷歌已經投入了大量的精力和資源來檢測、修復和緩解這類 bug,並有效地防止了大量 bug 進入 Android 版本。

然而,儘管做出了這些努力,內存安全 bug 仍然是穩定性問題的主要原因,它在 Android 嚴重安全漏洞中長期佔據大約 70% 的比例。因此,谷歌爲操作系統開發者增加了第 3 個選擇 Rust。

華盛頓大學計算機科學教授 Dan Grossman 表示,幾十年來,大家都瞭解 C 和 C++ 的危險,現在終於迎來了推動內存安全編程語言的好時機,畢竟已經有了實用且成熟的替代方案。

他也認爲,擺脫 C 和 C++ 並不是一朝一夕就能完成的,尤其是在嵌入系統中。不過,隨着 Rust 等其他編程語言在系統軟件中的更廣泛應用, 這一進程預計會加快。

對於官方對 C 和 C++ 的態度,更多的人似乎並不買賬。

有人認爲現代 C++ 是內存安全的,所有操作系統都使用 C 或者 C++ 進行編程。也有人認爲,即使 C++ 不能算是內存安全,但現代 C++ 擁有更多的「護欄」,並且成本低甚至不用花錢。

對於被「欽點」內存安全的 Rust,有人覺得它的支持程度沒有那麼高,也不值得集成到政府系統中。

除了 Rust,內存安全編程語言還有哪些

2022 年 11 月,美國國家安全局 (NSA) 發佈了一份網絡安全信息表,詳細介紹了它認爲內存安全的編程語言

以上這些編程語言的流行度如何呢?2024 年 2 月的編程語言流行度指標 TIOBE 顯示,在編程方面,Python 排名第一,C# 排名第五,Java 排名第四,JavaScript 排名第六,Go 排名第八,Delphi/Object Pascal 排名第 12,Swift 排名第 16,Rust 排名第 18,Ruby 勉強排名第 20。

可以看到,大多數 NSA 選擇的語言都在前 20 名中,只有 Ada 不在,但前十名只有 5 種。

來源:https://www.tiobe.com/tiobe-index/

該報告還呼籲更好地衡量軟件安全性。ONCD 認爲:更好的衡量標準使技術提供商能夠在漏洞成爲問題之前更好地規劃、預測和緩解漏洞。

這份報告還回顧了阿波羅 13 號任務,NASA 將這次任務歸類爲「成功的失敗」。該任務本身遭遇了災難性的失敗,三名宇航員臨時進行維修並緩解了一些問題,以便安全返回家園。該報告指出:內存安全代碼對於太空計劃來說是非常重要的。人類探索太空應該使用一種內存安全語言,一種儘可能接近內核的語言,以免將來發生事故。

隨着世界上越來越多的地方變得數字化,更好的編碼變得越來越重要,不良代碼可能會被惡意使用。

Rust 語言

Rust 語言是由 Mozilla 主導開發的通用、編譯型編程語言。設計準則爲「安全、併發、實用」,支持函數式、併發式、過程式以及面向對象的編程風格。

Rust 語言最突出的優勢就是可以提供內存安全保證,而且沒有額外的性能損失。在傳統的系統級編程語言( C/C++) 的開發過程中,經常出現因各種內存錯誤引起的崩潰或 bug ,比如空指針、野指針、內存泄漏、內存越界、段錯誤、數據競爭、迭代器失效等等。

內存問題是影響程序穩定性和安全性的重大隱患,並且是影響開發效率的重大因素。谷歌和微軟兩大科技巨頭曾表示:旗下重要產品程序安全問題 70% 由內存問題引發,並且這兩個巨頭都考慮利用 Rust 語言來解決內存安全問題。

此外,Rust 還具有優秀的跨平臺性,支持交叉編譯,對嵌入式環境同樣友好。

然而,Rust 語言也有一些棘手的缺點。

首先,由於 Rust 存在一些特殊的語法,因此初學者入門稍顯困難,例如「生命週期(lifetime)」。相比之下,Python、Java 等語言更加簡單、易學。但如果你已經掌握了 C++ 語言,學習 Rust 語言就容易得多,因爲借鑑了大量 C++ 的語法。

其次,Rust 語言的編譯器檢查非常嚴格,開發過程的大多數時間都是在解決編譯問題。不過,一旦編譯通過,開發人員就不需要關心內存安全,內存泄漏等頭疼問題,只需關注業務邏輯。

https://www.tomshardware.com/software/security-software/white-house-urges-developers-to-avoid-c-and-c-use-memory-safe-programming-languages

https://www.whitehouse.gov/oncd/briefing-room/2024/02/26/memory-safety-statements-of-support/