午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Google 也要放棄 C/C ?Chrome 代碼庫中 70% 的漏洞是內(nèi)存問題

 啟云_9137 2020-05-27

Google 工程師表示:目前 Chrome 代碼庫中所有嚴重的安全漏洞,70% 是內(nèi)存管理的安全漏洞,其中 50% 的內(nèi)存漏洞是 use-after-free 漏洞,因為對內(nèi)存指針的錯誤管理,給予了攻擊者攻擊 Chrome 內(nèi)部組件的機會。

近日,Google 工程師統(tǒng)計了 2015 年以來,Chrome 穩(wěn)定分支中修復(fù)級別為 'high' 或 'critical' 的 912 個安全錯誤,結(jié)果發(fā)現(xiàn)約 70% 是內(nèi)存安全漏洞。

Google 也要放棄 C/C++?Chrome 代碼庫中 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 的一個大問題。

Google 也要放棄 C/C++?Chrome 代碼庫中 70% 的漏洞是內(nèi)存問題

為了解決內(nèi)存安全問題,Google 內(nèi)部提出了一個 The Rule Of 2 原則,即為了保證安全性,程序員不能破壞兩個以上的條件:

  • 不可靠的輸入:主要來自兩個方面,一是 non-trivial 的語法,例如常用的 and 和 or,二是不安全的來源;
  • 不安全的實現(xiàn)語言:即在編寫程序時選擇了缺乏內(nèi)存安全性的語言,例如 C、C++、匯編語言等。目前內(nèi)存安全的語言包括 Go、Rust、Python、Java、JavaScript、Kotlin 和 Swift 等。
  • 高特權(quán):特權(quán)最高的程序是計算機固件,引導(dǎo)加載程序、內(nèi)核、系統(tǒng)管理程序或虛擬機監(jiān)視器等;其次是操作系統(tǒng)級別的賬戶運行進程;特權(quán)較低的進程包括 GPU 進程和網(wǎng)絡(luò)進程等。

“沙箱”也是 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++ 的情況,我們又該怎么辦呢?

  • 使用一些現(xiàn)代 C++ 習(xí)慣用法來生產(chǎn)更安全可靠的代碼;
  • 使用 fuzzers 和 sanitizers 提前發(fā)現(xiàn)錯誤;
  • 使用 exploit mitigations 增加利用漏洞的難度;
  • 特權(quán)分離,這樣即使利用了漏洞,受影響的半徑也較小。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多