美國國家安全局督促棄用 C/C++,使用更安全的 Rust、C# 等!

作者 | 蘇宓

如果說此前 Kotlin、Dart、Julia、Carbon 等後起之秀向老牌程式語言發起挑戰進攻都是小打小鬧,那麼這一次 C、C++ 這幾種常青藤程式語言則是真實地陷入了尷尬的境地。

近日,美國國家安全局(NSA)發佈了最新的指南,鼓勵多個組織將程式語言從 C/C++ 轉為使用記憶體安全的語言,如 C#、Rust、Go、Java、Ruby 和 Swift,主要原因是這樣可以幫助軟體開發者和使用者預防並緩解軟體記憶體安全問題,這些問題佔可利用漏洞的很大一部分。

安全的第一大「殺手」——記憶體漏洞

安全的第一大「殺手」——記憶體漏洞

一直以來,記憶體安全的漏洞引起多個企業與開發者的警覺。

根據長期關注記憶體漏洞的開發者 @LazyFishBarrel 的統計,蘋果公司的 iOS 和 macOS 系統中 60%-70% 的漏洞是記憶體安全漏洞。

微軟在 2019 年的一次會議上透露,從 2006 年到 2018 年,其發現的 70% 的漏洞都是因記憶體安全問題造成的。

據 Google 估計,Chrome 中存在了類似比例的記憶體安全漏洞,另外 90% 的 Android 系統漏洞也都是記憶體安全問題。

為此,NSA 認為,駭客極有可能會利用程式碼中管理不善的記憶體漏洞,而這種漏洞在程式設計師使用靈活性更高的程式語言時更容易出現。於是,其最新發布了《軟體記憶體安全之網路安全資訊指南》時,寫道,「駭客可以利用這些漏洞進行遠端程式碼執行或其他不利影響,這通常會危及設備,並且成為大規模網路入侵的第一步」,因此 NSA 建議各個組織儘可能使用記憶體安全語言,並通過程式碼強化防禦(如編譯器選項、工具選項和作業系統配置)來增強保護。

NSA 網路安全技術總監 Neal Ziring 表示,在開發消除此類漏洞的軟體時,必須始終使用記憶體安全語言和其他保護措施。

C、C++ 成為重災區

C、C++ 成為重災區

在 NSA 看來,我們常用的程式語言如 C 和 C++,在記憶體管理方面提供了很大的自由度和靈活性,但用這種語言開發的應用程序的安全性很大程度上需要依賴程式設計師的測試、檢測環節。

不過,只要程式設計師自身稍微有些疏忽,簡單的 Bug 也會帶來嚴重的記憶體漏洞。

雖然當前行業中有很多軟體分析工具能夠檢測到許多記憶體管理問題,操作環境選項也可以提供一些保護,但記憶體安全軟體語言所提供的固有保護可以防止或減輕大多數記憶體管理問題。

針對這一問題,幾年前,微軟雲開發推广部的 Ryan Levick 在分享微軟為什麼要從 C/C++ 轉向 Rust 時,也曾直言,「無論軟體公司在工具和人員的培訓上投入多少精力也不能解決問題,因為 C++ 本質上就不是安全的語言」。他表示:「我們使用的語言由於年代久遠、來自不同時代,無法為我們提供保護,讓我們免受此類漏洞攻擊。C++ 不是一種記憶體安全的語言,相信這一點無人有異議。」

近日來,微軟 Azure CTO Mark Russinovich 也再次呼籲,「是時候停止使用 C/C++ 啟動任何新項目」。

然而,眾所周知,C 和 C++ 是編寫核心系統軟體的默認語言。這兩門程式語言速度快,而且源程式碼可以直接彙編成機器語言。

雖然一邊有很多企業高管呼籲不要用,但另一邊也有很多人不信邪,不願相信 C、C++ 語言的不足之處。

為此,有人稱,「只要你不使用從 C 繼承的任何功能,C++ 就是安全的」,亦或者「只要遵從現代 C++ 的類型和管用做法,就不會引發記憶體方面的漏洞」。針對這一爭論,科技圈中有開發者現身說法,根據自身在大型 C++ 項目上(遵從現代的慣用做法)的開發經驗,發表了《現代 C++ 救不了程式設計師》一文,用實例證明 C++ 提供的類型完全不能阻止漏洞的泛濫。

另外,也有人提出質疑,「為什麼非要棄用 C、C++ 呢,有什麼理由不能在 C、C++ 編譯器中強制執行記憶體安全嗎?」

針對這一點,有開發者進行回應:

這在以前就已經嘗試過了。

