CrowdStrike大規模當機由21對20欄位數不符引發。Kestrel在裝置重開機前透過程式碼嚴格驗證。
CrowdStrike端點安全IT 韌性

CrowdStrike崩潰根源於欄位計數:核心預期20個卻來了21個。沒有任何獨立層在把關。

Ashutosh SinghalAshutosh Singhal2026年7月20日11 min

2024年7月19日,單次廠商更新在不到90分鐘內導致數百萬台Windows裝置崩潰,而罪魁禍首僅僅是一個數字。CrowdStrike的一個「Rapid Response Content」通道檔案宣告了21個欄位,而部署的核心直譯器預期的卻是20個。這個額外的欄位引發了越界讀取(out-of-bounds read),造成瞬間藍屏。又因為崩潰發生在開機的最早期階段,停止運作的代理程式根本無法重新啟動以接收回滾指令。復原意味著必須親自走到每一台機器面前,在安全模式(Safe Mode)下手動進行修復。

在真正想通困擾我的核心問題之前,我將CrowdStrike在當年8月發布的根本原因分析(RCA)讀了不止一遍。這不是駭客攻擊。也不是有缺陷的AI模型。這是一個確鑿無疑的可判定算術事實——21對20,深藏在一個從未經過任何獨立層驗證就直接進入正式生產環境的有效負載中。廠商的驗證器批准了它。那些陷入癱瘓的企業並未擁有那個驗證器。它們承擔的只有隨之而來的嚴重後果。

我將最近的一段時間用來圍繞這個缺口建構一個展示系統:一個我命名為Kestrel的控制台,它坐落在軟體廠商與正式生產叢集之間,透過程式碼裁定廠商被允許發布什麼內容。您可以在以下網址檢視其運作原理:veriprajna.com/demos/software-update-integrity。在建構過程中讓我感到驚訝的是解決方案最終所在的位置。我一開始深信自己需要一個更聰明的模型,然而最先捕獲崩潰的卻是幾行質樸的Python程式碼。

我重構了崩潰場景,然後讓程式碼做出裁決

我將7月19日的故障特徵重構成一個測試夾具(fixture),並將我自己的系統對準它,心裡甚至做好了在自己的重放中大失所望的準備。該軟體包是C-00000291,來自一家我虛構的名為SentinelEdge廠商的Rapid Response Content通道檔案,被推送到我命名為Acme Financial的合成8500個端點的叢集中。這些都不是真實的公司。但故障特徵完全是真實的:宣告的綱要欄位從20個激增到21個,並在沒有金絲雀計劃的情況下以單一波次推送到100%的叢集。

閘門同時觸發四項檢查,每一項都是純粹的算術或直接查表,絕非主觀判斷。綱要差異檢測器發現直譯器預期20個欄位而實際提供了21個,並標記越界讀取。模擬沙箱是一個確定性的各設定檔結果模型,而非真實的Windows虛擬機器叢集,它使叢集6個設定檔中的5個在重開機週期中陷入迴圈重開機。它是從獨立於綱要檢查的驅動程式相容性訊號中推導出這一點的,因此兩項結論是相互印證而非單純重複。停滯代理檢測器將回滾迴圈標記為true,因為崩潰的代理程式本身就是接收回滾指令的主體,而它在開機完成前就已經停止運作。爆炸半徑相對於5%的金絲雀策略達到了100%。裁決:BLOCK。螢幕上顯示:在任何正式端點重開機之前已攔截。

Kestrel控制台顯示針對廠商SentinelEdge的C-00000291的Block Rollout面板,包含四個確定性證明、一個8500端點的叢集以及估計5,000,000美元的避免停機損失。
C-00000291,7月19日特徵重放。閘門觸發全部四項檢查:綱要欄位計數不一致(預期20,提供21)、5/6設定檔的沙箱迴圈重開機、停滯代理回滾迴圈以及相對於5%金絲雀策略的100%爆炸半徑。裁決BLOCK,估計避免停機損失5,000,000美元。

僅這一次更新估計避免的停機損失就顯示為5,000,000美元,我想明確說明這個數字到底是什麼。它是展示系統自身的內建模組:受影響比例乘以每小時500萬美元的輸入參數,再乘以一小時的最低復原基準時間,公式直接顯示在螢幕上。這不是客戶實際節省下來的資金。7月19日的真實復原耗時數天而非一小時,因此該基準是刻意保持保守的。

綠色放行案例比紅色攔截案例更讓我警惕

