開放源碼與資訊安全

(寫於2004年或更早)

網絡效應是否有效?                  

開放源碼是否具安全性的優勢?這一直是有爭議的話題。咸信微軟在世界各國推展政府分享源碼計畫,其目的就是為了減低政府單位對於微軟系統的不信任感,藉由可信賴者檢視原始碼細節,希冀掌握系統核心真實用意。但分享或開放源碼果真能化解資訊安全的疑慮?另外一個話題是開放與封閉源碼的安全爭論。有人以為封閉源碼比較安全,因為實作細節不公開,可以避免被破解。有人以為開放源碼比較安全,因為所謂的「網絡效應(Many Eyeballs Phenomenon)」─“With enough eyeballs, all bugs are shallow” (Eric Raymond),只要有足夠的人注意、檢視源碼,所有問題都會被發掘,包括資訊安全的問題。

 

我們希望澄清這些爭議。微軟分享源碼計畫也是基於「網絡效應」,想藉由多方人員的源碼檢視、化解隱藏暗門(trapdoor)疑慮,而國內在微軟分享源碼計畫之前,也多有這樣的共識,常疾呼國人必須掌握自己的核心程式碼(包括作業系統、IC Card OS)、重要密碼系統必須由國人掌握原始碼。這些都是基於相同的「網絡效應」而起的想法。

 

幾個論點

我們不想潑冷水,也不因自己是開放源碼的擁護者、而大力擁護「網絡效應」對於資訊安全的幫助。但希望大家不要過度期望。這有幾個論點:

 

一、網絡效應對於分享系統穩定性、不符規格的程式問題(bug)有極大的助益,但對於系統安全方面的問題則幫助有限。原因是因為網絡上許許多多的「眼球」通常會因多方面的測試環境與使用方式,發現導致系統不穩、當機、不符規格的狀況,也因此可以迅速通報。但系統安全方面的 bug 通常是「刻意製造」極為誇張的輸入資料才能被發現,再多的「普通眼球」都比不上一個「刻意」的技術黑手(hacker)。對於「刻意」的黑手用戶,有無源碼已經沒有顯著差別。我們通常這樣區分兩類的程式問題,一個是有關穩定性(reliability)的「天災」,另一個是有關安全性(security)的「人禍」。前者通常可經由合法或不正常的輸入驗證,但後者卻必須由蓄意製作的惡意輸入(maliciously corrupted input)才能發覺,後者的輸入範圍遠超過前者。

 

二、封閉源碼對於資訊安全的保護有限。這可由兩方面探討。一是現代密碼學的概念與重要原則─不要藉由隱藏方法或不公開實作來增加系統的安全性,唯一必須保持機密的是「金鑰(key)」。同樣的,對於資訊系統也千萬不要以為隱藏實作可以免於被破解。第二是反向工程 (reverse engineering) 的工具與方法進展神速,有無原始碼已經無顯著差別。

 

三、若有意留下暗門或後門,幾乎不可能被發現。我們一般以為留暗門就是安插一段類似木馬的程式,經由「網絡檢視」,可以找出木馬所在。這是錯誤的想法。若有意留暗門,可以使用多種幾乎不可能被發現的方式佈放。一種是有意的「語意錯誤(semantic error)」程式片段,例如在 C 程式碼中,等號 (equality, ==)與分派符號(assignment, =)常被錯用,因此在程式中「故意錯用 assignment」,如 if (pass = aStrangeConstant)。而另一種超級後門撰寫方式,稱為「溢寫」(buffer overflow) 型木馬,也就是故意留下有溢寫問題的程式碼,撰寫很容易,引用 strcpy() 、 gets() 等程式庫函式即可。更複雜者,甚至留下多重呼叫後的溢寫問題(經由 pointer aliasing, incompatible type binding),這就幾乎不可能經檢測而得、遑論網絡的人工檢視了。

 

結論