但挑戰是雙重的。首先,如果在編譯器強制執行記憶體安全,範圍也只能侷限在編譯器上。然而,真正的記憶體安全實際上是(至少)執行緒安全、空值安全和類型安全,以及大多數人所想的原始邊界檢查等各個方面。除非你打算進入托管語言領域(Managed Language)並引入 GC,否則你需要語言級別的結構來允許程式設計師在這些新的邊界內有效工作。例如,在 Rust 中,這就是 “所有權 “系統。

第二點是,如果總是把語言功能限制在一些有限的、更安全的範圍內,或者用一些自定義的東西取代核心功能(例如 malloc 或編譯器)。這就把你能使用的庫限制在那些使用功能集的庫上,並要求你無限期地維護這些核心功能。即便如此,你也不會得到 “真正的 “安全,因為這取決於每個人都很小心、不使用錯誤的功能、編譯器,而你又非常確定你的核心實現本身是安全的。

因此,如果你全力以赴,與其需要一個特定的編譯器,再加上一套不同的核心語言特性,再加上你需要確保所有的支持庫都符合要求,再加上需要為靜態分析和編譯工具鏈定製支持工具,倒不如直接用一種新的語言,Rust 便是不錯的選擇。

Rust 是未來,但任重而道遠

Rust 是未來,但任重而道遠

「棄用 C、C++,扶持 Rust」的爭論經過幾年的發酵持續到現在,愈演愈烈。與此同時,推動軟體開發向使用記憶體安全語言發展的隊伍也從最初微軟、Google、亞馬遜等大廠的倡議,逐漸拓展到具體的開發者們以及學術界,現如今也包括了 NSA 在列。

NSA 表示,使用記憶體安全語言可以幫助防止程式設計師引入某些類型的記憶體相關問題。

記憶體是作為計算機語言的一部分自動管理的,它不依賴於程式設計師添加程式碼來實現記憶體保護。記憶體管理通常是使用編譯和運行時檢查機制來實時自動保護。使用更加安全的語言,如 C#、Go、Java、Ruby、Rust、和 Swift 等語言,可以一定程度上保護程式設計師不會無意中引入記憶體管理錯誤。

不過,羅馬並非一日之功。

要想用 Rust 將 C、C++ 取而代之,也需要很長的一段時間,為此 C++ 之父 Bjarne Stroustrup 在回應 C++ 與 Rust 之爭時分享道,「直接替換 C++ 程式碼,或者讓它們變得更加安全都是一項非常艱鉅的任務,需要逐步慢慢地才能做到這一點。否則大量不安全的 C++ 程式碼將會永遠存在。」

網路安全公司 Acronis 的 CISO Kevin Reed 在接受外媒 The Register 採訪時也說道,「多年來,使用 C 和 C++ 編寫的程式碼數量巨大,即使我們明天都開始使用 Rust 和 Go,也需要幾十年的時間才能清理這個爛攤子。」

參考資料:

https://langui.sh/2021/12/13/apple-memory-safety/

https://www.theregister.com/2022/11/11/nsa_urges_orgs_to_use/

https://www.nsa.gov/Press-Room/News-Highlights/Article/Article/3215760/nsa-releases-guidance-on-how-to-protect-against-software-memory-safety-issues/

https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY.PDF

☞惠普Z系列演算法大賽核心解題思路和技巧快來Get!

☞JavaScript 最流行,Rust 受歡迎持續增長,SlashData 開發者報告發布

☞Oculus 原創始人帕胖:我打造了一款「殺死」玩家的 VR 頭顯

相關文章

Rust vs Go,到底該怎麼選?

Rust vs Go,到底該怎麼選?

【CSDN 編者按】擁有 40 多年程式設計經驗的知名 Go 開發者與作家 John Arundel 在其個人部落格分享了《Rust vs ...

「聽我說,創業公司選擇 Rust 需謹慎」

「聽我說,創業公司選擇 Rust 需謹慎」

摘要:近年來,Rust 絕對是一門成長速度飛快的程式語言,許多國內外大廠都開始關注這門年輕的語言,但本文作者表示,對於創業公司而言,Rust...

為取代 C++,Google 強勢開源 Carbon 語言!

為取代 C++,Google 強勢開源 Carbon 語言!

整理 | 彭慧中 責編 | 屠敏 每一種程式語言都曾想一統江湖,將其他語言取而代之。但事實上,能夠在眾多競爭者中脫穎而出並雄霸一方天地並非易...

C、C++ 將退休,Rust 欲上位?

C、C++ 將退休,Rust 欲上位?

整理 | 蘇宓 Rust 這把火在微軟Azure CTO Mark Russinovich的助力下,似乎越燒越旺。而每當波及程式語言時,紛爭...