相比紅色攔截案例,我對綠色放行案例更加感到焦慮,因為一個既攔截危險更新同時也扼殺安全更新的治理層,不過是你為自己提前安排的一次服務中斷。同一家虛構廠商推送了RRC-7741,這是一個良性的檢測特徵更新,宣告綱要為20對20,並附帶分階段的1.2%金絲雀計劃。代理團隊運作,綱要相符,6個設定檔中有5個順利通過重開機週期,停滯代理迴圈為false,爆炸半徑處於策略允許範圍內。裁決:APPROVE ROLLOUT,發布給102個端點的金絲雀環。綠色、迅速、平穩無波瀾。

Kestrel控制台顯示針對發布至1.2%金絲雀環的RRC-7741的綠色Approve Rollout面板,附帶7/7評估追蹤和證據記錄。
同一家廠商的良性更新RRC-7741。綱要相符,5/6設定檔通過重開機週期,停滯代理迴圈為false,爆炸半徑1.2%符合策略。裁決APPROVE ROLLOUT,發布給102端點金絲雀環,證據記錄sha256:798431b4c96612a9。

在該集合中的六次良性更新中,閘門產生了零次錯誤攔截。我之所以把分母完整列出,是因為六個就是六個,我絕不允許將它誇大為您整個叢集的萬能保證。ALLOW案例的價值比單純的百分比更加具體且更加重要。一個閘門唯有在日常流量中保持無形,而在可能摧毀您叢集的唯一關頭堅如磐石,它才是值得信賴的。

為什麼我將裁決權從模型中剝離

在建構之初,我假定最困難的部分是邏輯推理,並且認為更敏銳的模型或更聰明的批評者會是捕獲錯誤更新的關鍵。我錯了,而且我花了一段時間才坦然承認這一點。Kestrel內部確實有一組LLM團隊:一個規範化器、一個沙箱直譯器以及兩個針鋒相對的批評者,一個主張更新可以安全發布,另一個則力陳其會導致崩潰。這對對抗性組合之所以有其立足之地,是因為它在做出任何決定之前從正反兩個方向對裁決進行紅隊檢驗。但是,這些代理程式中沒有一個能夠敲定最終裁決。

最終裁決由兩個純Python檔案做出:verifier.pygate.py,它們完全位於代理框架之外。運作團隊基於Pydantic AI建構,預設模型為claude-opus-4-8,整個系統還可透過確定性建議回退機制在無API金鑰的情況下離線運作。在所有這些模式下,閘門都是完全相同的,並且傳回完全相同的決定,因為這項決定是算術計算,而不是機率推理。代理提供建議,程式碼做出裁決。一個傾向於「允許」的建議代理無法抹去一項嚴重的確定性檢測發現,這絕非個人喜好問題。

一個旨在審查廠商的防護層,絕不能在安全性上輕信廠商的一面之詞。它同樣不能輕信自身模型的一面之詞。

這句話正是該架構呈現當前形態的根本原因。對於一個唯一職責就是治理廠商交付物的系統而言,對其信任絕不能透過任何可能被說服從而妥協說「是」的元件來維繫。

我準備呈交給審計員的資料

在建構證據記錄的同時,我始終在第二台螢幕上開啟著歐盟《網路韌性法案》(CRA),因為那份記錄才是我真正需要捍衛的合規成果。每一次裁決都會匯出一個不可變的HTML檔案和一個包含SHA-256內容雜湊的已簽章JSON檔案,其中記錄了裁決結果、確定性證明、各設定檔沙箱結果、帶有模型ID的建議代理裁決、觸發的策略規則,以及記錄了每一步延遲的逐步驟評估追蹤。

針對被攔截的C-00000291的Kestrel裁決檢視,顯示帶有sha256:0f4f71b2bd7d1753的證據記錄,以及開啟HTML記錄和已簽章JSON的按鈕。
針對被攔截更新匯出的證據記錄。包含SHA-256內容雜湊、可開啟的HTML記錄和已簽章JSON檔案,直接在裁決產生時生成。

追蹤記錄是我在點擊查看具體步驟之前一直低估的部分。其中一個事件記錄道:「規範化已簽章的廠商清單,用時184毫秒完成」,並與裁決結果一同保留以供審計查核。每一個步驟都是可重新推導的。監管機構無需盲目信任我的儀表板。他們可以重新執行算術驗證並得出完全相同的結論。

Kestrel評估追蹤步驟彈出視窗,顯示「規範化已簽章的廠商清單,用時184毫秒完成」,並註明該事件已被保留以供審計查核。
評估追蹤的一個展開步驟:規範化已簽章的廠商清單,用時184毫秒完成,與裁決輸出產物一同保存供審計查核。

