可以讓電腦死機的小小代碼
有關編程的好笑的笑話太多了，其中最有趣的一個笑話是：為什麼程序員在淋浴的時候死了？因為洗髮液的瓶子說：「打泡，洗頭，重覆」。你沒理解嗎？這就是所謂的無限循環。程序員嚴格遵循這一清晰指令，「重覆」執行指令循環——直到死亡。你覺得不可理喻嗎？多年來，電腦一直陷入這樣的圈套。
（圖片來源：Getty Images） 事實上，這是經典的「fork炸彈」（fork bomb）攻擊——即耗盡電腦的資源，讓人無法再使用它。fork炸彈非常精簡，有時只有短短幾個字符。 一位用戶在網上作出解釋，這組字符在一些計算機語言中定義某個無意義的功能，然後讓計算機反覆執行它。計算機不會問為什麼——它只會服從命令。但是，請不要在家裏運行這一代碼，因為它有可能會導致你的系統變得非常遲緩，甚至造成死機。 2013年，據劍橋大學的研究人員估計，電腦病毒每年對全球經濟造成的損失達3120億美元。即使很小的程序錯誤也會造成很大的損失——比如放錯位置的一行代碼可能讓戰艦不能移動。那麼，這些短小的代碼具體是如何導致巨大災難的呢？ 「給出一套指令，計算機就會執行——但是計算機只會逐字逐句的執行，」 威斯康星大學麥迪遜分校（University of Wisconsin-Madison）的計算機專家本·利布利特（Ben Liblit）說。 「它們不具有常識。」 為什麼計算機會陷入死循環？利比利特提到，那是因為電腦循環計算數千次甚至數百萬次是一件非常有用的事。正是通過這一方式，電腦可以在一瞬間完成人類需要很長時間才能完成的計算——比如編輯一份長長的名單，確保首字母都是大寫的。對循環次數並沒有限制，這就意味著不管在理論上，還是在實踐中，計算機可以一直循環下去，直到它無法運行。 計算機可以做一些有用的事，計算機系統可以發揮很大作用，但計算機也會出現故障，計算機系統也會出故障。（圖片來源：Getty Images ） 歷史記載，首例造成問題的fork炸彈發生於1978年。與上述例子類似，它涉及的程序也十分短小——暱稱是「wabbit」——它會無限次備份自己。 這是一種惡意程序，它常常偽裝成日常的文件，並作為電郵附件發送至受害者的電腦。如果受害者下載並運行該文件，那就會引爆等待著的fork炸彈。 F-Secure的網絡安全專家米科·許珀寧（Mikko Hypponen）稱，還可以製作一種壓縮文件夾，當你去解壓縮時，它會不斷解壓出越來越多的內部文件。這被稱為「解壓炸彈」，一個著名的例子是一個在未解壓時只有42比特的病毒。它可以塞滿整個硬盤，並且佔滿內存，讓殺毒軟件失效。 2014年，有人發現加密敏感數據的軟件存在嚴重的缺陷，它被成為Heartbleed，攻擊者可以通過這一錯誤竊取隱私數據，比如密碼和信用卡信息。但是，正如薩里大學的艾倫·伍德沃德（Alan Woodward）所說，發起攻擊的代碼非常短——只有四比特。 最近，對心懷惡意的黑客來說，這些打包後十分短小的病毒代碼非常有用。比如在2010年，有人報告發現「推特病毒」，它會打開多個彈出窗口。電腦使用者一旦把鼠標指針移至被感染的推文上就會激活它。連白宮的官方推特賬戶也在一時間受到影響。 在Mandalorian公司工作的網絡安全專家史蒂夫·洛德（Steve Lord）也常常發現非常短小的惡意程序。他說，最近他在研究的是把而已代碼插入單個數據包內。數據包是電腦之間通過互聯網發送的小段數據。這個病毒相當複雜，它會破壞VPN安全連接。 或許造成電腦故障的最短小的代碼是「0」。任何數除以零都無法得到確定的數字，這是計算機無法處理的。 因為放錯位置的「0」，導致整艘約克城號航空母艦（USS Yorktown）在演習中停止運轉。（圖片來源：Getty Images） 洛德指出，這一情況出現在1997年9月的約克城號航空母艦上。航母上運行的某一程序中，數字0放錯了地方，它所帶來的錯誤導致整艘船在演習過程中被迫停止運行。它後來被拖回港口。 「感謝上帝這不是發生在戰鬥中。」洛德說。 洛德還提到Tiny Banker這一惡意軟件，它會感染電腦的瀏覽器，當用戶試圖登錄網銀賬戶時，它就會複製登錄信息。它的大小是20000比特，已經感染了全世界數千個系統。 「就視窗系統的程序來說，它小到可笑的地步。」洛德說。 但這一切都不意味著電腦在根本上容易出錯——它只是說明工程師面臨棘手的挑戰，他們要想辦法保護電腦免受惡意攻擊或出現內部錯誤。洛德認為，虛擬世界的一點小錯誤就會造成嚴重的後果，這一現象帶有一定的「美感」。不過了，美國海軍恐怕不會同意。 利布利特說，計算機有一種能力，它會堅定不移的貫徹執行，不論結果的好壞。他說：「計算機可以做一些有用的事，計算機系統可以發揮很大作用，但計算機也會出現故障，計算機系統也會出故障」至少，在大多數情況下，你可以關機重啟。 請訪問 BBC Future 閱讀 英文原文。