之前我討論過許多次關於更新的重要性並介紹了相關的工具,然而對於許多資訊背景的人員來說,上補丁 (Patching) 一詞或許比更新更令人覺得親切。不管是叫做更新或是上補丁,指的都是利用置換程式執行檔 (或其他相關檔案) 的方式來修正應用程式 (包含作業系統等各種程式) 的問題,這類問題包含安全性的問題、功能的提升、或是一般操作性的錯誤。
雖然 Patching 是解決應用程式問題時最有效也是最重要的方法,但是 Patching 在實際的應用上卻也存在著不少的困擾:
- 如果存在問題的應用程式是商業軟體,使用者通常只能等待原廠提供更新檔案。在此之前,使用者無法對應用程式本身做任何的處理。對於安全性的問題而言,這段更新前的空窗期將會讓應用程式處於一個毫無防備能力的困境。這類問題就是所謂的 Zero-day Attacks。
- 早期的攻擊手法多以網路與作業系統作為目標,而這類產品的供應商大多屬於大型的組織,所以提供更新的速度與品質具有一定的質量。但是現在攻擊手法多以應用程式為主要攻擊目標,所有相關的供應商服務能量不一,再加上技術能力的良莠不齊,導致等待時間的空窗期變得更長,使用者甚至無法取得正式的更新檔案。
- 就算是使用 Open Source 的應用程式,一旦發生問題後雖然使用者可以自行對於應用程式本身進行修改,但是對大多數的使用者而言並不具備這樣的技術能力與資源 (人力/時間)。再加上原開發團隊屬於志願性質,因此對於提供更新的保證顯得更加的薄弱。
- 組織在進行實際更新作業前,往往必須經過審慎的測試過程。對於越重要的系統,測試過程的時間也就越長,也就是說越重要的系統處於未更新的時間越長。然而這類系統一旦發生問題,所產生的危害卻也更大。在兩者影響相互放大的情況下,讓問題的嚴重性急速惡化。
因為 Patching 存在這些問題,所以有了 Virtual Patching 這個概念。Virtual Patching 一詞在 2003 年就引進於 ISS 的產品 (Internet Scanner) 之中。簡單來說就是當 Internet Scanner 發現系統存在安全性的問題時,就利用 IDS 的規則來偵測攻擊行為的發生。也就是說 Virtual Patching 並不是針對有問題的應用程式本身進行修正,而是採用外掛 (IDS) 的方式讓外界無法有效地利用應用程式的缺陷加以攻擊。早期 IDS 僅能提供偵測的能力,但是目前的產品已經透過整合 IDS/IDP 與各式各樣的防火牆 (傳統的 Firewall、Web Application Firewall、Database Firewall) 來達到即時阻擋的能力。
雖然 Virtual Patching 可說是一種治標不治本的防禦方式,但是透過全自動化 (至少在理論上) 的作業方式,可以大幅縮短應用程式毫無防備能力的空窗期。在 Web 應用程式大行其道的今日,Web 應用程式所帶來的安全議題不但急速惡化,而且開發團隊 (不管是供應商或是內部人員) 的技術能力與資源與實際的需求也呈現更大的差距,所以 Patching 的困境也愈形嚴重,因此 Virtual Patching 的概念受到許多安全廠商的重視。這些廠商利用 Web Application Scanner 與 Web Application Firewall 的整合,達到發現安全問題與防堵的全自動化,可以有效減少 Web 應用系統無防備能力的空窗期。雖說這樣的機制在使用上確實很方便,但是依舊有一些必須特別注意的地方:
- 應用系統的安全問題往往不只侷限於實作的層面,需求與設計階段所產生的安全問題影響通常更大。Virtual Patching 必須先利用掃描的方式發現問題後才能防堵問題,而自動化的掃描適用於找出實作方面的問題,對於需求與設計方面的問題幾乎沒有任何偵測能力,所以這類機制註定無法全面解決 Web Application 的安全問題。
- 這類機制透過 Web Application Firewall 達到防堵的目的,而 Web Application Firewall 多採用 Blacklisting 的方式。Blacklisting 在大多數的情況下所帶來的安全性遠不及 Whitelisting 的方式。
- 此方法採用的治標不知本的方法,長久來說對於整體系統的安全提昇助益有限,甚至往往是有害的。就像生病吃特效藥一樣,有用的特效藥反而讓人忽略了平常維持身體健康的重要性。所以一旦特效藥失效,或是感染的疾病沒有特效藥可以醫治,病情的惡化程度反而更為加劇。也就是說如果因為過度依賴這樣的機制而使得開發團隊失去提昇 Web Application 安全的能力,長久來說對於整體 Web Application 的安全環境反而是有害的。
寫到這裡,您一定猜到我要說什麼。那就是跟所有的安全議題一樣,Web Application 的安全性絕不是光靠一種機制就可以完全解決,不管這個機制是治標還是治本。唯有必須透過多層次 (Layered) 的防禦機制,才能夠提供較為完整的安全性。而所謂的防禦機制,絕對不僅限於事後的防範,更應該從 Web Application 的發源時期就開始考量與實施,而這就是 SSDLC (Secure Software Development Life Cycle) 的範疇了。