我對什麼是簽章、什麼不是簽章保持著嚴謹的態度。它是本地的SHA-256雜湊,而不是企業級PKI體系。廠商更新摘要源及其背後的ITSM工單是測試樁,而不是即時連接器。這份記錄旨在契合申報合規需求:CRA的短週期事件通報機制、SEC關於重大網路安全事件4個工作日內揭露的要求,以及2025年富爾頓郡Delta訴CrowdStrike一案中引發的廠商法律責任問題。僅僅是「旨在契合」,它不為任何人背書,也不構成法律建議,任何向您兜售聲稱能讓您合規的審計記錄的人,都只不過是在向您推銷商品。

還有一個令我引以為傲的決定,那就是一次「拒絕」。測試夾具XX-0000是一個閘門無法解析的加密專有內容二進位區塊(blob),因此閘門絕不妄加猜測。它傳回ABSTAIN(棄權)並轉交人工處理,因為一個給它讀不懂的內容放行的閘門,比完全沒有閘門還要危險。沙箱無法建模的舊版主機都會被標記並排除在外,絕不預設其為安全。詞彙表僅有四個詞:ALLOW、HOLD、BLOCK、ABSTAIN,而最後一個正是我會竭力捍衛的詞彙。

12個中的12個真正允許代表的意義

在這個節點上我必須放慢語速,因為這正是創辦人們最容易開始順水推舟四捨五入誇大成效的地方。而我把公司命名為Veriprajna——意為真正的智慧,因此誇大其詞是絕不允許的。在包含十二項更新的固定標註測試集中,閘門在全部十二項上都做出了正確的決定。其中六項是良性的,閘門沒有攔截其中任何一項。有一項是坦誠的ABSTAIN。計分板上清晰地寫著:12/12項經過驗證的決定,0/6項錯誤攔截,整個集合避免的潛在停機損失估計達1330萬美元,其中500萬美元來自單一的CrowdStrike層級攔截。

Kestrel基準測試面板顯示在標註發布測試集上的12/12項已驗證決定、0/6項誤報攔截和1330萬美元的規避風險暴露額。
標註測試集上的價值計分板:12/12項驗證決定,良性更新上0/6項誤報,整個集合估計避免1330萬美元停機損失。特意明確標註較小分母。

現在來到我堅決拒絕簡化的部分。這些只是十二個標註項目上的測試結果,絕非對進入您叢集的下一次更新的保證承諾。六個良性項目就是六個。這並不意味著「攔截100%的不良更新」,過去不是,將來也永遠不會是。如果您抓到我寫下這樣的話,您就應當停止閱讀我的文章。我所堅持保證的數字是另一種性質:相同的輸入,相同的決定,每次運作皆然,因為裁決過程不包含任何模型溫度。明天再次運作測試集,它將傳回逐位元組完全相同的結果。這正是讓確定性防護層能夠以機率層無法實現的方式接受嚴格審計的核心所在。

留給我的深思之問

在這次開發歷程中始終縈繞在我心頭的是,那次故障是何等的尋常普通。預期20個欄位的地方出現了21個。只要在廠商與叢集之間存在一個獨立的驗證者,任何獨立的驗證機制都本可以在任何一台裝置重開機前透過算術計算將其攔截。但是當時沒有。而在今天,絕大多數情況下依然沒有。

每家企業都在運作著8到12個來自其無法控制的廠商的核心特權代理,每個代理都能把檔案直接寫入ring 0核心層。SBOM工具監控開源相依性。身分識別系統監控存取權限。卻沒有任何人在廠商專有更新進入時對其進行讀取並證明其安全性。Kestrel不是EDR,也絕不觸碰核心。它坐落在這些代理之上,統領管轄它們被允許交付的內容。這正是我試圖建構的防護層,完整解析請造訪:veriprajna.com/demos/software-update-integrity

如果您寧願親眼目睹其實際運作也不願只讀我的文字描述,這裡有整個系統端對端完整運作的全貌。

因此,這就是我如今對所見到的每一個正式叢集提出的質疑:當下一次廠商更新到來時,在那份檔案與正式生產環境之間究竟矗立著什麼,它能否出示令人信服的工作證據?如果答案是一個盲目信任廠商的變更諮詢委員會(CAB),那麼那套擊垮數百萬台機器的算術錯誤就依然在毫無約束地潛伏運作。它不會預先通知。在重開機的那一刻到來之前,它看起來將與此前到來的每一次正常更新完全一模一樣。

相關研究

同步發佈於

自信打造您的 AI。

與一支在打造新世代企業級 AI 方面擁有深厚經驗的團隊攜手合作。讓我們協助您設計、建置並部署值得信賴的 AI 策略。

Veriprajna 深度科技顧問公司 專精於為醫療、金融及法規監管領域打造攸關安全的 AI 系統。我們的架構均依循既定規範進行驗證,並備有完整的合規文件。