近日,Google 工程師統(tǒng)計了 2015 年以來,Chrome 穩(wěn)定分支中修復(fù)級別為 'high' 或 'critical' 的 912 個安全錯誤,結(jié)果發(fā)現(xiàn)約 70% 是內(nèi)存安全漏洞。 事實上,不只是 Google,內(nèi)存安全漏洞是很多科技公司都頭疼的問題,微軟工程師也曾公開表示:在過去 12 年中,微軟產(chǎn)品的安全更新中,約有 70% 也是在解決內(nèi)存安全漏洞。 為什么微軟和 Google 的情況如此相似呢?因為它們代碼庫中使用的主要編程語言是 C 和 C++,由于 C 和 C++ 出現(xiàn)的時間較早,當時網(wǎng)絡(luò)攻擊還不是利用相關(guān)的威脅模型,大多數(shù)早期軟件開發(fā)人員也沒有考慮到相關(guān)的安全問題,所以 C 和 C++ 允許程序員完全控制管理應(yīng)用程序的內(nèi)存指針,出現(xiàn)基本的內(nèi)存管理錯誤時,也沒有相關(guān)的提示或者警告。 Chrome 的內(nèi)存安全問題如何解決?據(jù)了解,自 2019 年 3 月以來,在 130 個級別為 critical 的 Chrome 漏洞中,有 125 個是與內(nèi)存相關(guān)的。這個數(shù)據(jù)也表明了,內(nèi)存管理錯誤仍然是 Google 的一個大問題。 為了解決內(nèi)存安全問題,Google 內(nèi)部提出了一個 The Rule Of 2 原則,即為了保證安全性,程序員不能破壞兩個以上的條件:
“沙箱”也是 Google 用來解決安全問題的常用方法,Google 工程師會將數(shù)十個流程隔離到自己的沙箱中,并利用剛推出的“Site Isolation”功能,將每個站點的資源也放到沙箱中。同時,考慮到性能問題,Google 采用了沙箱化 Chrome 組件的方法,并在積極探索新的方法。 Google 表示將開發(fā)自定義 C++ 庫,與 Chrome 代碼庫配合使用,以便更好地處理與內(nèi)存相關(guān)的錯誤。并且有計劃,在可能的情況下探索使用“內(nèi)存安全”的編程語言,目前的候選對象包括 Rust、Swift、JavaScript、Kotlin 和 Java。 放棄 C 和 C++ 可行嗎?無論是 Google 還是微軟,出現(xiàn)內(nèi)存問題的根源是使用了諸如 C 和 C++ 這類的“不安全”編程語言,那么放棄 C 和 C++ 可行嗎? 對企業(yè)來說,重新選擇一種編程語言不是一件容易的事情,因為這意味著需要重寫大量的代碼,需要重新培訓(xùn)員工,需要招聘擁有新技能的員工。所以,放棄 C 和 C++ 不是一件容易的事情。 如果是全新的項目,我們完全可以選擇一個內(nèi)存安全的編程語言,無需考慮重寫代碼的風(fēng)險。不過,還是需要改進測試或部署基礎(chǔ)架構(gòu)來支持新的編程語言。ChromeOS 的 CrosVM 就是采用的這種方法。 如果是現(xiàn)有項目的新組件,我們也可以選擇內(nèi)存安全的編程,例如 Rust、Swift 等編程語言都可以與 C、C++ 代碼庫互操作。不過,剛開始的投入可能會比較大,因為需要集成到構(gòu)建系統(tǒng)中,所以需要使用一種新的語言在兩種語言之間傳遞對象和數(shù)據(jù)構(gòu)建抽象。Firefox 的新組件 WebAuthn 就是使用的這種方法。 以上兩種情況的特點都是新代碼與原有代碼有明顯的界限,無需重寫代碼,我們可以在構(gòu)建新項目或新組件之后,再逐步處理現(xiàn)有代碼。那如果是界限不明顯、無法放棄 C 和 C++ 的情況,我們又該怎么辦呢?
|
|