NSA建議開發者考慮從C和C++轉換為內存安全的編程語言
美國國家安全局(NSA)正在敦促開發人員轉向內存安全語言–如C#、Go、Java、Ruby、Rust和Swift–以保護他們的代碼免受遠程代碼執行或其他黑客攻擊。在上述語言中,Java是企業和Android應用開發中使用最廣泛的語言,而Swift是排名前十的語言,部分歸功於iOS應用開發。而在系統編程中,人們對Rust作為C和C++的替代品的興趣也越來越大。
“NSA建議企業考慮在可能的情況下,從很少或沒有提供固有內存保護的編程語言(如C/C++)轉向內存安全語言。內存安全語言的一些例子是C#、Go、Java、Ruby和Swift,”NSA說。
該機構引用了Google和微軟最近的研究,他們在Chrome和Windows中分別有70%的安全問題與內存有關,其中許多是使用C和C++的結果,這兩種語言更容易出現基於內存的漏洞。
“NSA在”軟件內存安全”網絡安全信息表中指出:”惡意的網絡行為者可以利用這些漏洞進行遠程代碼執行或其他不利影響,這往往可以損害一個設備,成為大規模網絡入侵的第一步。常用的語言,如C和C++,在內存管理方面提供了很大的自由度和靈活性,同時嚴重依賴程序員對內存引用進行必要的檢查。”
因此,該機構建議盡可能使用內存安全語言,無論是應用開發還是系統編程。
雖然大多數信息安全專家都熟悉關於內存安全語言的辯論,但也許不是所有的開發人員都熟悉。不過,也許他們應該熟悉,因為這是一個幾十年前就存在的問題,正如Java創建者James Gosling最近在討論如何以及為什麼創建Java時指出的。
如果有的話,NSA的文件為開發者提供了一個清晰的、通俗的解釋,說明了向內存安全語言轉變背後的技術原因。在內存安全方面討論最多的語言可能是Rust,它是作為C和C++的”替代品”的主要候選。
Linux內核最近引入了Rust作為C語言的第二種語言,繼Android開源項目之後。這些項目不會取代舊的C/C++代碼,但對於新的代碼會優先考慮Rust。另外,微軟Azure首席技術官Mark Russinovich最近呼籲所有開發人員在所有新項目中使用Rust而不是C和C++。
“通過利用這些類型的內存問題,惡意行為者–他們不受軟件使用的正常預期約束–可能會發現他們可以在程序中輸入不尋常的輸入,導致內存以意想不到的方式被訪問、寫入、分配或刪除,”NSA解釋說。
但是–正如專家們在關於Rust和C/C++的辯論中所指出的那樣–NSA警告說,僅僅使用一種內存安全語言並不能默認排除將內存錯誤引入軟件。此外,語言通常允許使用不是用內存安全語言編寫的庫。
“即使使用內存安全語言,內存管理也不完全是內存安全的。大多數內存安全語言承認,軟件有時需要執行不安全的內存管理功能來完成某些任務。因此,有一些類或函數被認為是非內存安全的,並允許程序員執行可能不安全的內存管理任務,”NSA說。
“一些語言要求任何內存不安全的東西都要明確註釋為內存不安全,以使程序員和程序的任何審查人員意識到它是不安全的。內存安全語言也可以使用以非內存安全語言編寫的庫,因此可以包含不安全的內存功能。儘管這些包含內存不安全機制的方式顛覆了固有的內存安全,但它們有助於定位可能存在內存問題的地方,允許對這些代碼部分進行額外的審查。”
NSA指出,向一些內存安全語言的轉化可能要付出性能上的代價,這需要開發人員學習一種新的語言。它還指出,開發人員可以採取一些措施來加固非內存安全語言。例如,Google的Chrome團隊正在探索多種方法來加固C++,但這些方法也會帶來性能開銷。在可預見的未來,C++將繼續留在Chrome的代碼庫中。
NSA建議進行靜態和動態應用程序安全測試,以發現內存問題。它還建議探索內存加固方法,如控制流保護(CFG),它將對代碼的執行位置進行限制。同樣,建議使用地址空間佈局隨機化(ASLR)和數據執行預防(DEP)。