Windows藍(lán)屏致?lián)p150億美元,受災(zāi)者僅獲賠10美元引熱議,程序員激辯用Rust能否改寫史上最大IT故障結(jié)局?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 企業(yè)管理交流 』
編譯 | 鄭麗媛 出品 | CSDN(ID:CSDNnews) 距離 Windows 大范圍藍(lán)屏事件,已經(jīng)過(guò)去了 6 天。 這 6 天來(lái),國(guó)內(nèi)外技術(shù)網(wǎng)站仍對(duì)此事熱議不斷,“罪魁禍?zhǔn)住?nbsp;CrowdStrike 的名字被頻繁提及,與之伴隨的無(wú)一不是質(zhì)疑和譴責(zé):
基于此,本周 CrowdStrike 的股價(jià)已迅速暴跌超 20%。出于對(duì)引發(fā)此次故障的歉意,據(jù)悉昨日 CrowdStrike 還向其合作方均提供了一張價(jià)值 10 美元的 Uber Eats 禮品卡作為道歉:“為了表達(dá)我們的歉意,你的下一杯咖啡或夜宵由我們請(qǐng)客!”不過(guò),有收到該禮品卡的用戶表示,他們?nèi)稉Q時(shí),頁(yè)面提示稱該禮品卡“已被發(fā)行方取消,不再有效”。 除了以上聚焦于 CrowdStrike 本身的關(guān)注和報(bào)道,近日還有一個(gè)話題也在開(kāi)發(fā)者圈內(nèi)引起了不小的討論:”如果 CrowdStrike 改用 Rust 的話,全球 850 萬(wàn) PC 是不是就不會(huì)藍(lán)屏了?“
不僅如此,微軟 Azure 部門 CTO Mark Russinovich 也在事發(fā)后轉(zhuǎn)了一條他 發(fā)布于 2022 年的推文:“說(shuō)到語(yǔ)言,現(xiàn)在是時(shí)候停止用 C/C++ 啟動(dòng)任何新項(xiàng)目了,請(qǐng)在需要使用非 GC 語(yǔ)言的情況下使用 Rust。為了安全性和可靠性,業(yè)界應(yīng)該宣布這些語(yǔ)言已被淘汰。” 眼看著不少 Rust 狂熱愛(ài)好者開(kāi)始放話“沒(méi)錯(cuò),Rust 就是唯一答案”,一位同樣喜歡 Rust 的資深軟件工程師 Julio Merino,在理智地進(jìn)行了一番全盤分析后得出結(jié)論:“就算是 Rust,也救不了這次 CrowdStrike 的中斷事故。” 以下為譯文: 我非常喜歡 Rust,也很贊同不應(yīng)繼續(xù)使用 C++ 這類內(nèi)存不安全的編程語(yǔ)言,但我還是要說(shuō):那些聲稱用 Rust 就可以避免上周五全球大面積網(wǎng)絡(luò)中斷的說(shuō)法太夸張了,對(duì) Rust 的口碑有害無(wú)益。 如果 CrowdStrike 是用 Rust 編寫的,那確實(shí)可以降低發(fā)生故障的可能性,但它并不能解決導(dǎo)致故障發(fā)生的根本原因。所以看到許多人說(shuō) Rust 是解決這次事故的唯一答案,我就感到非常惱火——這種說(shuō)法,不僅無(wú)法推動(dòng) Rust 的普及,反而會(huì)招來(lái)反感:C++ 專家們都知道本次事故的根本原因,看到這種誤導(dǎo)性說(shuō)法必然不快,從而導(dǎo)致系統(tǒng)編程世界的進(jìn)一步分裂。 那么,為什么說(shuō) Rust 不能解決這個(gè)問(wèn)題呢?接下來(lái)我會(huì)試著回答這個(gè)問(wèn)題,同時(shí)也深入探討一下造成這次故障的原因。 故障分析 以下是來(lái)自 CrowdStrike 官方的“事后分析”:
把上面這段話翻譯為“人話”,就是: 1、CrowdStrike 公司推送了一項(xiàng)配置更新。 2、該更新觸發(fā)了“Falcon 平臺(tái)”中的一個(gè)潛在 bug。 3、Falcon 中的這個(gè) bug 導(dǎo)致了 Windows 崩潰。 前兩點(diǎn)并不奇怪:對(duì)于任何在線系統(tǒng)來(lái)說(shuō),變更配置都是“家常便飯”,而這些更新引發(fā)代碼中的 bug 也是常見(jiàn)現(xiàn)象。事實(shí)上,大多數(shù)宕機(jī)事件都是由人為配置變更造成的。 顯然,我們應(yīng)該問(wèn)問(wèn)為什么這個(gè) bug 會(huì)存在,以及如何修復(fù)它以提高產(chǎn)品的穩(wěn)定性。但我們別忘了第三點(diǎn):為什么這個(gè) bug 能夠?qū)е抡_(tái)機(jī)器癱瘓?更重要的是,為什么這個(gè) bug 會(huì)讓全球如此多的系統(tǒng)宕機(jī)? 內(nèi)存錯(cuò)誤 讓我們從第一個(gè)問(wèn)題開(kāi)始:Falcon 中的 bug 是什么性質(zhì)的? 很簡(jiǎn)單:在“Channel Files”(又稱配置文件)解析器中存在一個(gè)邏輯錯(cuò)誤,當(dāng)遇到一些無(wú)效輸入時(shí),這段代碼會(huì)試圖訪問(wèn)一個(gè)無(wú)效的內(nèi)存位置。具體細(xì)節(jié)并不重要:可能是取消引用空指針,也可能是一般保護(hù)故障等等。關(guān)鍵在于:崩潰是由無(wú)效內(nèi)存訪問(wèn)問(wèn)題引發(fā)的。 這時(shí),一些 Rust 狂熱粉可能會(huì)跳出來(lái)說(shuō)::“看啊,果然!如果代碼是用 Rust 寫的,這個(gè) bug 就不會(huì)存在!”我無(wú)法否認(rèn)這個(gè)說(shuō)法:如果用 Rust,這個(gè)特定的 bug 確實(shí)不會(huì)出現(xiàn)。 但那又怎樣?就算避免了這種類型的 bug,下一次遇到 Rust 也無(wú)法避免的 bug 時(shí),該宕機(jī)還是會(huì)宕機(jī)——無(wú)視 Falcon 的本質(zhì)問(wèn)題、只關(guān)注內(nèi)存錯(cuò)誤的行為,好比“只見(jiàn)樹(shù)木,不見(jiàn)森林”。 那么,F(xiàn)alcon 究竟是什么呢? 內(nèi)核崩潰 在我看來(lái),F(xiàn)alcon 是一種“惡意軟件......不過(guò)是好人的惡意軟件”,也就是一個(gè)終端安全系統(tǒng)。Falcon 通常安裝在企業(yè)機(jī)器上,以便安全團(tuán)隊(duì)能夠?qū)崟r(shí)檢測(cè)并解除威脅(同時(shí)監(jiān)控員工的行為)。這確實(shí)有一定價(jià)值:大多數(shù)網(wǎng)絡(luò)攻擊都是通過(guò)社會(huì)工程學(xué)手段從入侵企業(yè)機(jī)器開(kāi)始的。 這種類型的產(chǎn)品必須對(duì)機(jī)器有控制權(quán),它必須能夠攔截所有用戶的文件和網(wǎng)絡(luò)操作以掃描其內(nèi)容,并且還必須是防篡改的,以防“精明”的企業(yè)用戶在閱讀到一些網(wǎng)上修復(fù) WiFi 的可疑指導(dǎo)后嘗試禁用它,以避免提交 IT 工單。 如何實(shí)現(xiàn)像 Falcon 這樣的產(chǎn)品?最簡(jiǎn)單的方法,也是 Windows 鼓勵(lì)的方法,就是編寫一個(gè)內(nèi)核模塊。很明顯,F(xiàn)alcon 是一個(gè)內(nèi)核模塊,因此它運(yùn)行在內(nèi)核空間。這就意味著,Falcon 代碼中的任何錯(cuò)誤都可能破壞正在運(yùn)行的內(nèi)核,進(jìn)而導(dǎo)致整個(gè)系統(tǒng)崩潰。 我所說(shuō)的“任何錯(cuò)誤”,是真的。內(nèi)核不僅會(huì)因?yàn)閮?nèi)存錯(cuò)誤而崩潰,也不一定非要“內(nèi)核崩潰”才能讓機(jī)器無(wú)法使用:死鎖會(huì)讓阻止內(nèi)核前進(jìn),系統(tǒng)調(diào)用處理程序中的邏輯錯(cuò)誤會(huì)阻止用戶空間之后打開(kāi)任何文件,一個(gè)無(wú)限遞歸算法會(huì)耗盡內(nèi)核的堆棧……破壞內(nèi)核穩(wěn)定性的方法實(shí)在是太多了,所以我說(shuō)就算是 Rust 也不能完全避免這種事故的發(fā)生。 Rust 的內(nèi)存安全性只能解決一種類型的崩潰。另外,Rust 生態(tài)系統(tǒng)中對(duì)正確性的關(guān)注也確實(shí)可以最大限度地減少其他類型邏輯錯(cuò)誤的出現(xiàn)。但是……雖然我們都希望做到完美,但也必須接受錯(cuò)誤會(huì)發(fā)生的事實(shí)——斷言 Rust 是解決問(wèn)題的唯一答案和堅(jiān)持使用 C++ 一樣,都是不負(fù)責(zé)任的行為。 要知道,在內(nèi)核空間工作的 C++ 開(kāi)發(fā)者,要比了解內(nèi)核內(nèi)部結(jié)構(gòu)的 Rust 開(kāi)發(fā)者多得多。因此,大部分 C++ 開(kāi)發(fā)者都知道這種說(shuō)法的可笑之處,同時(shí)也會(huì)增加兩個(gè)社區(qū)之間的敵意,更是完全違背了讓人們轉(zhuǎn)向安全語(yǔ)言的這個(gè)目標(biāo)。Rust 開(kāi)發(fā)者知道 Rust 確實(shí)可以改善現(xiàn)狀,但 C++ 開(kāi)發(fā)者無(wú)法接受,因?yàn)樗麄兟?tīng)到的觀點(diǎn)無(wú)法引起他們的共鳴。 從內(nèi)核空間到用戶空間 還有人說(shuō),如果 Falcon 不在內(nèi)核中運(yùn)行,就根本不會(huì)發(fā)生這種情況。嗯,這個(gè)說(shuō)法要好一點(diǎn),但……僅此一點(diǎn)也不一定就能解決問(wèn)題。 正如我之前提到的,F(xiàn)alcon 需要盡可能防篡改,防止惡意軟件對(duì)其進(jìn)行干擾,并防止被入侵的用戶試圖禁用它。如果惡意軟件或人類能夠輕易做到這一點(diǎn),那么這個(gè)產(chǎn)品就毫無(wú)用處。 現(xiàn)在,Windows 內(nèi)核完全有能力禁止類似 Falcon 的內(nèi)核模塊。相反,內(nèi)核可以暴露一系列 API,讓用戶空間的應(yīng)用程序能夠接入這些 API 來(lái)提供類似的功能。你知道嗎,微軟確實(shí)嘗試過(guò)讓 Windows 朝這個(gè)方向發(fā)展,但殺毒軟件公司威脅要以反壟斷為由起訴,結(jié)果整個(gè)計(jì)劃無(wú)疾而終。因此,我們現(xiàn)在只能忍受一個(gè)安全性較低的系統(tǒng),因?yàn)闅⒍拒浖拘枰N售那些煩人的產(chǎn)品。 但是,我們先暫時(shí)放下這個(gè)麻煩不談。即使 Falcon 運(yùn)行在用戶空間,并通過(guò)受控 API 與內(nèi)核通信……這就足以防止系統(tǒng)故障嗎?請(qǐng)注意,這些 API 也需要防篡改。試想一下,如果你希望這個(gè)用戶空間驅(qū)動(dòng)程序在內(nèi)核執(zhí)行每個(gè)二進(jìn)制文件之前進(jìn)行驗(yàn)證,也就是讓內(nèi)核在每次執(zhí)行時(shí)都需要從用戶空間驅(qū)動(dòng)程序獲得答案,而這個(gè)驅(qū)動(dòng)程序又有問(wèn)題,那么系統(tǒng)將無(wú)法再執(zhí)行任何程序。 可如果你讓內(nèi)核與驅(qū)動(dòng)程序通信變成可選項(xiàng),以便內(nèi)核可以容忍崩潰的驅(qū)動(dòng)程序,那么就等于給惡意軟件開(kāi)了一條路,它們可以先嘗試崩潰驅(qū)動(dòng)程序,然后再入侵系統(tǒng)。 因此,僅僅“遷移到用戶空間”顯然也不是解決辦法。 部署中的漏洞 如果我們必須接受 bug 的存在,而內(nèi)存相關(guān)的 bug 并不是唯一會(huì)導(dǎo)致系統(tǒng)崩潰的原因,且將驅(qū)動(dòng)程序移到用戶空間也不是很好的解決方案……那難道就無(wú)計(jì)可施了?真的沒(méi)有辦法防止這種情況發(fā)生嗎? 以上我說(shuō)的這些,都是可以(也應(yīng)該)采取的措施,以減少系統(tǒng)故障發(fā)生的概率,但我們必須接受這樣一個(gè)事實(shí):這次代碼 bug 只是特定的觸發(fā)因素,就算換一個(gè)觸發(fā)因素也可能會(huì)產(chǎn)生類似的惡果。本次全球宕機(jī)事件的根本原因,在于配置變更的發(fā)布流程。 根據(jù) SRE 101(或 DevOps,隨便你怎么叫)規(guī)定,配置變更必須分階段進(jìn)行,以緩慢和受控的方式部署,并在每個(gè)步驟進(jìn)行驗(yàn)證。這些變更應(yīng)該先在很小的范圍內(nèi)進(jìn)行驗(yàn)證,然后再向全球推送,而且每次推送都應(yīng)是漸進(jìn)的。 考慮到 Falcon 的關(guān)鍵性以及 bug 可能帶來(lái)的巨大影響,我很難相信 CrowdStrike 沒(méi)有對(duì)部署進(jìn)行任何驗(yàn)證。但根據(jù) CrowdStrike 最新更新的事后分析來(lái)看,他們確實(shí)沒(méi)有進(jìn)行任何形式的測(cè)試或金絲雀部署(在將更改推廣到整個(gè)服務(wù)集群之前,先把更改推廣到一小部分用戶進(jìn)行測(cè)試),這實(shí)在是令人難以置信的疏忽。 所以說(shuō),CrowdStrike 的部署實(shí)踐是造成此次事件的罪魁禍?zhǔn)住?strong>也就是說(shuō),這次宕機(jī)事件是一個(gè)流程問(wèn)題,而不是代碼或技術(shù)問(wèn)題,改用 Rust 也無(wú)濟(jì)于事。 CrowdStrike 發(fā)布初步審查報(bào)告,總結(jié):“測(cè)試和流程不完善” 誠(chéng)然如 Julio Merino 所說(shuō),CrowdStrike 在其官網(wǎng)最新發(fā)布了此事件的初步審查報(bào)告,并公開(kāi)了此次事件的整體時(shí)間線:
部分網(wǎng)友在看過(guò) CrowdStrike 這份冗長(zhǎng)的初步審查報(bào)告后,精辟總結(jié):“說(shuō)了這么多,就是想說(shuō)我們的測(cè)試和流程不完善,不小心把垃圾發(fā)布出來(lái)了”;“字?jǐn)?shù)驚人,但歸根結(jié)底還是測(cè)試代碼有 bug 以及測(cè)試不夠”;“不好意思,我們對(duì)此更新進(jìn)行的唯一測(cè)試,是一個(gè)沒(méi)真正通過(guò)的自動(dòng)化測(cè)試”。 因此對(duì)于這種事故原因,絕對(duì)不是改用 Rust 就能解決的,根本還是在于測(cè)試環(huán)節(jié)和部署流程的不規(guī)范。與此同時(shí),CrowdStrike 也在事后總結(jié)中表示,今后要在發(fā)布更新前增加軟件測(cè)試,并逐步推出更新,具體補(bǔ)救措施大體分為三個(gè)部分: 1、軟件彈性和測(cè)試 (1)通過(guò)使用以下測(cè)試類型改進(jìn)快速響應(yīng)內(nèi)容測(cè)試:本地開(kāi)發(fā)人員測(cè)試,內(nèi)容更新和回滾測(cè)試,壓力測(cè)試、模糊測(cè)試和故障注入,穩(wěn)定性測(cè)試和內(nèi)容接口測(cè)試; (2)在快速反應(yīng)內(nèi)容的驗(yàn)證器中增加額外的驗(yàn)證檢查; (3)增強(qiáng)內(nèi)容解釋器中現(xiàn)有的錯(cuò)誤處理功能。 2、快速響應(yīng)內(nèi)容部署 (1)對(duì)快速響應(yīng)內(nèi)容實(shí)施交錯(cuò)部署策略,從金絲雀部署開(kāi)始,再逐步將更新部署到更大的區(qū)域; (2)改進(jìn)對(duì)傳感器和系統(tǒng)性能的監(jiān)控,在快速響應(yīng)內(nèi)容部署期間收集反饋信息,以指導(dǎo)分階段部署; (3)允許用戶選擇部署的時(shí)間和位置,使其能夠更好地控制快速響應(yīng)內(nèi)容更新的交付; (4)通過(guò)客戶可訂閱的發(fā)布說(shuō)明提供內(nèi)容更新詳情。 3、第三方驗(yàn)證 (1)進(jìn)行多個(gè)獨(dú)立的第三方安全代碼審查; (2)對(duì)從開(kāi)發(fā)到部署的端到端質(zhì)量流程進(jìn)行獨(dú)立審查。 參考鏈接: https://www.crowdstrike.com/falcon-content-update-remediation-and-guidance-hub/ https://blogsystem5.substack.com/p/crowdstrike-and-rust 該文章在 2024/7/26 16:40:04 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |