單介紹一下編程方式的歷史演變。
-- Erik O'shaughnessy(作者)
在計算機誕生不久的早期年代,硬件非常昂貴,而程序員比較廉價。這些廉價程序員甚至都沒有“程序員”這個頭銜,并且常常是由數(shù)學家或者電氣工程師來充當這個角色的。早期的計算機被用來快速解決復雜的數(shù)學問題,所以數(shù)學家天然就適合“編程”工作。
首先來看一點背景知識。計算機自己是做不了任何事情的,它們的任何行為都需要程序來引導。你可以把程序看成是非常精確的菜譜,這種菜譜讀取一個輸入,然后生成對應的輸出。菜譜里的各個步驟由操作數(shù)據(jù)的指令構成。聽上去有點兒復雜,不過你或許知道下面這個語句是什么意思:
1 + 2=3
其中的加號是“指令”,而數(shù)字 1 和 2 是數(shù)據(jù)。數(shù)學上的等號意味著等式兩邊的部分是“等價”的,不過在大部分編程語言中對變量使用等號是“賦值”的意思。如果計算機執(zhí)行上面這個語句,它會把這個加法的結果(也就是“3”)儲存在內存中的某個地方。
計算機知道如何使用數(shù)字進行數(shù)學運算,以及如何在內存結構中移動數(shù)據(jù)。在這里就不對內存進行展開了,你只需要知道內存一般分為兩大類:“速度快/空間小”和“速度慢/空間大”。CPU 寄存器的讀寫速度非??欤强臻g非常小,相當于一個速記便簽。主存儲器通常有很大的空間,但是讀寫速度就比寄存器差遠了。在程序運行的時候,CPU 不斷將它所需要用到的數(shù)據(jù)從主存儲器挪動到寄存器,然后再把結果放回到主存儲器。
當時的計算機很貴,而人力比較便宜。程序員需要耗費很多時間把手寫的數(shù)學表達式翻譯成計算機可以執(zhí)行的指令。最初的計算機只有非常糟糕的用戶界面,有些甚至只有前面板上的撥動開關。這些開關就代表一個內存“單元”里的一個個 “0” 和 “1”。程序員需要配置一個內存單元,選擇好儲存位置,然后把這個單元提交到內存里。這是一個既耗時又容易出錯的過程。
程序員 Betty Jean Jennings (左) 和 Fran Bilas (右) 在操作
后來有一名 電氣工程師 認為自己的時間很寶貴,就寫了一個程序,能夠把人們可以讀懂的“菜譜”一樣的輸入轉換成計算機可以讀懂的版本。這就是最初的“匯編器”,在當時引起了不小的爭議。這些昂貴機器的主人不希望把計算資源浪費在人們已經能做的任務上(雖然又慢又容易出錯)。不過隨著時間的推移,人們逐漸發(fā)現(xiàn)使用匯編器在速度和準確性上都勝于人工編寫機器語言,并且計算機完成的“實際工作量”增加了。
盡管匯編器相比在機器面板上切換比特的狀態(tài)已經是很大的進步了,這種編程方式仍然非常專業(yè)。上面加法的例子在匯編語言中看起來差不多是這樣的:
01 MOV R0, 1 02 MOV R1, 2 03 ADD R0, R1, R2 04 MOV 64, R0 05 STO R2, R0
每一行都是一個計算機指令,前面是一個指令的簡寫,后面是指令所操作的數(shù)據(jù)。這個小小的程序首先會將數(shù)值 1 “移動”到寄存器 R0,然后把 2 移動到寄存器 R1。03 行把 R0 和 R1 兩個寄存器里的數(shù)值相加,然后將結果儲存在 R2 寄存器里。最后,04 行和 05 行決定結果應該被放在主存儲器里的什么位置(在這里是地址 64)。管理內存中存儲數(shù)據(jù)的位置是編程過程中最耗時也最容易出錯的部分之一。
匯編器已經比手寫計算機指令要好太多了,不過早期的程序員還是渴望能夠按照他們所習慣的方式,像書寫數(shù)學公式一樣地去寫程序。這種需求推動了高級編譯語言的發(fā)展,其中有一些已經成為歷史,另一些如今還在使用。比如 ALGO 就已經成為歷史了,但是像 Fortran 和 C 這樣的語言仍然在不斷解決實際問題。
ALGO 和 Fortran 編程語言的譜系樹
這些“高級”語言使得程序員可以用更簡單的方式編寫程序。在 C 語言中,我們的加法程序就變成了這樣:
int x; x=1 + 2;
第一個語句描述了該程序將要使用的一塊內存。在這個例子中,這塊內存應該占一個整數(shù)的大小,名字是 x。第二個語句是加法,雖然是倒著寫的。一個 C 語言的程序員會說這是 “X 被賦值為 1 加 2 的結果”。需要注意的是,程序員并不需要決定在內存的什么位置儲存 x,這個任務交給編譯器了。
這種被稱為“編譯器”的新程序可以把用高級語言寫的程序轉換成匯編語言,再使用匯編器把匯編語言轉換成機器可讀的程序。這種程序組合常常被稱為“工具鏈”,因為一個程序的輸出就直接成為另一個程序的輸入。
編譯語言相比匯編語言的優(yōu)勢體現(xiàn)在從一臺計算機遷移到不同型號或者品牌的另一臺計算機上的時候。在計算機的早期歲月里,包括 IBM、DEC、德州儀器、UNIVAC 以及惠普在內的很多公司都在制造除了大量不同類型的計算機硬件。這些計算機除了都需要連接電源之外就沒有太多共同點了。它們在內存和 CPU 架構上的差異相當大,當時經常需要人們花費數(shù)年來將一臺計算機的程序翻譯成另一臺計算機的程序。
有了高級語言,我們只需要把編譯器工具鏈遷移到新的平臺就行了。只要有可用的編譯器,高級語言寫的程序最多只需要經過小幅修改就可以在新的計算機上被重新編譯。高級語言的編譯是一個真正的革命性成果。
1983 發(fā)布的 IBM PC XT 是硬件價格下降的早期例子。
程序員們的生活得到了很好的改善。相比之下,通過高級語言表達他們想要解決的問題讓事情變得輕松很多。由于半導體技術的進步以及集成芯片的發(fā)明,計算機硬件的價格急劇下降。計算機的速度越來越快,能力也越來越強,并且還便宜了很多。從某個時間點往后(也許是 80 年代末期吧),事情發(fā)生了反轉,程序員變得比他們所使用的硬件更值錢了。
隨著時間的推移,一種新的編程方式興起了。一種被稱為“解釋器”的特殊程序可以直接讀取一個程序將其轉換成計算機指令以立即執(zhí)行。和編譯器差不多,解釋器讀取程序并將它轉換成一個中間形態(tài)。但和編譯器不同的是,解釋器直接執(zhí)行程序的這個中間形態(tài)。解釋型語言在每一次執(zhí)行的時候都要經歷這個過程;而編譯程序只需要編譯一次,之后計算機每次只需要執(zhí)行編譯好的機器指令就可以了。
順便說一句,這個特性就是導致人們感覺解釋型程序運行得比較慢的原因。不過現(xiàn)代計算機的性能出奇地強大,以至于大多數(shù)人無法區(qū)分編譯型程序和解釋型程序。
解釋型程序(有時也被成為“腳本”)甚至更容易被移植到不同的硬件平臺上。因為腳本并不包含任何機器特有的指令,同一個版本的程序可以不經過任何修改就直接在很多不同的計算機上運行。不過當然了,解釋器必須得先移植到新的機器上才行。
一個很流行的解釋型語言是 perl 。用 perl 完整地表達我們的加法問題會是這樣的:
$x=1 + 2
雖然這個程序看起來和 C 語言的版本差不多,運行上也沒有太大區(qū)別,但卻缺少了初始化變量的語句。其實還有一些其它的區(qū)別(超出這篇文章的范圍了),但你應該已經注意到,我們寫計算機程序的方式已經和數(shù)學家用紙筆手寫數(shù)學表達式非常接近了。
最新潮的編程方式要數(shù)虛擬機(經常簡稱 VM)了。虛擬機分為兩大類:系統(tǒng)虛擬機和進程虛擬機。這兩種虛擬機都提供一種對“真實的”計算硬件的不同級別的抽象,不過它們的作用域不同。系統(tǒng)虛擬機是一個提供物理硬件的替代品的軟件,而進程虛擬機則被設計用來以一種“系統(tǒng)獨立”的方式執(zhí)行程序。所以在這個例子里,進程虛擬機(往后我所說的虛擬機都是指這個類型)的作用域和解釋器的比較類似,因為也是先將程序編譯成一個中間形態(tài),然后虛擬機再執(zhí)行這個中間形態(tài)。
虛擬機和解釋器的主要區(qū)別在于,虛擬機創(chuàng)造了一個虛擬的 CPU,以及一套虛擬的指令集。有了這層抽象,我們就可以編寫前端工具來把不同語言的程序編譯成虛擬機可以接受的程序了。也許最流行也最知名的虛擬機就是 Java 虛擬機(JVM)了。JVM 最初在 1990 年代只支持 Java 語言,但是如今卻可以運行 許多 流行的編程語言,包括 Scala、Jython、JRuby、Clojure,以及 Kotlin 等等。還有其它一些不太常見的例子,在這里就不說了。我也是最近才知道,我最喜歡的語言 Python 并不是一個解釋型語言,而是一個 運行在虛擬機上的語言 !
虛擬機仍然在延續(xù)這樣一個歷史趨勢:讓程序員在使用特定領域的編程語言解決問題的時候,所需要的對特定計算平臺的了解變得越來越少了。
希望你喜歡這篇簡單介紹軟件背后運行原理的短文。有什么其它話題是你想讓我接下來討論的嗎?在評論里告訴我吧。
via: https://opensource.com/article/19/5/primer-assemblers-compilers-interpreters
作者: Erik O'Shaughnessy 選題: lujun9972 譯者: chen-ni 校對: wxy
本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽推出
幾天之前,國外著名網絡安全供應商CrowdStrike(吐槽一下:這公司的名字有“罷工”之意,也是很應景哈)向所有客戶發(fā)布了例行的自動更新,立即在全球范圍內導致850萬臺window電腦系統(tǒng)崩潰。
除非您自上周以來一直處于斷網狀態(tài),不然您應該聽說過CrowdStrike導致的Windows中斷,該中斷導致世界各地的航空公司、銀行、超市、警察部門、醫(yī)院、電視頻道等關鍵服務癱瘓。企業(yè)看到他們的Windows機器因“藍屏死機”而崩潰,并且沒有明顯的修復程序——至少最初沒有。該事件在規(guī)模上是非同小可的,并且它還涉及到一些在系統(tǒng)底層級別運行的軟件,這個因素讓我們更有理由去看一看。
今天,我們將介紹:
1、回顧 850萬臺Windows計算機的崩潰對各行各業(yè)的影響
2、根源:一個用于查找惡意進程的自動更新會以某種方式導致CSAgent.sys進程寫入無效的內存地址,并使計算機操作系統(tǒng)崩潰(簡單地說就是殺毒軟件更新出BUG了)
3、進度非常緩慢的人工修復 事件發(fā)生四天后,計算機恢復工作仍在進行中,因為每臺受影響的機器和主機都必須手動修復
4、誰負責?顯然,CrowdStrike主要的責任人,微軟公司應該承擔次要責任。2009年的一項法規(guī)可能會在此次事件中發(fā)揮作用
5、給軟件工程師的經驗教訓:量化潛在影響,執(zhí)行金絲雀/分階段部署等
1. 回顧
上周五(7月19日),發(fā)生了一次有史以來規(guī)模最大的、由軟件引發(fā)的window電腦故障。航空公司、銀行、超市、警察局、醫(yī)院、電視臺等社會關鍵企業(yè)使用的數(shù)百萬個Windows10、11操作系統(tǒng)突然崩潰,出現(xiàn)了可怕的“藍屏死機”,而且沒有明顯的修復方法。這是一次真正的全球宕機,從北美、歐洲到澳大利亞,整個西方世界都受到了沖擊。
全球航空旅行陷入混亂,在阿拉斯加,緊急服務號碼停止工作;在英國,天空新聞電視臺無法播出;麥當勞因收銀機故障而不得不關閉一些日本分店。總共有數(shù)以萬計的企業(yè)和數(shù)百萬人受到影響。與此同時,在F1賽車的世界里,梅賽德斯-奔馳車隊的電腦在匈牙利大獎賽上崩了。具有諷刺意味的是,該團隊的贊助商之一是就是此次事件的罪魁禍首CrowdStrike。
2024年7月19日,紐約拉瓜迪亞機場的傳送帶屏幕。
資料來源:維基百科
巴黎迪斯尼樂園受到影響,工作人員改用紙質打印輸出來顯示游樂設施的等待時間。
來源: The Points Guy
在新西蘭(奧克蘭)的一家超市自助結賬。
資料來源:《新西蘭先驅報》
由CrowdStrike更新引起的Windows崩潰給CrowdStrike贊助的F1車隊帶來了問題。
資料來源:英國廣播電臺/Getty
這場大崩盤的所有商業(yè)受害者都是網絡安全公司CrowdStrike的客戶,該公司是“端點安全”的市場領導者,擁有約20%的市場份額。它在Windows/Linux/Mac機器上安裝軟件,并運行防病毒、防火墻、入侵檢測和防御系統(tǒng)(IDP)等。引發(fā)全球大混亂的是Crowdstrike對其“獵鷹”產品(類似于火絨或者360安全衛(wèi)士)的一次更新。
我們知道全球有850萬臺Windows機器因共享這個更新而受到影響,后來由CrowdStrike證實。受災最嚴重的可能是達美航空公司,大約三分之一的航班(5000架)在三天內被取消。即使在第4天,達美航空也不得不在計算機恢復過程中取消了另外1000個航班,并且正在為受影響的客戶提供現(xiàn)金退款。
2. 根本原因
在運行CrowdStrike軟件的Windows機器開始崩潰的幾個小時后,該公司發(fā)布了更新:
“CrowdStrike正在積極協(xié)助受到最近更新BUG影響的客戶。Mac和Linux主機不受影響。該問題已被識別和隔離,并且已部署修復程序。這不是網絡攻擊。”
發(fā)生了什么?該公司向所有客戶推送了一個文件,然后導致操作系統(tǒng)崩潰。但這是怎么發(fā)生的呢?隨著事件的進行,一些開發(fā)人員試圖重建發(fā)生的事情。以下是帕特里克·沃德爾(Patrick Wardle)的詳細信息:
1.導致Windows崩潰的進程稱為“CSAgent.sys”
2.崩潰的指令是程序集指令“mov r9d,[r8]”。這指示將r8地址中的字節(jié)移動到r9d地址。問題是r8是一個未映射的地址(無效),因此進程崩潰!
罪魁禍首:導致全球Windows機器崩潰的匯編指令。
資料來源:帕特里克·沃德爾(Patrick Wardle)在X上的推文
3.崩潰是由CSAgent.sys進程讀取CrowdStrike推送到所有客戶端的新文件引起的,稱為“C-00000291-*.sys”
一天后,CrowdStrike分享了更多細節(jié):
1. 此更新的目標是檢測惡意軟件的通信活動。CrowdStrike的獵鷹安全軟件會觀察進程如何在機器上或網絡上進行通信,以嘗試查明惡意活動。此更新添加了一個新的規(guī)則文件,以篩選可疑的網絡通信活動。
2. 發(fā)布了具有新規(guī)則/命名的新配置文件。CrowdStrike的配置文件,例如可疑網絡連接的名稱、注冊表這些東西,它們將所有這些文件存儲在位置C:\Windows\System32\drivers\CrowdStrike\中(國內沒有,不用查了哈)。這些文件都是有編號的,命名連接的規(guī)則位于編號291下。命名模式為“C-00000291-*.sys”的每個文件都是此類別的規(guī)則。
3. 未經處理的錯誤使進程和操作系統(tǒng)崩潰。雖然我很想知道錯誤到底是什么,但CrowdStrike只分享了一個非常簡短的總結:
“配置更新觸發(fā)了邏輯錯誤,導致操作系統(tǒng)崩潰。這與編號文件291或任何其他頻道文件中包含的空字節(jié)無關?!?/p>
總之就是出現(xiàn)了一個很奇怪的BUG,不知何故,解析這些新的命名規(guī)則會導致程序集級指令嘗試將內存位置移動到無效位置。這就是使Windows設備崩潰的原因。(就是內存報錯藍屏)
3. 緩慢的手動修復
解決這種崩潰比平時要復雜得多,因為簡單的遠程重啟還原是不夠的,技術人員必須親自維護每臺計算機:
技術人員正在親自修復受影響的Windows計算機,因為沒有遠程修復選項。
資料來源:techAU on X
CrowdStrike在事件發(fā)生幾個小時后發(fā)布了針對此次故障的處理步驟。
步驟是:
將Windows啟動到安全模式或Windows恢復環(huán)境
導航到C:\Windows\System32\drivers\CrowdStrike目錄
找到與“C-00000291*.sys”匹配的文件并將其刪除
引導計算機重啟
恢復過程需要計算機上的管理員權限,這些步驟很專業(yè)(需要CMD或者powershell命令),普通用戶很難執(zhí)行恢復,因此在大多數(shù)公司,技術人員需要手動修復每臺機器。
在許多地方,Windows筆記本電腦都受到了影響。一位技術人員分享了這項任務的一瞥,發(fā)布了一張圖片,其中2000臺筆記本電腦中有120臺需要在一個周末內修復。
一些筆記本電腦要重置。資料來源:Dunken K Bliths on X
作為一個正常人,當我們看到一個全手動的流程時,顯然會想到,是否可以將其自動化,或者以巧妙的方式更快地完成。由于850萬臺機器需要復位,很明顯手動過程非常耗時。因此,獨立開發(fā)人員以及微軟公司都介入了:
一天后,iOS開發(fā)人員和Windows修補匠Adam Demasi(亞丹 德瑪西)創(chuàng)建了一個叫Unistrike的工具。通過一些額外的設置,您可以創(chuàng)建一個U盤來插入每臺受影響的機器,以便更快地恢復。
Microsoft在事件后的第二天發(fā)布了類似的恢復工具。
幾乎同一時刻,CrowdStrike分享說,他們正在為客戶測試一種新的、更快的恢復技術。
然鵝,在中斷四天后,大多數(shù)受影響的Windows設備都未得到修復。事實證明,大規(guī)模崩潰的操作系統(tǒng)比應用程序更難恢復,因為應用程序可以將補丁發(fā)送到客戶端,或者可以在服務器端完成修復。
4. 誰負責?
有趣的是,新聞媒體最初將其報道為“Microsoft宕機”或“Windows宕機”,但是它與事實相去甚遠。那么,誰導致了世界上最大的軟件崩潰呢?
CrowdStrike – 顯然
毋庸置疑,大部分責任在于CrowdStrike。在這一點上,我們只能推測哪些關鍵步驟被跳過了,或者做得不夠徹底。希望我們能在面向公眾的事后分析中學到更多經驗。同時,以下是CrowdStrike應該問的一些問題——:
1.更新是否經過測試,以及是如何測試的?
此配置文件(C-00000291-*.sys)中的更新是否以手動和自動方式進行了測試?如果是這樣,測試是如何通過的,為什么在實際生產中會發(fā)生崩潰?
事實上,我們知道測試環(huán)境永遠無法完全復制生產環(huán)境,因此bug可能會在測試中被通過。
2.這些配置更改在向公眾發(fā)布之前,是否已向CrowdStrike員工推出?
如果是,一些CrowdStrike員工是否也看到他們的操作系統(tǒng)崩潰了?
這樣的話,那么為什么要繼續(xù)推出?
如果有BUG,但自己家員工的機器沒有崩潰,倒是全世界的機器都崩潰了,那就更有趣了。
3. 有沒有金絲雀檢查程序?
“金絲雀”來自“煤礦中的金絲雀”一詞。在20世紀初,礦工們將籠子里的金絲雀鳥帶到了地下。這只鳥對有毒氣體的耐受性比人類低,所以如果這只鳥停止鳴叫或暈倒,這是對礦工的警告信號,表明存在危險氣體,并讓他們撤離。
如今,金絲雀測試意味著將代碼更改推廣到較小比例的用戶群,然后監(jiān)控此部署的運行狀況信號,以發(fā)現(xiàn)某些不對勁的跡象。
分階段推出意味著變化是一步一步的,在繼續(xù)之前評估每個階段的結果。分階段推出通常定義獲取更改功能的用戶群百分比,或此功能應推出的區(qū)域,或兩者兼而有之。
分階段推出計劃可能如下所示:
第 1 階段:在新西蘭推出10%(驗證更改的小市場)
第 2 階段:50%在新西蘭推出
第 3 階段:在新西蘭100%推廣
第 4 階段:全球10%的推廣
第 5 階段:全球25%的推廣
第 6 階段:全球50%的推廣
第 7 階段:全球100%推廣
在每個推出階段之間,都會設置一個達標條件,用于確定何時可以繼續(xù)推出下一個階段。這通常被定義為沒有BUG的反饋,并且觀察到業(yè)務指標的預期變化。
CrowdStrike是否使用了金絲雀方法,或者更像是“一次性梭哈”,將配置文件同時推送給所有客戶?現(xiàn)在,我們還不知道。
4. CrowdStrike的軟件在Windows中以內核級別運行,這意味著其進程在操作系統(tǒng)中擁有最高級別的權限,這意味著它可能會使整個系統(tǒng)崩潰,比如通過損壞操作系統(tǒng)的部分內存信息。在此級別運行的殺毒軟件對于監(jiān)督操作系統(tǒng)運行的進程以及發(fā)現(xiàn)威脅和漏洞是必要的,但這也意味著一次微小的更新——即使是看起來無辜的內容配置文件也可能導致整個系統(tǒng)崩潰。
5. 公司是否忽略了之前的類似系統(tǒng)宕機?一位在私營技術實驗室工作的黑客新聞評論員分享說,幾個月前,CrowdStrike對他們的Linux系統(tǒng)造成了類似的系統(tǒng)崩潰。這位開發(fā)人員總結道:
“早在2024年4月19日,Crowdstrike就對我們用于工作的linux計算機集群做了這件事,我一直很想對此大發(fā)雷霆?!?/p>
簡而言之,我們是一個私營的技術實驗室,制作了一堆不同的生產網站。我們運行Crowdstrike的安全軟件,它在周五晚上推送了一個與最新的穩(wěn)定版系統(tǒng)不兼容的更新。我們像往常一樣給系統(tǒng)打了補丁,在一周時間里一切都很好,然后我們用于多個網站和云主機的所有服務器同時硬件崩潰并無法啟動。
當我們將其中一個磁盤連接到一臺新的電腦并檢查錯誤日志時,Crowdstrike看起來像是罪魁禍首,所以我們手動刪除了它,機器啟動,嘗試重新安裝它,機器立即再次崩潰。很好,我們提交了技術支持工單并讓工程師在線。
Crowdstrike花了一天時間做出回應,然后要求提供更多證據(jù)(超出上述范圍)證明這是他們的錯。
一天后,他們承認了這個錯誤,幾周后,他們進行了根本原因分析,認為他們沒有在他們的測試中涵蓋我們的場景(我認為他們用于測試的是我們的上一代操作系統(tǒng)版本)。在我們自己的事后分析中,我們沒有真正的能力來防止同樣的事情再次發(fā)生:“Crowdstrike會隨時將軟件跟新推送到你的機器上,無論它是否緊急,而不進行測試。
(就像打游戲到一半,window突然藍屏并強制更新哈哈)
這些細節(jié)表明,CrowdStrike可能或應該意識到它可以——而且確實——通過更新使內核進程崩潰。
公平地說,像CrowdStrike這樣的公司擁有數(shù)百個工程團隊,一個團隊觀察到宕機的信息不一定會在整個組織中傳播。盡管如此,導致操作系統(tǒng)崩潰的CrowdStrike進程肯定是一個已知的漏洞,因為它是破壞客戶機器的最明顯方法,而它本來要保護的。
(笑死我了,宕機的電腦永遠不會中病毒)
Microsoft / Windows在干嘛?
為什么CrowdStrike可以在內核級別運行進程,這可能會使操作系統(tǒng)崩潰?相比之下,蘋果對MacOS進行了更改,以在用戶級別運行第三方軟件,而不是內核。
幾年來,蘋果一直在鼓勵第三方開發(fā)人員從內核擴展轉向在用戶級別運行的等效擴展。然而,直到最近一年左右,蘋果才提供了足夠的支持,使其可行。
因此,在Mac上,相同的CrowdStrike進程將在用戶空間中運行,如果它崩潰,它不會使整個系統(tǒng)隨之癱瘓。
(Mac真就生產力YYDS)
但是,在Windows和Linux上,防病毒和其他網絡安全軟件通常在內核級別運行,并且一直如此。那么,為什么Microsoft沒有效仿蘋果的做法,禁止第三方進入內核空間呢?事實證明,一起發(fā)生在在2010年之前的殺毒軟件公司的投訴,和歐盟法規(guī)發(fā)揮了作用。
監(jiān)管是罪魁禍首?
《華爾街日報》問Microsoft為什么不限制像CrowdStrike這樣的第三方軟件只在用戶空間運行,而不是在內核空間運行。它的回應是:
“Microsoft發(fā)言人表示,它不能像蘋果那樣合法地封鎖其操作系統(tǒng),因為它在一起用戶投訴后與歐盟委員會達成了諒解。2009年,Microsoft同意為安全軟件制造商提供與Microsoft相同級別的Windows訪問權限。
具有諷刺意味的是,所有這一切都始于2006年,當時Microsoft希望使其內核對Windows Vista更安全。
“如今,像賽門鐵克(類似于國內的360安全衛(wèi)士)這樣的安全供應商處于高度敏感的狀態(tài),因為他們已經開始與Microsoft正面競爭,而進一步反壟斷行動的幽靈籠罩著Microsoft在安全領域的一舉一動。
上周,歐盟競爭事務發(fā)言人喬納森·托德(Jonathan Todd)警告說,如果Microsoft不允許安全供應商有公平的競爭機會,市場可能會受到威脅。
(window在安全軟件方面涉及壟斷了,主打一個自產自銷)
賽門鐵克和其他安全供應商不喜歡微軟的行為,因為它會阻止他們訪問 Windows內核。他們表示,這將阻止他們提供賽門鐵克的“防篡改”技術等重要功能,該技術可以防止惡意程序修改賽門鐵克自己的軟件。
(病毒把殺毒軟件改了,倒反天罡)
Microsoft拒絕接受本文的采訪,但在上周接受IDG新聞采訪時,一位Microsoft高管表示,這只是為了防止內核被濫用。
“我們認為周圍存在大量混亂......我們認為產品中的某些安全功能奠定了基礎,“安全技術部門高級產品經理Stephen Toulouse(斯蒂芬·圖盧茲)說?!拔覀冋谧龅氖菍群伺c攻擊者隔離開來,因為目前存在的功能從未被任何人使用過——軟件供應商或攻擊者。
最終,賽門鐵克和其他供應商勝出。Microsoft只能“禁止”安全供應商在內核空間運行,前提是它也沒有在那里運行自己的安全軟件。因此,雖然Microsoft可以被視為對這次系統(tǒng)宕機負有部分責任,但該公司并沒有其他辦法來阻止此事件的發(fā)生!
不過,可能會有一種方法:如果Microsoft將自己的安全解決方案(例如Windows Defender)移出內核空間,將內核徹底對所有安全軟件供應商關閉,包括它自己。這樣做可能意味著對Windows安全系統(tǒng)進行重大更新。
5. 軟件工程師能學到什么
以下是我們軟件工程師可以從這次事件中吸取的一些教訓,就目前的情況而言:
量化軟件崩潰的影響
如果您公司的產品在幾個小時內不可挽回地崩潰,會發(fā)生什么?
如果發(fā)生這種情況,對您的公司和外部世界會有什么影響?例如:
如果亞馬遜在全球范圍內崩潰幾個小時,賣家將失去收入,一部分購物者可能會失去必需品。亞馬遜將失去收入并遭受聲譽損害。
如果TikTok在全球范圍內崩潰了幾個小時,品牌將無法投放廣告,客戶會因為無法使用社交平臺而感到無動于衷、略帶惱火或憤怒。關于TikTok被封鎖的牽強附會的理論可能會出現(xiàn),該公司將失去廣告收入,用戶將暫時涌向Ins、Reels和Snap等替代品。
如果一家主要的電話和互聯(lián)網運營商崩潰,其影響將遠遠超過上述兩家公司的總和。企業(yè)將難以運營,緊急服務可能會受到影響。損害將是影響到聲譽的、持久的,政府干預也可能隨之而來。就像去年11月,澳大利亞一半的互聯(lián)網被切斷14小時的情況。
這個經歷很有幫助,因為它可以讓人感覺到系統(tǒng)中斷的代價有多大。了解這些BUG的“殺傷半徑”有助于使操作系統(tǒng)更具彈性,并更快地檢測和緩解類似的事件。
死機不是一個人的錯
人們很容易將系統(tǒng)崩潰歸咎于誰寫了一段令人反感的代碼,也許是缺乏經驗的實習生,或者是生活過得很糟糕的資深工程師。但是,將責任歸咎于個人是錯誤的做法。Microsoft退休員工斯科特·漢塞爾曼(Scott Hanselman)總結了為什么這種規(guī)模的失敗從來都不是一個人的錯:
“伙計們,事情是這樣的。我從事編程工作已有32年了。當這樣的事情發(fā)生時,這是組織的失敗。是的,有人寫了一句不好的評論,有人可以把“責備”指向某些人,這太可怕了。
它總是一行代碼,但絕不是一個人。指責員工導致了錯誤是簡單化、和種族主義的。工程是一項團隊運動。包容造就了優(yōu)秀的團隊。良好的工程實踐造就了優(yōu)秀的軟件。工程實踐中未能發(fā)現(xiàn)錯誤是常見的,無論寫入該代碼的人員的資歷如何。
(黑鍋不能給實習生背,大家要一起背鍋)
拓展
大范圍的系統(tǒng)崩潰總是不好的,但一個好處是它們迫使我們的工程師停下來反思:
我的公司會發(fā)生類似的災難性事件嗎,如果是這樣,如何發(fā)生?
對人們會有什么影響?
我們該怎么做才能避免成為“下一個CrowdStrike”?
CrowdStrike宕機現(xiàn)在正式成為地球上有史以來最大的軟件宕機,客戶遭受了嚴重的財務和聲譽損失。目前尚不清楚CrowdStrike的經濟損失,但您可以假設這將是巨大的,因為一些企業(yè)會為造成的損失尋求賠償。
對于CrowdStrike來說,聲譽受損的情況再糟糕不過了。直到幾天前,該公司還是殺毒軟件安全合規(guī)性的黃金標準。但是現(xiàn)在不再是:它的名字與我們見過的最大規(guī)模系統(tǒng)崩潰有關。Crowdstrike的聲譽遭受了打擊,需要很長時間才能恢復。
沒有企業(yè)希望一次糟糕的更新部署對自己造成這樣的打擊,但它確實發(fā)生了。如果您發(fā)現(xiàn)公司的產品發(fā)布流程(測試、推出、監(jiān)控、警報等)存在問題,那么就應該將您的擔憂和建議提出,記得及時與您的經理或者上級領導交談。
CrowdStrike肯定會吸取教訓,毫無疑問。祝那里的團隊(以及所有受影響客戶的團隊)好運,以解決這次事件,并祝CrowdStrike繼續(xù)開展工作以徹底改革內部流程。
讓我們希望許多公司效仿,這一歷史性事件最終會成為科技行業(yè)的一次積極的經驗學習。