不要因為資訊安全而有開放源碼或不開放源碼的決策考量[1]。上述論點已經澄清幾個相關問題,是否開放源碼與資訊安全沒有必然的關係。很多人以為微軟的安全弱點多,因此以為封閉源碼軟體比較不安全,有人辯護說微軟的使用者較多,因此較容易發現安全問題。這樣的論點事實上卻又與「網絡效應」相矛盾,因為微軟並未開放源碼,至於微軟的安全弱點數量是否較多,我們並無客觀數據可以佐證。微軟宣稱,多數弱點是公司內部經由正規檢測而得,技術黑手透過反向編譯修補(patch)檔案而找出問題。不管事實如何,資訊安全的決策考量仍不應受制於源碼開放與否。

 

更積極的作法

開放源碼的安全不應再寄望於網絡效應,就如同微軟曾為了宣示對安全的重視程度,一度停止所有程式開發工作幾個月、專注於程式品質與安全的檢視。封閉源碼的龍頭老大,其內部的「網絡效應」應該甚為驚人,但真正成效有限、仍必須不斷釋出「security patch」。開放源碼的安全也不能寄望於功能的精簡(通常越精簡越安全),Mozilla 社群常引以為傲,因為不支援 ActiveX 而躲開 IE 為人詬病的安全威脅,卻也因此排除了為數甚多的潛藏用戶。不管是開放、分享、或封閉源碼,其安全都應值基於軟體品質的提昇,微軟研究單位進行之 ESP 計畫[2]可以自動檢測上百萬行程式,這類正規品質驗證系統適用於開放或封閉源碼。不要再陷入利用分享源碼以排除木馬的迷思,自行開發或寄望掌握源碼,其後果常是引入更多的軟體缺陷。更積極的方式是重視軟體品質(Software Quality)、導入正確的程式安全(Secure Programming)開發原則。我們也因此在交通大學資工系設立軟體品質實驗室,積極從事正規化的品質驗證研究,藉此提升軟體安全與可靠性。

參考資料

1.      John ViegaGary McGraw, Chapter 8, Building Secure Software, Addison-Wesley Pub Co; 1st edition (September 24, 2001).

2.      Error detection via Scalable Program Analysis, http://research.microsoft.com/esp/

 

 

軟體安全與資訊戰爭(發表於中央日報)

軟體安全與資訊戰爭(發表於中央日報)

據路透今年(1999)一月廿一日報導,美國柯林頓總統已向國會要求廿八億美元
的經費用來未來的恐怖戰略武器–網路攻擊與生化武器。這些新興的
威脅如同神經毒氣及細菌攻擊的恐怖小說與網路上身的電影情節,對一般
人而言並不陌生,但卻即將在現實生活中發生。上述預算若經審核通過,
在公元二千年的會計年度就要開始執行。我們若得以幸免於Y2K的千禧
年危機,下一波危害更烈的人為資訊蠱毒或許才是末世戰亂爆發的引線。

資訊蠱毒引爆世紀危機

資訊武器是資訊戰爭中攻擊的原動力,包括電腦病毒、網路蠕虫、軟體
木馬、系統暗門、邏輯引線、晶片嵌入、微型機械、矽晶噬菌、電子干擾
、及電磁脈沖等,而攻擊的目標包含敵方的資訊、資訊相關處理程序、與
資訊系統。就如同生化武器是用以摧毀現實體制中的神經主宰著人類,資
訊武器則用來破壞資訊系統的根本–電磁資料。人為的資訊蠱虫將以各種
可能方式侵噬電磁資料:如具增殖能力的電腦病毒,就像生物病毒之於活
體,可以依附在有用的程式上,越是活躍的宿主,破壞力越強。網路蠕虫
藉網路之助得以廣伸觸角。軟體木馬必須善於偽裝,以獲取青睞進入城門
,伺機屠城。很不幸的因為網際網路的便捷及通用瀏覽器的盛行,在人們
的好奇下,病毒或藉蜘網,或跟著電子郵件到處散布,或伴隨在電影明星
形象(螢幕保護程式)掩飾保護之下入城,開始布放系統暗門及邏輯炸彈
引線。這些都屬於資訊戰爭的軟體武器。

資訊戰爭中的硬體武器,有利用晶片嵌入額外功能電路,在特定電子訊
號觸發下,將發射無線訊號。據傳在波灣戰爭中美軍就使用此手法,精確
取得伊拉克基地據點。微型機械及矽晶噬菌則是以電腦硬體為破壞目標,
就像培養吞噬化學合成物的細菌原理,咸信專事破壞矽晶的菌種將可能被
研發利用。

