軟件史上最嚴重的十個Bug

 

原文地址:http://www.cxybase.com/daypic/bug-117.html

 

2005年10月在通報其汽車預警燈毫無理由的點亮和汽油發動機出現不可預 見的延遲之後,豐田製造商宣佈召回他的160,000輛Prius hybrid混合動力汽車。但和去年大規模的召回汽車不同,Prius hybrid的根本問題不是硬件問題——而是智能型汽車的軟件出了故障。Prius hybrid汽車中的嵌入式軟件中存在着bug。

伴隨 着這次召回,Prius hybrid也加入到Buggy Computer的行列中—這是一個在1947年成立的組織,這一年工程師在Harvard Mark 1系統中的F, Relay #70中發現了一個bug。當工程師發現故障時,該計算機正在運行它的乘法器和加法器。該錯誤被捕獲,刪除並且以下面的語句的方式錄製到計算機的日誌 中:“first actual case of a bug being found.”

60過去了,計算機bug仍然存在着,同時並沒 有任何滅絕的跡象。隨着軟件和硬件的界限越來越難以區分,代碼錯誤越來越對我們的日常生活造成不良影響。Bug並不僅僅是寄生在我們的操作系統和應用程序 中—今天他們存在於我們的電話、起搏器、我們的電力設備和醫療設備中,還有我們的車上。

但是哪一個是最嚴重的呢?

我們很容易列出造成較大破壞的bug,然而我們卻很難去評估他們的嚴重程度。哪一個破壞性更大?—是一個被計算機蠕蟲所利用,連續幾天關閉你的上網服務的安全漏洞,還是一個引發國家電話系統整個白天癱瘓的排字工?答案也許取決於你是需要打電話還是查收你的電子郵件。

很 多人認爲最嚴重的bug是能夠致命的bug。固然,這類的bug不是很多,但是像Therac-25的案例被普遍認爲是一種會在重要的安全應用程序的軟件 廣泛傳播的警告。儘管研究這些系統的專家警告該軟件可能會對一些人造成傷害,阻止該技術引入到那些非常需要智能處理技術的領域,那些人需要承受可能會有的 風險。然而,最終他們卻認爲該軟件的缺乏可能會比那些不可避免的bug給更多的人造成傷害。

Mariner I發射

按照時間順序,著名網絡媒體Wired News列出了到目前爲止10個最嚴重的軟件bug。

1962年7月28日, Mariner I空間探測器事件。

Mariner 1航空軟件的bug導致火箭在發射時偏離了其的預期軌道。任務控制器在大西洋上空將整個火箭摧毀。在對這起事故進行調查中發現,使用鉛筆撰寫下的一個公式被不正確的錄入到計算機代碼中,直接導致計算機錯誤的計算了火箭的運行軌道。

1982年—蘇聯的石油管道事件。

根 據CIA(美國中央情報局)的陳述,爲其工作的間諜們在蘇聯購買的用來控制跨西伯利亞石油管道的加拿大計算機系統中種下了一個bug。當時是蘇聯通過祕密 購買或者偷竊美國的敏感技術來獲取到了該系統。據說CIA發現了這個存在bug的程序,決定對可以通過蘇聯人檢查的設備做一個讓蘇聯人事與願違的破壞,使 得該設備一旦運行起來將會失敗。該事件的結果據說在歷史上造成了最大的非原子破壞。

1985-1987年間 -- Therac-25醫療加速器事件。

一 個放射療法的設備故障造成了在幾個醫療設備中發出了致命的射線。Therac-25是一個在以前設計的基礎上改進的治療設備,該設備可能會發出兩種射線: 或者是一個低功耗的電子束或者是X射線。Therac-25'的X射線是通過猛烈的高能電子束撞擊到一塊位於電子槍和患者之間的金屬目標而產生的。第二項 改進是對於更舊的Therac-20'電動保險聯動裝置採取軟件控制的方式代替,做這項改進是因爲軟件被認爲更加可靠。

然而工程師所不知道 的是20和25型號都是建立在有一個沒有經過正規培訓的程序員所開發的操作系統上的。由於這個不易察覺的叫做"race condition,"的bug,一個快速的打字員很可能會很偶然的配置Therac-25從而導致電子束將會在高能模式下啓動。但是強烈的X射線偏移了 目標。最後直接導致了五名患者死亡;其餘患者受到了嚴重傷害。

1988年--伯克萊UNIX操作系統finger守護進程緩衝器溢出事件。

