向內(nèi)存安全語言遷移的五大挑戰(zhàn)
近日,白宮國家網(wǎng)絡(luò)主任辦公室(ONCD)在題為《回歸基礎(chǔ)構(gòu)件:通往安全軟件之路》的報(bào)告中呼吁開發(fā)者放棄C、C++語言,轉(zhuǎn)而使用“內(nèi)存安全的編程語言”,例如Rust語言。

傳統(tǒng)編程語言C/C++雖然強(qiáng)大,但一直飽受內(nèi)存安全漏洞的困擾。這些漏洞不僅復(fù)雜難懂,而且極易造成系統(tǒng)崩潰等嚴(yán)重后果。為了解決這一難題,近年來內(nèi)存安全語言逐漸興起,并有望成為未來編程語言的主流。
近日,helpnetsecurity采訪了開源安全基金會(huì)(OpenSSF)的總經(jīng)理Omkhar Arasaratnam,探討了業(yè)界轉(zhuǎn)向內(nèi)存安全語言的挑戰(zhàn)與策略,內(nèi)容整理如下:
內(nèi)存安全語言的優(yōu)勢(shì)
內(nèi)存安全漏洞已經(jīng)存在了半個(gè)多世紀(jì)。它本質(zhì)上是將程序員從繁瑣的內(nèi)存管理工作中解脫出來。C/C++要求程序員手動(dòng)分配和釋放內(nèi)存,這不僅復(fù)雜易錯(cuò),還需要時(shí)刻追蹤內(nèi)存的使用情況,以免出現(xiàn)內(nèi)存泄露等問題。而Java、Rust、Python和JavaScript等現(xiàn)代語言則通過自動(dòng)內(nèi)存管理的方式,讓程序員將精力集中在核心邏輯的編寫上,避免陷入低級(jí)內(nèi)存管理的泥潭。
在操作系統(tǒng)內(nèi)核、系統(tǒng)編程等高危場(chǎng)景下,內(nèi)存安全語言的優(yōu)勢(shì)尤為突出。操作系統(tǒng)內(nèi)核擁有整個(gè)系統(tǒng)的最高權(quán)限,任何內(nèi)存安全漏洞都可能導(dǎo)致系統(tǒng)崩潰甚至信息泄露。
盡管熟練的程序員可以使用C/C++等非內(nèi)存安全語言避免內(nèi)存漏洞,但現(xiàn)實(shí)情況并不樂觀。微軟曾經(jīng)統(tǒng)計(jì)過自家產(chǎn)品的漏洞,其中70%都與內(nèi)存安全問題相關(guān)。谷歌針對(duì)安卓系統(tǒng)進(jìn)行的類似研究也得到了相似的結(jié)論:90%的安卓系統(tǒng)漏洞都與內(nèi)存安全有關(guān)。
Go、Python、Rust和Java等語言都是優(yōu)秀的內(nèi)存安全語言范例。其中,Rust有望成為Linux內(nèi)核的第二個(gè)官方支持語言。這將允許開發(fā)者用完全內(nèi)存安全的語言重寫Linux內(nèi)核的部分關(guān)鍵代碼。
遷移的五大挑戰(zhàn)
向內(nèi)存安全語言遷移并非易事,開發(fā)者和企業(yè)需要面對(duì)五大挑戰(zhàn):
- 開發(fā)者培訓(xùn)和認(rèn)證滯后:現(xiàn)有開發(fā)人員需要學(xué)習(xí)新語言,或者招聘熟悉內(nèi)存安全語言的人才。同時(shí),調(diào)試和構(gòu)建系統(tǒng)也需要進(jìn)行相應(yīng)調(diào)整以支持新語言,相關(guān)的培訓(xùn)和認(rèn)證服務(wù)相對(duì)滯后。
- 硬件支持有限:C/C++等老牌語言可在幾乎所有平臺(tái)上運(yùn)行,而Rust等新興語言的硬件支持則相對(duì)有限。
- 監(jiān)管要求:一些安全關(guān)鍵型系統(tǒng)有著嚴(yán)格的技術(shù)和安全需求,在新語言缺乏相關(guān)認(rèn)證的情況下,可能無法輕易遷移。
- 潛在Bug:將老代碼移植到新語言可能會(huì)引入新的Bug。即使是經(jīng)驗(yàn)豐富的程序員,也可能因?yàn)橹貙戇^程中的細(xì)微差別導(dǎo)致程序運(yùn)行結(jié)果與預(yù)期不符,從而產(chǎn)生線上故障。
- 部署阻力:關(guān)鍵基礎(chǔ)設(shè)施系統(tǒng)內(nèi)存安全代碼的重新部署面臨挑戰(zhàn)。
遷移策略:安全優(yōu)先
用Rust重寫所有現(xiàn)有代碼顯然并不現(xiàn)實(shí)。OpenSSF建議開發(fā)者在開啟新項(xiàng)目時(shí)優(yōu)先考慮使用內(nèi)存安全語言,同時(shí)將Rust應(yīng)用于關(guān)鍵代碼路徑,例如身份驗(yàn)證、授權(quán)、加密以及處理網(wǎng)絡(luò)或用戶輸入的部分。
雖然內(nèi)存安全語言并非靈丹妙藥,但卻是提升代碼安全性的重要一步。通過使用內(nèi)存安全語言,程序員可以將更多精力放在核心邏輯的開發(fā)上,避免在低級(jí)內(nèi)存管理上浪費(fèi)時(shí)間和精力。
對(duì)于難以遷移的遺留代碼,OpenSSF提供了《C/C++加固指南》,幫助開發(fā)者在不大幅改動(dòng)既有代碼庫的情況下提升安全性。
需要注意的是,關(guān)鍵基礎(chǔ)設(shè)施的工業(yè)控制系統(tǒng)通常難以通過企業(yè)網(wǎng)絡(luò)進(jìn)行更新,因此重新部署安全代碼可能比重寫本身更加耗時(shí)。
OpenSSF鼓勵(lì)社區(qū)在開始新項(xiàng)目時(shí)考慮使用Rust進(jìn)行編寫,并根據(jù)安全優(yōu)先級(jí)將Rust用于關(guān)鍵代碼路徑(經(jīng)常被濫用或攻擊的部分,或者“皇冠上的寶石”的關(guān)鍵區(qū)域),例如從身份驗(yàn)證、授權(quán)、加密以及從網(wǎng)絡(luò)或用戶獲取輸入內(nèi)容的代碼。
內(nèi)存安全語言的未來
在某些關(guān)鍵領(lǐng)域,雖然新興語言的安全性優(yōu)勢(shì)非常誘人,但貿(mào)然遷移反而會(huì)帶來風(fēng)險(xiǎn)。預(yù)計(jì)內(nèi)存安全語言并不會(huì)在所有行業(yè)成為標(biāo)準(zhǔn),一些對(duì)穩(wěn)定性要求極高的領(lǐng)域出于謹(jǐn)慎考慮,可能會(huì)推遲采用內(nèi)存安全語言。
不過,從長遠(yuǎn)來看,使用內(nèi)存安全語言來開發(fā)新項(xiàng)目具有普遍意義。例如,Alpha-Omega公司資助了用Rust開發(fā)的Rustls項(xiàng)目,旨在實(shí)現(xiàn)更安全的TLS和QUIC協(xié)議。通過使用內(nèi)存安全語言,業(yè)界可以避免類似于OpenSSL Heartbleed漏洞那樣的安全事件。
教育和認(rèn)證是關(guān)鍵
教育和培訓(xùn)是網(wǎng)絡(luò)安全最強(qiáng)大的基礎(chǔ)防線之一。如今許多小學(xué)已經(jīng)開始將Python作為編程語言入門課程。OpenSSF希望未來能夠盡早將Rust等其他內(nèi)存安全語言引入基礎(chǔ)教育。
此外,Rust基金會(huì)也提供了豐富的學(xué)習(xí)資源,例如備受好評(píng)的書籍《Rust編程語言》以及正在開發(fā)的培訓(xùn)和認(rèn)證項(xiàng)目。通過積極的學(xué)習(xí)和社區(qū)協(xié)作,內(nèi)存安全語言有望在未來發(fā)揮更大的作用。





























