作者:陳啟煌 / 臺灣大學計算機及資訊網路中心程式設計組助理程式設計師兼副組長
某駭客利用系統漏洞竊取的系統內之使用者資料,依據2012年10月實行之個人資料保護法施行細則,將面臨單一案件高達2億之賠償問題。資安事件是每個資訊單位的噩夢,為了不讓噩夢成真,各單位無不想方設法,本文分享我們的經驗,期讓讀者的弱點修補之路可以走的更順暢。
資安事件是每個資訊單位的噩夢,為了不讓噩夢成真,各單位無不想方設法,深怕百密一疏,功虧一簣,將造成無法挽救的災難發生。雖然臺大在校務資訊系統主機前已設置了防火牆,阻擋駭客工具發動的自動化攻擊;並且導入資安管理制度(ISO 27001)將風險控制在可接受的範圍內,但資訊系統的弱點絕大部分來自於程式碼本身的缺陷,正本清源之法還是該面對問題,致力於提升資訊系統的品質。為此,本中心購置程式碼弱點掃瞄工具(Fortify Source Code Analysis) 並透過此一工具掃瞄校務系統原始碼,主動發現存在的弱點,依照弱點的危害等級,作為系統修正優先順序,逐步修正,期能從根本提升校務系統安全性。
透過資安管理制度ISO27001的導入及資安軟體矯正程式師程式撰寫習慣後,新開發的系統不會有大問題,問題在要處理已經運行多年的線上系統。初次經過程式碼弱點掃瞄應該都會有成千上萬個漏洞,雖然大部分是資安軟體誤判的,不過程式碼也確實存在不少弱點,在資安防護的角度還是從嚴面對較為安全。解決方法無他,一則按照掃瞄軟體建議的方式修補;二則撰寫客制化的規則讓掃瞄軟體正確判斷。經過分析,本中心採取前者逐一修補,一律按照範本改寫被判出有問題的程式碼,這樣既可以修補弱點也可以培養程式師撰寫安全程式的習慣。如上圖所示,透過資安軟體的幫助可以很快列出弱點在哪一行產生,產生的原因為何,此功能有助於加快弱點的修補。其實,掃瞄出來的弱點跳脫不出OWASP(Open Web Application Security Project)的10大Web資安漏洞。在此列舉SQL Injection、Cross-Site Scripting(XSS)、Hardcoded Password等三種常見弱點的修補方式,佐以實例說明如下:
SQL Injection
是個多年的老漏洞,以使用者輸入來建立動態SQL指令,讓惡意使用者可修改指令組合出任意的SQL指令。解決的方法在動態產生SQL時不要用外來字串組成SQL 指令,應以參數敘明型態、長度、類別傳入SQL。
其實在Line 3 TID已經轉成數字格式,理論上不會有SQL Injection問題,不過掃瞄軟體還是會誤認為有問題,保險起見還是按照動態SQL語法的建議,將TID改以數字參數傳入。
Cross-Site Scripting(XSS)
XSS發生的原因是傳送未經驗證的資料至網路瀏覽器,導致瀏覽器執行惡意的程式碼。解決方法是處理使用者傳送含有像JavaScript片段的形式,在顯示前要先經過處理,避免惡意程式被執行。最簡單的方法就是轉成適當的型態例如數字,如真的是文字資料可先進行HTML Encode 把惡意程式內的html tag 替換掉,可避免組成惡意程式被瀏覽器執行。
如果TID是數字的話可以直接強制轉成數字,可攔住非數字的攻擊程式;但如果TID格式是文字的話,只能在顯示前先進行HTML Encode
�� Hardcoded Password
為求方便不少程式裡有一些寫死的密碼,更糟糕的是用明碼儲存,所有經手程式的人都會知道密碼。解決的方法是避免使用;如果真的一定要使用,要先加密並取較複雜的密碼。
修補方法最好避免密碼寫死在程式裡;不得已的話取一個不容易被猜出的密碼,程式碼內用將密碼先編碼後比對,推薦用兩次MD5 Hash,一次的話太短的密碼容易被暴力解出,兩次編碼會較安全。
雖然看起來簡單的步驟,但確實可以一步一腳印的修補弱點。經過三個月的努力,本中心已修補完判定出的90%的弱點,再過不久就能完全修補完成。過程中最大的挑戰是在修改過的程式還能正常執行,這些都是線上使用的系統不能停頓或出錯,修補過程要經過不斷的反覆測試才能上版,使得過程倍加艱辛。
發現弱點是重要的第一步;但是修補弱點才是真正解決問題的一步,這一步真是漫長而艱辛,在此分享我們的經驗,期讓讀者的弱點修補之路可以走的更順暢。