2007年12月12日星期三

當心程式的漏洞

作者:蔡學鏞

有一個常聽到的笑話:如何保全(Secure)你的電腦不被入侵?答案是:關掉電源,拔掉所有的線路,用水泥將它密封,然後丟進大海。儘管這確實保全了電腦,但是電腦完全不能運作,所以沒有意義。

電腦保全(Security)有兩部份:電腦保護自己免於外來的危害或損失,同時系統必須維持原來的功能。電腦保全必須和電腦功用之間達到平衡。這才是真正困難的地方。

如果我們需要保全系統的技術相當難以使用,那麼使用者就不會用它,導致此系統沒有被保全。如果它擾亂了基本的工作,就會被關閉或略過,導致此系統沒有被保全。Windows Vista正是這樣的例子,許多人對於一再出現的安全提示感到不耐,於是關閉。

電腦保全領域目前相當熱門,也一直有具體的研究進展。理論與方法會先被當作假說而採用,然後一段時間之後被駁斥。例如,現在連MD5雜湊演算法都已經被證實比較不牢靠了,要盡量改用SHA-1。

電腦保全不等於加密。保全使用到加密,然而,密碼學是另一個專業領域。除非你是這方面專家,否則你不應該寫自己的加解密程式碼,即使專家也不見得能做得好。.NET、Windows、Java等平台都有完善的安全機制和工具,在這些平台上編寫程式可以直接利用這些平台,來建立保全的系統。

許多系統的保全都是事後加上的,這樣子很危險。事先良好的規劃是建立保全環境的關鍵,而規劃的最佳工具是保全塑模(modeling)。

模型是系統的一種簡化表現,將不必要和不重要的細節摒除在外。藉由塑造模型,我們可以將焦點放在「真正有影饗的」細節,忽略沒影饗的細節。現代電腦系統太複雜,不可能處理每個細節,我們必須將焦點放在真正最重要的事情上。

威脅塑模是一種系統性的方法,可以辨識一個系統會遭遇哪些威脅,並歸類之。對系統的威脅,是指「潛在的事件,可能會具有不愉快或不想要的後果」。弱點是指「系統設計上或實踐上」的弱點,可能會被利用來造成這些不想要的事件。攻擊是有人利用這些弱點來獲取不被允許的利益。

模型的重點是用形式上的作法,尋找威脅與弱點,以破除攻擊。這很重要,因為不這樣,我們可能會花上許多無謂的時間,試圖保護系統免於不重要的事。如果我們不能在作法上聚焦,往往會得到無用的結果。

STRIDE是相當知名的威脅分類模型。STRIDE可以用來為系統的重大威脅進行分類。威脅正是攻擊者希望發生的事,也就是我們不希望發生的事。如果我們塑模所有的STRIDE威脅分類,我們就有很高的機會可以涵蓋大多數重要的領域。

STRIDE是Spoofing(偽造)、Tampering(竄改)、Repudiation(否認)、Information Disclosure(資訊揭露)、Denial of Service(服務阻斷)、與Elevation of Privilege(特權提升)的縮寫,分別解說如下:

  • 偽造身份:在工作期間假冒另一個使用者的身份
  • 竄改資料:就只是改變資料,竄改資料不見得是資訊揭露。竄改資料只有達到資料的污損。
  • 否認:從攻擊者的觀點,否認就是隱匿蹤跡。讓某件行為無法被追蹤,無法歸咎於肇事者。
  • 資訊揭露:允許未授權的人取用敏感資訊,像是信用卡號碼、密碼…等。
  • 服務阻斷(DOS):讓某種資源耗竭,可能是網路頻寬、CPU運算能力、磁碟空間。DOS攻擊的問題相當容易匿名發動,且有時候難以分辨到底是真正的攻擊,或者是華碩Eee PC引來大家上網搶購。
  • 特權提升:不具有特權的使用者或行程,獲得特權的存取。

建立保全模型,有三個部分:威脅、資產、與緩解(mitigation)。資產是攻擊者發動攻擊的動機所在,這些資產可能是具有直接價值的東西,像是信用卡號碼或財務資訊。資產也可能具有間接價值,像是「執行程式碼的能力」。「執行程式碼的能力」也算是資產,因為一旦可以在一部機器上執行程式碼,就可以使用這些資源來做一些事,像是送出垃圾郵件,執行分散式DOS攻擊。

緩解是我們用來進行消弭威脅的手段。辭典對於緩解的定義是『使其變得較不嚴重』。稱之為緩解,而不稱防止(prevent),是因為我們可能不希望該活動被禁止,而是希望消除其中的傷害。比方說,在PowerShell中,執行程式的能力不能被防止,因為「執行程式」本來就是PowerShell存在的目的。但是我們想要讓只有授權的使用者才能執行被認可過的劇本。未授權的劇本執行,則會藉由許多不同的作法而被緩解。

透過塑模瞭解你的系統可能面臨的威脅,並緩解問題,保護資產。不要讓你的程式,佈滿弱點,危害大眾,程式員必須及早補充Security相關的知識。