倘若上帝主宰著現實世界的時鐘,電腦世界裡又由誰來扮演上帝的角色
?時序是掌控現代電腦計算能力最重要的觀念,是資訊世界的時間參考點
﹔時序錯亂意味著程式邏輯將分不清楚現在、過去及未來。記憶體是電腦
計算的狀態暫存區,記錄著資訊世界的運算及資訊搬遷足跡,狀態溢位將
造成空間的混亂。時空失序將可能是實體毀滅的先兆,電腦時空的錯亂又
將造成怎樣的災難呢?上帝在時間年曆上開了人類玩笑,不管用如何的置
閏手法都湊不齊剛好整數天的一年,歷經多次的年曆改革,使得日夜節氣
運轉上得以較為同步協調,以調和現實世界時空的順序。電腦時空裡的一
顆定時炸彈–Y2K,究竟是人為疏失抑或是上帝的嚴肅安排,以展示電
腦時空失調的狀況?我認為這不算是人為疏失,而是軟體的毀壞。

時空失序促成軟體毀壞

或許是令人驚奇的觀感。硬體會隨著時間腐朽,空虛的軟體也會隨著時
間的演化而毀朽。時間是最好的武器,時間的進展將帶動需求的變遷,引
發過去制訂之規格不符,造成設計不周延,實作與設計將因此不相容或有
些許差異。Y2K危機只是軟體因衰老引發之慢性病即將發作,時間引起
的狀態溢位引發電腦時空的慢性失序,同樣也能運用資訊武器在瞬間達成

第一波戰爭的武器是短兵相接的刀與劍,其目標是人類,藉由毀損人類
肉體以達控制實體世界的目的。第二波戰爭中運用的是槍炮等可以引起大
規模傷害的武器。第三波戰爭的目的是破壞一切與資訊相關的系統,藉由
毀害資料以達劫奪資訊系統所控制的實體,如使銀行帳目不正確、工廠生
產設備停頓、病人維生設備失靈、交通秩序大亂、飛機失事、核電溫控異
常等。資料所依附的軀殼是軟體系統,如同槍炮是利用彈藥的瞬間爆炸力
破壞人類藉以隱蔽的建築防護體,資訊武器則是設法破壞資料軀殼。

第三波戰爭鎖定資訊戰

我們可將其分為四步驟:軟體缺陷利用、邏輯失控、劫奪控制、引爆瞬
間殺掉大量資料。軟體缺陷利用中最常見的就是狀態溢位。如何產生狀
態溢位?藉由惡意溢寫資料而產生溢位。這種狀態溢寫攻擊原理與程式堆
疊息息相關,堆疊是程式用來存放上一層呼叫者資料包括返回位址的暫存
區,並用來當作局部變數記憶區。程式常見的錯誤發生在返回位址被覆寫
成一個不合法的位址,程式因此失控跳到非原先安排的程式碼,所執行的
指令將不可預期。通常遇到的結局是得到非法指令或記憶段錯誤的訊息,
更糟的是系統當機。上述狀況是在非有意程式設計錯誤(有臭虫)下所導
致。這是「邏輯失控」。但倘若是有意的情形下將有何後果?假設(一)返
回位址覆寫成一個合法的位址﹔(二)上述位址存放有意安排之程式碼。
此情形下所執行的指令將可預期。又假使所安排之程式碼是惡意的,則有
心人可藉此執行任意程式,完成「劫奪控制」系統的目的。此攻擊法最惡
名昭彰的案例就是一九八八年網際蠕虫(Internet Worm)事件,它利用
fingerd程式不檢查局部變數記憶體使用上限的缺失,取得超權限使用者的
權力,以此執行任意命令並複製自己,再以此方法不斷入侵其他機器,同
時也能輕易瞬間引爆系統。

軟體危機意識開始於一九九○年初,當時是擔心軟體生產力及品質的低
落,將使軟體產業界衰亡,而世紀末將臨的除了電腦時空失序的最大挑戰
外,人為資訊蠱虫的不斷演化、資訊武器的精進,都將是軟體發展及資訊
系統的最大威脅。