內(nèi)存管理和安全問題是谷歌和微軟面臨的棘手問題,谷歌表示計(jì)劃探索適時(shí)使用“安全的”編程語言,比如 Rust、Swift、JavaScript、Kotlin 或 Java來解決Chrome不安全問題。
上周,谷歌工程師表示,Chrome 代碼庫中70%的嚴(yán)重漏洞與內(nèi)存管理和安全有關(guān)。
在這70%的漏洞中,一半是釋放后使用漏洞,因?qū)?nèi)存指針(地址)的管理不正確造成,使攻擊者能夠攻擊 Chrome 的內(nèi)部組件。這是谷歌工程師分析 Chrome 自2015年穩(wěn)定版起修復(fù)的912個(gè)安全漏洞分析得出的結(jié)果,這些漏洞的評級(jí)為“高?!被颉皣?yán)重”。
而在2019年2月,微軟在一次安全會(huì)議上分享了類似數(shù)據(jù),并表示,在過去12年中,大約70%的微軟產(chǎn)品更新解決的是內(nèi)存安全漏洞問題。
無窮盡的內(nèi)存管理問題
谷歌和微軟處理的本質(zhì)上是一類問題,即“不安全的”編程語言 C和 C++ 中的問題。
這兩種語言都是幾十年前創(chuàng)建的老舊編程工具,當(dāng)時(shí)安全利用和網(wǎng)絡(luò)攻擊尚未構(gòu)成威脅模型,且很多早期軟件開發(fā)人員并未考慮到這個(gè)問題。結(jié)果,C和 C++ 使得編程人員能夠完全控制管理應(yīng)用的內(nèi)存指針(地址),在犯下基本的內(nèi)存管理錯(cuò)誤時(shí)不會(huì)受到限制或得到警告信息。
這些早期編程錯(cuò)誤導(dǎo)致應(yīng)用程序中引入內(nèi)存管理漏洞,包括釋放后使用、緩沖區(qū)溢出、競爭條件、雙重釋放、通配符指針等等。這些內(nèi)存管理漏洞是攻擊者試圖查找并利用的最愛,因?yàn)樗麄兡芙璐双@得在設(shè)備內(nèi)存中植入代碼的能力并由受害者應(yīng)用程序(瀏覽器、服務(wù)器、操作系統(tǒng)等)執(zhí)行。
MITRE 公司在年初發(fā)布一份榜單,緩沖區(qū)溢出漏洞高居榜首,其它兩個(gè)內(nèi)存管理問題(界外讀取排名第五,釋放后使用排名第七)也位列前十。
近年來軟件工程不斷發(fā)展,開發(fā)人員從根本上排除多數(shù)安全缺陷的能力以及部署安全防護(hù)措施的能力有所增強(qiáng)。
但,在內(nèi)存管理漏洞方面卻是個(gè)例外。
谷歌將著手處理
谷歌表示,自2019年3月起,在130個(gè)Chrome 漏洞中,其中125個(gè)“嚴(yán)重”等級(jí)的漏洞和內(nèi)存損壞問題相關(guān),這表明,雖然在修復(fù)其它漏洞類型方面取得進(jìn)展,但內(nèi)存管理仍然是個(gè)問題。
內(nèi)存管理漏洞的問題如此巨大,谷歌 Chrome 工程師現(xiàn)在不得不遵守“The Rule of 2”規(guī)則。按照規(guī)則,工程師編寫好 Chrome 新功能后,代碼不得違反兩個(gè)以上的如下條件:
-
代碼處理不可信輸入。
-
代碼未在沙箱環(huán)境下運(yùn)行。
-
代碼用不安全的編程語言(C/C++)編寫而成。
雖然軟件公司之前都試圖修復(fù) C和 C++ 的的內(nèi)存管理問題,但 Mozilla 是其中最為成功的,該公司通過贊助、推廣和在火狐瀏覽器中大力使用 Rust 編程語言而取得突破。
如今,Rust 被視作最安全的編程語言,是 C和C++ 語言的理想替代者,這都要?dú)w功于 Mozilla 早期付出的努力。但 Mozilla 并非唯一一家獲得突破的公司。微軟也在積極探索 C和 C++ 的替代品。從早期的 Checked C 項(xiàng)目開始,微軟現(xiàn)在正在試驗(yàn) Rust 語言,而且也在構(gòu)建自己的類似 Rust 的“安全”編程語言(Project Verona 秘密項(xiàng)目的一部分)。上周,微軟在 Build 虛擬大會(huì)上表示,這兩個(gè)項(xiàng)目都獲得成功,未來將致力于采用安全編程語言。
上周,谷歌也宣布推出類似規(guī)劃。谷歌表示也計(jì)劃研究“解決Chrome 中的內(nèi)存不安全問題”。Chrome 是當(dāng)前最流行的網(wǎng)絡(luò)瀏覽器,70%的互聯(lián)網(wǎng)用戶都在使用它。
Chrome 沙箱已達(dá)峰值
直到今天,谷歌工程師一直不遺余力地支持在 Chrome 中實(shí)現(xiàn)沙箱方法。他們將數(shù)十個(gè)進(jìn)程隔離到自己的沙箱中并于近期推出 Site Isolation 功能,將每個(gè)站點(diǎn)的資源也融合到自己的沙箱進(jìn)程中。
然而,谷歌工程師表示,考慮到性能問題,沙箱 Chrome 組件的方法已達(dá)到最大收益,因此公司必須探索新方法。谷歌表示未來計(jì)劃為Chrome 代碼庫開發(fā)定制化 C++ 庫,從而更好地防范內(nèi)存相關(guān)問題。
谷歌也在探索 MiraclePtr 項(xiàng)目,旨在“將可利用的釋放后使用問題轉(zhuǎn)變?yōu)榉前踩员罎栴},具有可接受的性能、內(nèi)存、二進(jìn)制大小和最小穩(wěn)定性影響?!?
最后但也同樣重要的一點(diǎn)是,谷歌表示計(jì)劃探索適時(shí)使用“安全的”編程語言,比如 Rust、Swift、JavaScript、Kotlin 或 Java。