精密複雜的軟體是工業成長的動力,讓工業以前所未有的方式茁壯,但最新的科技卻也伴隨著風險和後果。
軟體更新一旦出了問題,有可能會危及生命安全,例如交通運輸便是一例。針對軟體的安全性,全球航空產業已制定了嚴格的規範,但仍舊過度依賴一套無法預見所有情況的系統。
才不過數十年前,系統的邏輯設計還在使用機械開關來控制。要將一輛列車停止,駕駛員必須扳動一個控制桿,經由電力或機械方式將列車切換至「危險」狀態 (代表列車應該停止)。在進入隧道之前,若列車的高度超過隧道的限高,列車就會撞壞隧道前方某處的一個水銀管,使得該列車的電力被切斷。倫敦地鐵北線 (Northen Line) 就時常發生這樣的情況。這類控制邏輯相對上容易理解、也容易確認。
但隨著系統的日益複雜,系統慢慢開始改用電機零件來控制,再複雜一點的邏輯,就用離散電路來控制。如果訊號必須經過中繼轉送,那系統會發出聲音來確認操作已確實執行。因此,只要按部就班執行各樣動作,就能確保邏輯的正常運作。
到了今日,系統上的電機零件已經很少,因為,為了提升效能和效率,系統必須具備更複雜的邏輯。為了實現關鍵系統所需要的複雜邏輯,製造商開始在系統內導入微處理器。微處理器不僅擁有更大的彈性,而且比離散電路更容易透過程式控制。
現在,幾乎每種裝置都包含不只一個微處理器。例如,一支智慧型手機至少包含了一顆運算處理器以及一顆無線射頻處理器,而且手機裡還有各式各樣的次級系統也內含了更小的微處理器。還有,個人電腦在記憶體或硬碟部分也都有各自的微處理器。
隨著軟體精密度不斷提升且日益普及,許多產業的效率和生產力也不斷提高。使用者和企業因而能夠彼此合作創造出過去無法達到的成就,但這為何會成為一項問題?
無法明確定義一個安全的狀態
我們之所以必須對軟體感到憂心,一項驚人的事實根據就是美國「國家標準與技術局」(National Institute of Standards and Technology,簡稱 NIST) 旗下的國家漏洞資料庫每年發出的漏洞公告數量。
除此之外,更嚴重的是當我們開始改用微處理器之後,我們已經無法從技術層面驗證系統邏輯運作的正確性與安全性。除非軟體具體化成一種外部實作,否則我們無法為軟體系統明確定義一個安全的狀態。當一輛列車遇到電纜斷裂的情況會自動進入「危險」狀態,然後在重力的作用下將一個旗幟降下來,進入一個安全的狀態。但軟體系統的架構比這複雜多了,而且在發生錯誤時,軟體並不會自動進入某種明確定義的狀態。
此問題源自於微處理器本身具有圖靈完備 (Turing-complete) 的特性,意思是處理器無法強迫限制它所執行的軟體。這一點雖然可讓這類系統變得強大而彈性,但也因此無法強制執行某種安全動作,例如進入某種安全的狀態。
重大問題皆透過軟體來修正
透過軟體來操作機器、修正問題,或者維持緊急狀況下的運作,已經不算什麼新鮮點子。今日絕大多數的戰鬥機在設計上都具備先天不穩定性,因此飛行員必須靠軟體才能安全地操控戰機。多年來,機械錯誤或機械故障也經常透過軟體更新來解決。
在某些方面來說,這的確很了不起,但如此重要的大型機械卻能透過軟體來加以修正,其實值得令人三思。很多產業都相當仰賴軟體所帶來的生產效率和競爭力,只不過,某些產業的重要性遠大於其他產業。在這些產業裡,軟體更新一旦出了問題,有可能會危及生命安全,例如交通運輸便是一例。針對軟體的安全性,全球航空產業已制定了嚴格的規範,但仍舊過度依賴一套無法預見所有情況的系統。
人們的一項錯誤認知就是:相信我們有能力掌握軟體必須處理的所有邊緣狀況。所以,值得複雜系統設計人員深思的問題是:萬一軟體元件全面失靈,會出現什麼樣的狀況?有沒有可能帶來災難,或是仍在可處理的範圍內?
《下期待續》軟體無所不在(5-2)-微處理器底層也可能出現風險