微軟IT故障提醒:RUST比C/C++更好
基于 Rust 的系統(tǒng)能否避免上周 CrowdStrike 的災(zāi)難?
譯自Microsoft’s IT Outage Reminder: Rust Is Better Than C/C++,作者 Agam Shah。
上周,全球范圍內(nèi)的 Windows 系統(tǒng)都出現(xiàn)了藍屏死機 (BSOD),原因是安全供應(yīng)商 CrowdStrike 提供的錯誤配置更新。
這次故障被一些人稱為世界上最嚴(yán)重的故障,它癱瘓了關(guān)鍵基礎(chǔ)設(shè)施。然而,微軟的一位官員在周末也提醒開發(fā)人員注意更好的編碼實踐,以提高系統(tǒng)可靠性,降低系統(tǒng)崩潰和藍屏死機的可能性。
微軟Azure 的 CTOMark Russinovich表示,開發(fā)人員應(yīng)該逐步棄用 C/C++,轉(zhuǎn)而使用內(nèi)存安全的 Rust 語言,以減少系統(tǒng)崩潰和藍屏死機。當(dāng)然,這條推文與 CrowdStrike 的錯誤更新沒有直接關(guān)系。
周六,Russinovich轉(zhuǎn)發(fā)了一條 2022 年的推文,內(nèi)容是:“是時候停止啟動任何新的 C/C++ 項目,并在需要非 GC 語言的場景中使用 Rust。為了安全性和可靠性,行業(yè)應(yīng)該宣布這些語言已過時。”
空指針
藍屏死機的原因有很多,包括 Windows 中的內(nèi)存錯誤、驅(qū)動程序問題和進程問題,這些問題都依賴于用 C/C++ 編寫的內(nèi)核。前 Google 員工Zack Vorhies表示,這次故障是由于 C/C++ 代碼錯誤造成的,但這一說法被 Google 研究員Tavis Ormandy駁斥了。
Vorhies將大規(guī)模故障歸咎于空指針,即代碼中指向無效內(nèi)存位置的一行代碼,他將其描述為“來自內(nèi)存不安全的 C++ 語言的空指針”。
Ormandy 駁斥了 Vorhies 的說法,CrowdStrike 表示:“這與通道文件 291 或任何其他通道文件中包含的空字節(jié)無關(guān)?!?/p>
支持 Rust
微軟多年來一直支持 Rust,但在內(nèi)部,代碼遷移仍在進行中。該公司意識到,從 C/C++ 切換不可能在一夜之間完成。
“我們正在努力。Azure 中已經(jīng)有很多 Rust 代碼,Windows 中也有一些 Rust 代碼,”Russinovich 在最近的一條推文中說。
對 Rust 的采用是循序漸進的;第一步是創(chuàng)建原型應(yīng)用程序,以證明 Rust 代碼可以與 Windows 協(xié)同工作。微軟還將保護系統(tǒng)硬件的周邊應(yīng)用程序遷移到 Rust。
UEFI 固件
微軟正在圍繞 Rust 創(chuàng)建其 Surface 硬件的安全啟動模塊。UEFI(統(tǒng)一可擴展固件接口)包含將系統(tǒng)從啟動引導(dǎo)到 Windows 操作系統(tǒng)的固件代碼。UEFI 代碼通常位于主板上,并在計算機開機時訪問。
UEFI 固件加載到內(nèi)存中,Rust 提供內(nèi)存安全機制,以防止系統(tǒng)崩潰或被利用。許多硬件漏洞和安全問題都起源于計算機內(nèi)存內(nèi)部。
美國政府的主要技術(shù)安全機構(gòu)網(wǎng)絡(luò)安全基礎(chǔ)設(shè)施和安全局 (CISA)在 12 月呼吁公司切換到內(nèi)存安全技術(shù)。
“除了 C/C++ 之外,大多數(shù)現(xiàn)代編程語言已經(jīng)是內(nèi)存安全的。內(nèi)存安全的編程語言管理計算機的內(nèi)存,因此程序員無法引入內(nèi)存安全漏洞,”CISA 在咨詢說明中說。
Rust 保護 PC
微軟正在使用圍繞 Rust 構(gòu)建的安全性和固件來保護其自有硬件,微軟企業(yè)和操作系統(tǒng)安全副總裁Dave Weston在一次采訪中說。
該公司的 Secured-core 計劃包括為 Surface 和 Windows PC 提供穩(wěn)定且安全的啟動環(huán)境。該公司已將許多固件組件從 C 遷移到 Rust,這提高了系統(tǒng)穩(wěn)定性,并降低了系統(tǒng)暴露于黑客攻擊的漏洞的可能性。微軟還為其名為 Pluton 的安全處理器創(chuàng)建了一個完全用 Rust 編寫的實時操作系統(tǒng)。Pluton 包含一個可信平臺模塊 (TPM),用于存儲生物識別數(shù)據(jù)等關(guān)鍵安全信息。
“微軟致力于通過設(shè)計使更多事物變得安全。這是擁有我們自己的安全處理器而不是等待行業(yè)發(fā)展帶來的優(yōu)勢之一。我們將轉(zhuǎn)向 Rust……它在該領(lǐng)域比傳統(tǒng)原生語言具有巨大優(yōu)勢,”韋斯頓說。
內(nèi)存泄漏一直是 TPM 的主要問題。QuarksLab去年指出了 TPM 2.0 代碼中的兩個漏洞,這些漏洞將內(nèi)存暴露給越界讀寫,可能將關(guān)鍵信息暴露給虛擬化環(huán)境中黑客的攻擊。像 Rust 這樣的內(nèi)存安全語言可以幫助防止此類問題。
微軟與 Rust 的歷史
大約十年前,Mozilla 推出了一個包含 Rust 組件的 Firefox 瀏覽器,現(xiàn)在越來越多的程序員正在采用它。其他內(nèi)存安全語言包括Golang,Java,C#, Swift 和Python.
微軟進行了兩次實驗來檢查 Rust 在可行性和性能方面的可行性。Win32K 通常是頻繁攻擊的常見選擇,因為它提供了一種方便的特權(quán)提升攻擊。
“我們從 Rust 最能提供安全價值的地方開始,”韋斯頓在2020 年 6 月的播客中說。
第一個是字體解析器,它在瀏覽器或 Office 客戶端中創(chuàng)建了遠(yuǎn)程攻擊面。將他們的現(xiàn)代 Web 應(yīng)用程序 SDK 字體解析器 DirectWrite 轉(zhuǎn)換為 Rust 花費了 2 到 3 個月的時間。
“大約花了兩個到三個月的時間,由兩名開發(fā)人員完成。有趣的是,性能實際上得到了提升,”韋斯頓在播客中說。
第二個實驗涉及 Win32k 中的一些圖形設(shè)備接口 (GDI) 表面,Win32k 是一個最初設(shè)計于 1980 年代后期的內(nèi)部圖形組件。微軟不想重寫整個代碼,因此它嘗試將 Win32k 的各個組件切片出來以用 Rust 實現(xiàn)。實驗成功完成,Rust 組件現(xiàn)在與 Windows 一起發(fā)布。
“這尤其重要,因為 Microsoft Windows 是用 Visual C++ 編譯器或 C 編譯器編譯的,而 Rust 的后端實際上是 LLVM [低級虛擬機],”韋斯頓說。
Azure 中的 Rust
微軟還在 Azure 中廣泛實施 Rust。
該公司正在實施一個用 Rust 編寫的虛擬機管理器,它將管理 Azure 中的 Hyper-V。
Rust 也正在 Azure Boost 中實施,韋斯頓稱之為“Azure 的未來架構(gòu)”。
“這就是我們將 Azure 主機的更多性能方面卸載到智能網(wǎng)卡和/或 FPGA 等專用卡上的地方,用于存儲,”韋斯頓說。
微軟在 Rust 工具上花費了大約 1000 萬美元,Azure 是首要目標(biāo)。該公司還希望建立一個 Rust 的長期支持版本,類似于Linux 操作系統(tǒng)。