第 一個網絡蠕蟲,莫里斯蠕蟲利用緩衝器溢出在一天之內感染了2000到6000臺計算機,起因是一個標準輸入輸出庫函數gets(),原來設計爲從網上獲取 一段文本,但遺憾的是,gets()函數沒有規定輸入文本的長度。過長的文本導致蠕蟲入侵任何接入的計算機。程序員們試圖用工作碼來取代gets()函數 的功能,但是他們拒絕從C語言的標準輸入輸出庫中刪除它,直到今天還保留着。

1988-1996年間--Kerberos隨機數字發生器事件。

Kerberos安全系統的作者忽略了產生真正的程序隨機碼時使用恰當的種子,導致長達八年依賴Kerberos驗證的計算機可被輕易入侵。如果漏洞不被利用,就一直不會被發現。

1990年1月15日,AT&T網絡癱瘓。

利 用一個新發布軟件的bug可以控制AT&T #4ESS遠程交換機,在鄰近計算機之間發送信息引起大型計算機癱瘓,機器恢復時發送信息又導致鄰近計算機當機。 一天紐約的一臺交換機當機並且重啓,引起它鄰近交換機癱瘓,由此及彼,一個連着一個,很快,114臺交換機每六秒當機重啓一次,六萬人九小時內不能打長途 電話。當時的解決方式:工程師重裝了軟件以前的版本。

1993年--Intel奔騰浮點指數除法事件。

一 個硅片上的錯誤導致Intel高性能奔騰芯片在一段範圍內計算浮點指數除法時發生錯誤。例如4195835.0/3145727.0產生的是 1.33374而不是1.33382,產生了0.006偏差。儘管該bug僅僅影響了幾個用戶,然而他卻成了整個公衆的噩夢。估計流通中的三百萬到五百萬 的芯片存在着這樣的缺陷,起初Intel僅僅爲那些能夠證明他們確實有高精度計算需求的用戶提供了取代奔騰的芯片。最後,Intel公司只好妥協爲任何投 訴的人提供替代芯片。該bug給Intel最終造成了4億7千5百萬損失。

1995/1996年–致命的ping命令。

由 於缺乏對IP段組裝代碼的完整性檢查和錯誤的執行使得有可能通過從互聯網的任意位置發送惡意的”ping”數據報而攻擊多個操作系統。大部分受明顯影響的 是運行Windwos的計算機,當他們接受到數據報後,他們就會死鎖同時顯示所謂的“藍屏死機”。但是攻擊同時也影響很多Macintosh和Unix系 統。

1996年**號—501航天飛機爆炸事件。

對於Ariane 4火箭的工作代碼在Ariane 5中被重新使用,但是Ariane 5更高速的運算引擎在火箭航天計算機中的算法程序中觸發了一個bug。該錯誤存在於將64位浮點數轉換爲16位帶符號整數的程序中。更快的運算引擎導致了 Ariane 5中的64位數據要比Ariane 4中更長,直接誘發了溢出條件,最終導致了航天計算機的崩潰。

首先501航天飛機的備份計算機崩潰,然後0.05秒之後,主計算機也崩潰了。這些計算機崩潰直接導致了火箭的主要處理器使火箭的運算引擎過載,同時導致火箭在發射40秒後解體破碎。

2000年11月 –巴拿馬市國家腫瘤中心事件。

在這一系列事故中,由一家美國公司—Multidata Systems International所開發的治療軟件錯誤的計算了對於正處於放射治療中的病人所應該使用的合適劑量。

Multidata的軟件允許放射治療師利用計算機屏幕的一個叫做"blocks"的金屬裝置來保護健康組織以免受射線的傷害。但是該軟件僅僅允許治療師使用4個屏蔽塊,但是巴拿馬的醫生希望用5塊來保護。

醫 生髮現他們可以通過將所有的屏蔽塊畫成一個在中間有孔的大塊來欺騙該軟件。然而醫生們沒有意識到的是Multidata軟件在這種配置中根據該空畫法的不 同給出了不同的答案:如果該孔是在一個方向繪製的,則給出正確的計算出的劑量,如果是在另外不同的方向繪製的,軟件就會推薦出要比必須需要暴露的射線的兩 倍劑量。至少有8個病人在這次事故中喪生,同時接受了過多劑量放射的20個病人產生了嚴重的健康問題。被要求手動兩次檢查計算機的計算的醫生被以謀殺罪起 訴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章