白宮國家網絡主任辦公室發布內存安全語言應用的分析

合迅科技 2024-03-22 13:40:53

白宮國家網絡主任辦公室 (ONCD)發布了一份報告《BACK TO THE BUILDING BLOCKS:A PATH TOWARD SECURE AND MEASURABLE SOFTWARE》,呼籲科技界主動減少網絡空間的攻擊面;通過改用Rust等內存安全編程語言,減少內存安全漏洞的數量來提高軟件安全性。報告一發布在互聯網上炸開了鍋,一方面爲拜登選舉制造了話題,另外一方面軟件技術專家也開展了關于內存安全應用開發,C++與rust語言之爭的討論。白宮國家網絡主任辦公室例舉了曆史上一些著名的網絡攻擊事件,包括:1988年的Morris蠕蟲病毒、2003年的Slammer蠕蟲病毒、2014年的 Heartbleed漏洞、2016年的Trident漏洞、2023年的Blastpass漏洞。並指出,所有這些問題的背後都有一個共同的根本原因,即內存安全漏洞。內存安全漏洞是軟件中最常見的編程錯誤之一,當軟件以非預期或不安全的方式訪問內存時,會導致各種安全問題,如緩沖區溢出、釋放後使用、使用未初始化的內存和雙重釋放。成功利用此類漏洞會帶來嚴重安全風險,可能允許攻擊者能未經授權訪問數據,或者允許以系統權限執行惡意代碼。內存安全漏洞是一類影響內存訪問方式的漏洞,以非故意的方式寫入、分配或解除分配。專家們已經確定了一些程序既缺乏與記憶安全相關的特征,又具有高度擴散性的語言跨關鍵系統,如C和C++。

白宮的觀點總結爲,內存安全漏洞是最常見的産生網絡安全問題的原因之一,這一問題可以用編程語言的內存安全機制避免。

觀點一:內存安全只是整體安全保護中的一小部分。C++的安全實踐主要得益于正式規範、充分指定的內存模型以及活躍的用戶與實現者社區。相比之下,某些理論上更安全的語言反而缺少正式規範。當前由ISO C++ 標准定義,可以解決常見的安全問題,例如指針和數組範圍。ISO C++總體策略是,使用靜態分析來消除潛在錯誤,但全局靜態分析無法承受,所以需要一些規則來簡化正在編寫的內容,以便有效且廉價地進行本地靜態分析,然後提供一系列庫來更好地依賴這些規則。

觀點二:從技術角度看,用內存安全語言如 Rust 重寫大型C/C++ 系統組件後就絕對安全了嗎?答案是否定的。本質上講,Rust和C/C++是不能直接交互的——它們在類型、內存管理和控制流方面都采取了截然不同的方法。內存管理方法方面,Rust的類型系統會靜態跟蹤對象的生命周期和所有權,C語言要求程序員手動管理內存,而C++雖然提供內存安全抽象,但也允許自由將其與原始指針加以混合。多語言環境的融合會導致系統更加複雜,從而增加安全風險。全部重寫工作量巨大,新軟件不可避免産生安全問題。

觀點三:C/C++語言的地位在可見未來之內不會動搖。首先,操作系統最基本的底層接口,無論Windows還是Linux,只提供C語言接口,在可見的未來和目前的技術框架視野之內不會提供C語言之外的接口(包括Rust);其次,計算機編程領域大量的基礎庫,包括音視頻編解碼、圖像格式、窗口系統協議、壓縮算法,都已提供穩定的C語言接口並經過長期市場驗證。市面上可見的其他編程語言在這些基本能力上,本質上都是對這些C語言基礎庫的封裝。

在上文的語境中,在JG應用系統中與C++相對應的是Rust語言。Rust是一種相對年輕的系統編程語言,由Mozilla基金會贊助開發,首個穩定版本于2015年發布。Rust的設計初衷是創造一種可以提供C++級別的性能,同時保障內存安全和線程安全的編程語言。Rust已經逐漸成爲系統編程領域的一顆新星,被廣泛應用于Web浏覽器引擎、操作系統、物聯網等場景。

1)性能方面

在性能方面,C++和Rust都具有極高的優勢。由于它們都能夠直接操作底層硬件,因此在性能上可以媲美C語言。然而,在某些場景下,Rust的編譯器可以在編譯時進行更多的優化,使得Rust的性能略勝一籌。

2)內存安全

內存安全是編程語言安全性的一個重要指標。C++以指針操作著稱,這讓程序員可以直接操作內存地址,但同時也帶來了潛在的風險。錯誤的指針操作可能導致內存泄漏、空指針解引用等問題。相較之下,Rust通過所有權系統和借用檢查器確保了內存安全。這一機制可以在編譯時發現潛在的內存安全問題,從而避免了運行時的內存錯誤。因此,在內存安全方面,Rust具有明顯優勢。

3)並發編程

並發編程對于現代軟件開發而言至關重要,它可以充分利用多核處理器的性能。C++在並發編程方面提供了一些基本的工具,如線程和互斥鎖。然而,在C++中編寫並發代碼時需要格外小心,以避免死鎖、競態條件等問題。Rust在設計之初就著重考慮了並發安全性。其所有權系統和借用檢查器可以確保在編譯時捕捉到潛在的數據競爭問題。同時,Rust還提供了一系列高級抽象,如通道、異步編程等,簡化了並發編程的複雜度。因此,Rust在並發編程方面相對于C++更具優勢。

4)生態系統

C++擁有著龐大的生態系統,比如boost,Qt,STL等,廣泛應用于各個領域。C++庫和框架的數量龐大,爲開發者提供了豐富的選擇。此外,C++還有著良好的跨平台兼容性,可以在多種操作系統和硬件平台上運行。Rust的生態系統相對較年輕,但發展迅速。它擁有一個快速增長的庫和框架生態,如Tokio、Rocket等。雖然Rust的生態系統與C++相比仍有所不足,但隨著越來越多的開發者和企業開始采用Rust,其生態系統將持續發展和完善。

C++和Rust各自在不同領域和場景下有著各自的優勢。C++在性能、生態系統和跨平台兼容性方面占據優勢,而Rust在內存安全、並發編程和易用性方面更具競爭力。因此,選擇C++或Rust應根據項目的具體需求和場景來決定。爲適應JG內存安全的應用場景,可以在Rust語言應用進行技術儲備,就當前JG應用較多的Qt框架和插件式應用開展同級別的rust插件式框架的預研,特別是界面應用,主要構建JG的插件式框架,同時驗證rust軟件生態、rust的可用性、rust的內存安全性是否能夠滿足JG的常見需求,比如態勢的業務需求、高可靠性需求、高可用性需求等。

免責聲明

本文部分內容摘自網絡,因轉載衆多,或無法確認真正原始作者,如涉及作品版權問題,請與我們聯系,我們將在第一時間協商版權問題或刪除內容!

0 阅读:0

合迅科技

簡介:工業數字化與裝備數字化服務商