在CI中實現持續Web安全掃描
一. 當前Web應用安全現狀
隨著中國互聯網金融的爆發和繁榮,Web應用在其中扮演的地位也越來越重要,比如Web支付系統、Web P2P系統、Web貨幣系統等。對于這些金融系統來講,安全的重要性是不言而喻的, 一旦黑客利用安全漏洞入侵系統后,損失的不僅僅是數據,還包括企業或者客戶的財產。
國內著名的 烏云漏洞平臺 ,每天都會爆出十幾條甚至幾十條各大網站的安全漏洞,比如:
- 中國電信 某省任意用戶登陸(可惡意扣費)
- 中石化 某銷售物流系統后臺遠程命令執行的服務器淪陷(客戶信息泄漏&&可內網滲透)
- 盛大 某游戲總管理權限泄露可隨意更改游戲玩家數據
- 招商銀行 某服務器存在漏洞可Shell(穿透邊界防火墻連通內網)
這里面包括了通信、金融、銀行、能源、游戲等各個行業的Web應用的各種漏洞,有一些已經造成了影響廣泛的嚴重安全事件,例如:CSDN、12306、小米用戶信息泄露事件,攜程網信息安全門事件、某快遞官網遭入侵1400萬條用戶信息被轉賣等等。
對于很多公司而言軟件系統安全關注的重點還在網絡和操作系統層面上,比如配置昂貴的網絡入侵檢測系統以等;很多開發人員安全意識薄弱,比如使用直 接在代碼中組裝SQL語句,使用簡單的數據加密和認證的方案,使用弱口令以及在產品中嵌入一些特定的調試信息;很多測試人員也不會進行基于業務流程的安全 測試;系統管理和運維人員對于不可預知的應用組件和依賴的安全漏洞無法及時發現和修補。很多中小型公司基本不可能對于Web安全投入太多,比如無法在開發 的過程中持續關注安全問題,從而導致系統上線之后還存在很多問題。因此,開發、測試和運維人員能充分理解安全的重要性以及掌握自動化安全掃描的方法和工 具,對于開發一個安全的Web系統至關重要。
針對Web應用如此多的安全問題,全球范圍內的有志之士成立了 OWASP (Open Web Application Security Project),致力于宣傳各種Web應用的安全問題。以及如何掃描、防御等知識,并且每2~3年還會發布世界范圍內 排名前十的安全問題 。雖然OWASP提供如此豐富的安全知識,但是很多開發團隊并沒有充分利用,有些甚至還不知道,有些知道卻不愿意投入。各種原因導致當前中國互聯網上的眾多Web應用擁有大量安全問題。
二.持續安全掃描
面對當前如此復雜和危險的互聯網環境,如果一個在線金融系統(比如網銀,P2P金融)存在安全問題,而系統管理員又沒有及時發現安全問題和修復, 那么時間越久,攻擊者對其利用的程度越高,系統遭受的損失越大。這些安全問題可能是系統本身業務設計或者編碼遺留的問題,也可能是依賴的第三方組件或者服 務的問題。對于一些金融系統,修復安全漏洞哪怕只是晚幾個小時,損失也可能是巨大的。如果不及時發現系統的安全問題并及時修復,那么開發成本和系統損失隨 著時間的推移可能會成指數級的增長。所以盡早發現安全問題并修復是節省成本和避免損失的有效方法。
對于軟件安全,當前許多企業只會在發布或者上線之前進行 一次滲透測試 ,如下圖:
這種一次性的解決方案存在很多問題。其結果的有效性很難保證,如果發現問題可能會嚴重拖延發布時間等。為了解決它們,可以引入內建開發流程-BSI(Build Security In),如下圖:
其中自動化的靜態代碼掃描,動態系統掃描,依賴掃描以及初級的滲透測試都可以比較容易的在CI中實現。示意圖如下:
1. 靜態代碼掃描
利用靜態代碼掃描工具對代碼在編譯之前進行掃描,并在靜態代碼層面上發現各種問題,其中包括安全問題。部分工具列表:
工具 | 支持語言 | 版權 | 主頁地址 |
Fortify | 大部分語言 | 收費 | http://www8.hp.com/us/en/software-solutions/static-code-analysis-sast/ |
Checkmarx | 大部分語言 | 收費 | https://www.checkmarx.com/ |
Flawfinder | C/C++ | 免費 | http://www.dwheeler.com/flawfinder/ |
LAPSE | Java | 免費 | http://www.owasp.org/index.php/Category:OWASP_LAPSE_Project |
Brakeman | Ruby on Rails | 免費 | https://github.com/presidentbeef/brakeman |
利用動態安全掃描工具在系統部署之后對運行中的系統進行安全掃描。
2.動態安全掃描
動態掃描一般分為兩種類型:主動掃描和被動掃描。
-
主動掃描是首先給定需要掃描的系統地址,掃描工具通過某種方式訪問這個地址,如使用各種已知漏洞模型進行訪問,并根據系統返回的結果判定系統存在哪些漏洞;或者在訪問請求中嵌入各種隨機數據( 模糊測試 )進行一些簡單的滲透性測試和弱口令測試等。對于一些業務流程比較復雜的系統,主動掃描并不適用。比如一個需要登錄和填寫大量表單的支付系統,這個時候就需要使用被動掃描。
-
被動掃描的基本原理就是設置掃描工具為一個Proxy Server,功能測試通過這個代理服務訪問系統,掃描工具可以截獲所有的交互數據并進行分析,通過與已知安全問題進行模式匹配,從而發現系統中可能的安 全缺陷。一般在實踐中,為了更容易地集成到CI,會在運行自動化功能測試的時候使用被動掃描方法,從而實現持續安全掃描。示意圖如下:
部分工具列表:
工具 | 掃描漏洞類型 | 版權 | 主頁地址 |
ZAP | 通用Web應用漏洞 | 免費 | https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project |
SQLMap | SQL注入 | 免費 | http://sqlmap.org/ |
Burp Suite | 通用Web應用漏洞 | 收費 | http://www.portswigger.net/ |
N-Stalker | 通用Web應用漏洞 | 收費 | http://www.nstalker.com/ |
3.依賴掃描與監控
雖然自動掃描工具可以發現大部分基本的Web安全漏洞,比如XSS,CSRF等,但是它不能發現業務邏輯、身份認證以及權限驗證等相關的安全漏洞,而對于這些類型的漏洞則需要開發相應的自動化安全功能測試。
由于當前服務器應用依賴的第三方的庫和框架越來越多、越來越復雜,比如SSL、Spring、Rails、Hibernate、.Net,以及各種第三方 認證系統等。而且系統開發的時候一般選定某個版本后在很長一段時間內都不會更新,因為更新的成本一般都比較高。但是往往這些依賴為了添加新的功能和修復各 種當前的問題——當然包括安全問題,卻會經常更新。開源項目的安全問題只要被發現以后,通常都會被公布到網上去,比如 CVE 、 CWE 、 烏云 等,導致很多人都可能利用它去攻擊使用這些依賴的系統。
依賴掃描就是通過掃描當前Web系統使用到的所有第三方依賴,并和網上公布的安全漏洞庫進行比較,如果當前某個第三方依賴存在某種危險級別(需要 自己定義)的漏洞,就立即發出警告(比如阻止CI編譯成功等)來通知開發人員或者系統管理員,從而在最短的時間內修復這個問題,防止攻擊,避免或者減少損 失。示意圖如下:
部分工具列表:
工具 | 漏洞數據源 | 版權 | 主頁地址 |
OWASP Dependency Check | NVD和CVE | 免費 | https://www.owasp.org/index.php/OWASP_Dependency_Check |
Victims | CVE和Redhat | 免費/收費 |
https://victi.ms https://github.com/victims |
三. 在CI中實現自動化安全掃描
將這三種類型的自動化安全掃描實踐集成到CI服務器中就可以實現對系統的持續性安全掃描。
1、在項目構建階段進行依賴掃描與監控
對項目使用到的依賴進行安全掃描和監控是非常必要的,而將這一過程自動化能夠進一步加強它的效果。這里以 OWASP Dependency Check 為例,介紹如何在項目構建階段進行依賴掃描和監控。OWASP Dependency Check是一款開源免費的自動化依賴掃描工具,它由OWASP開發并維護,使用 NVD 和 CVE 作為漏洞數據源,自動識別依賴并掃描其是否存在安全問題。它提供Shell腳本、Ant插件、Maven插件和Jenkins插件。
以Maven插件為例,首先在 pom.xml 文件里添加這個插件 。
然后使用Maven對項目進行構建,OWASP Dependency Check插件會自動識別項目的依賴(包括間接依賴),對其進行安全掃描并生成報告。
在Jenkins中運行掃描并保存安全報告的配置如下:
下面的掃描報告中列出了Struts2和commons-fileupload兩個依賴存在安全漏洞,以及嚴重程度等信息,如下圖:
如果項目沒有使用Maven, OWASP Dependency Check還提供Jenkins插件,同樣能對依賴進行掃描,但這種方式需要明確指定所需掃描依賴的目錄或者文件名,Jenkins配置如下:
OWASP Dependency Check以自動化的方式對項目的依賴進行掃描,極大的降低了人力成本、提高了效率。不過目前它僅能掃描JAVA和.NET項目的依賴,針對 Node.JS、客戶端JavaScript庫的支持還處于計劃階段。另外,目前它沒有提供Gradle的插件,如果您的項目使用的是Gradle,則只 能用命令行的方式來運行它。
2、在自動化測試階段進行被動方式的動態安全掃描
針對Web應用的安全掃描工具非常多,其中 OWASP ZAP 是免費軟件里面最為常用的。雖然OWASP ZAP官方并沒有提供相應的方案和構建系統以及CI進行集成,但是有一些第三方的開源工具可以幫助其集成。下面將以Gradle項目為例,介紹如何在CI自動化測試階段集成ZAP并進行被動方式的動態安全掃描。
第1步:下載安裝ZAP。
第2步:在Gralde構建腳本中配置 security-zap 插件用于集成ZAP。
第3步:配置WebDriver,為其設置代理。
默認配置下,security-zap插件在啟動ZAP之后,ZAP會偵聽本地7070端口,因此需要將WebDriver的代理設置為localhost:7070,參見示例代碼18。
第4步:啟動ZAP并運行測試。
使用zapStart命令來啟動ZAP,用build來運行一次構建,在運行所有測試的同時進行被動掃描,命令如下:
gradle zapStart build -Dzap.proxy=localhost:7070
第5步:生成安全報告。
在所有的測試都執行完畢后,使用zapReport命令生成報告,命令如下:
gradle zapReport
它會在項目根目錄下新建一個名為zap-reports的目錄,并將安全掃描報告放置其中。下面是一份示例安全報告,它列出了所測試的Web應用的安全漏洞,按照嚴重程度以及類別進行了統計,還包含了每個安全漏洞的細節信息,報告如下:
第6步:關閉ZAP。命令如下:
gradle zapStop
第7步:Jenkins集成。Jenkins配置如下:
3、在測試環境部署階段進行主動方式的動態安全掃描
繼續以Gradle項目和OWASP ZAP為例,在安裝好ZAP并且在構建腳本里配置好security-zap插件后(同上一階段的步驟1、2), 只需要使用zapStart和zapScan命令就可以啟動主動式掃描,命令如下:
gradle zapStart zapScan
主動掃描的檢查能力更強,可以彌補被動掃描的不足,但缺點是耗時長,以及在掃描需要身份驗證的系統的時操作復雜。
默認配置下主動掃描啟動后,security-zap插件會主動檢測掃描進度,默認掃描等待時間為60分鐘。如果主動式安全掃描的執行時間超過了 這一時間,security-zap會因為超時而終止運行,不過ZAP安全掃描并不會因此而停止,它還將繼續運行,直到完成所有的安全掃描為止。若要了解 當前掃描進度,可以通過運行zapScanStatus命令查詢,命令如下:
gradle zapScanStatus
掃描完成后,通過運行下面的命令生成安全掃描報告,并關閉ZAP:
gradle zapReport zapStop
四. 總結
自動化持續Web安全掃描是一個復雜的課題,很大程度上依賴于自動化Web安全掃描工具的能力。當前絕大部分Web安全掃描工具并不能發現所有的安全問題,就算 OWASP TOP10 也無法全部包括,但是它可以在較小投入的情況下持續發現大部分Web系統的基礎安全問題,從而防止大部分中級和幾乎所有初級的黑客攻擊。如果需要更高級別的安全保障,人工滲透性測試和威脅建模等必不可少,但是成本也是相對較高的。
所以對于Web系統的安全,首先要分析系統的安全需求和可用資源,在資源有限的情況下應該首先實施自動化持續安全掃描。如果系統的安全需求很高,并且在資源允許的情況下再投入人工滲透性測試等,從而獲得安全上的最高投資回報比。