💡 如何在流水線中集成與應用 DAST ?
近日,在「DevSecOps軟件安全開發實踐」課程上,極狐(GitLab) 前端工程師錢堃、極狐(GitLab) 高級後端工程師張林傑,展開了關於 DAST 的概念、必要性、優缺點的內容分享,並結合實操演示,幫助大家進一步掌握 DAST 技術。
以下內容整理自本次直播,你也可以點擊👉觀看視頻回放或下載 PPT。Enjoy~
DevSecOps 在 DevOps 的基礎上增加了 Sec(Security,安全)的概念,是指通過與 Sec (安全團隊)+ Dev(研發團隊) + Ops(運營團隊) 合作,在標準 DevOps 週期中建立關鍵的安全原則。
DevSecOps 提倡 “安全左移” 的理念,即在軟件生命週期(SDLC)的早期階段就注重安全問題,從而防止缺陷產生以及儘早找出漏洞。
在軟件開發生命週期不同階段發現漏洞,其修復成本(人力、財力等)不一樣。如下圖所示,如果説需求階段發現一個漏洞,其修復成本是 1,在編碼階段就變成了 5,而在生產階段變成了驚人的 30,這意味着:生產階段漏洞修復成本 = 需求階段漏洞修復成本 x 30。
可見通過安全左移,能夠大幅降低安全漏洞修復成本。
圖片來源:NIST
不同開發階段有不同風險漏洞,藉助各種安全掃描工具,層層遞進,才能實現整體,例如:
- SAST - 靜態應用安全測試;
- DAST - 動態應用安全測試;
- IAST - 交互式應用安全測試;
- RASP - 運行時應用自我保護;
- Dependency-Scanning - 依賴項安全掃描;
- Secrets Detection - 機密信息檢測。
圖片來源:Freebuf
DAST 和 SAST
今天,我們主要分享安全掃描工具之一——DAST(Dynamic Application Security Testing,動態應用程序安全測試)。
提到 DAST,就繞不開通常與其成對出現的 SAST(Static Application Security Testing,靜態應用程序安全測試)。首先,先釐清概念:
➤ SAST
通常在編碼階段,對源代碼進行安全測試發現安全漏洞的測試方案。
SAST 是對應用程序源代碼執行直接的白盒分析,分析是在代碼的靜態視圖上運行的,這意味着代碼在審查時沒有運行。
➤ DAST
在測試或運行階段,分析應用程序的動態運行狀態。它模擬黑客行為對應用程序進行動態攻擊,分析應用程序的反應,從而確定該 Web 應用是否易受攻擊。
DAST 是一種黑盒測試技術,它們不能訪問代碼或實現細節,只檢查系統對潛在漏洞測試的請求和響應。換言之,DAST 是外部的漏洞掃描程序。
另外,從掃描準備、掃描速度、開發語言等方面進行比較,兩者之間還有以下差別:
為什麼需要 DAST ?
從上文的內容中可以看到 SAST 具有其侷限性,包括:
- SAST 應用於代碼未運行時,無法覆蓋運行問題或配置問題;
- SAST 對於訪問控制,無法覆蓋身份驗證或加密等場景;
- 主流 SAST 工具均基於污點傳播模型實現,在代碼分支多、調用層級很深的情況下,信息網絡龐大(特別是考慮了調用順序和全局變量的情況下),耗時成倍增長;
- 為降低複雜度,檢查器丟失上下文信息,從而無法準確定位到某些標識符正確指向對象,最終導致誤報或漏報。
舉一個 SAST 誤報的例子。如下圖,這是一段 JS 代碼,定義了一個 test 函數,變量 b = 11 * 10,如果 b > 100 ,那麼返回一個普通字符串 safe;如果 b < 100 ,則將函數傳進來的實參去進行 eval。
我們肉眼來看,可以算出 b = 110 ,永遠都是大於 100,返回 safe 字符串,後面的 eval 永遠不會執行,所以這個函數在我們預想的運行情況下,它是一個安全函數。
但如果在極狐GitLab 上開啓 SAST 檢查,就可以掃到這個漏洞,如下圖,發現使用了 eval,認為有可能會導致危險的注入,進行警告,但實際上這個函數是安全的,因此產生誤報(在極狐GitLab 中,用户可以 dismiss)。
這個例子説明了 SAST 的侷限性。魚和熊掌不可兼得,因此需要 DAST 彌補一些 SAST 的不足。
DAST 的工作流程
以 Web 部署為例,DAST 的工作流程是:
Step 1 :通過爬蟲掃描整個 Web 應用結構,爬蟲會發現被測 Web 程序的目錄數量、頁面數量、頁面參數;
Step 2 :根據爬蟲的分析結果,對發現的頁面和參數發送修改的 HTTP Request 進行攻擊嘗試(掃描規則庫);
Step 3 :通過分析 Response ,驗證是否存在安全漏洞。
上述步驟涉及到兩種掃描方式,即:
- 被動掃描(default):不主動攻擊,搜索 HTTP 消息、Cookie、存儲事件、控制枱事件和 DOM 以查找漏洞,包括搜索暴露的信用卡、暴露的機密令牌、缺少的內容安全策略以及重定向到不受信任的位置。
- 主動掃描(full):主動攻擊,分析每個 HTTP 請求以獲取注入位置,例如查詢值、標頭值、cookie 值、表單和 JSON 字符串值,將攻擊內容注入到對應注入位置,形成新的請求, 將請求發送到目標應用程序,並檢查 HTTP 響應來確定攻擊是否成功。
DAST 的優缺點探析
DAST 優點
1. 不受語言和框架限制
DAST 測試不要求具備編程語言知識;無論使用何種框架,DAST 工具都會根據輸入和輸出,評估應用程序行為。
2. 低誤報率
DAST 工具對應用程序環境執行端到端掃描,使安全研究人員能夠檢測和識別安全漏洞。
3. 無需訪問源代碼
DAST 掃描通過應用程序前端發送惡意有效負載來測試,因此企業可以利用第三方安全服務來執行,而不暴露應用程序代碼。
DAST 缺點
雖然 DAST 工具評估應用程序代碼中的各種漏洞,但它們無法定位代碼庫中安全問題的確切位置;也無法嗅探應用程序堆棧中未執行部分中的漏洞。
常見的 DAST 工具
下圖所示是常見的 DAST 工具:
極狐GitLab 中 DAST 流水線的流程
Step 1:因為 DAST 是黑盒測試,需要依賴於一個運行中的真實應用程序才能工作。因此,先準備一個已部署的應用網站(測試網站);
Step 2:在倉庫 CI Yaml 文件配置對應 DAST 腳本
Step 3:把相應配置提交到對應極狐GitLab 倉庫,觸發流水線,通過 CI runner 運行掃描程序,模擬用户訪問請求;
Step 4:獲得響應結果,分支器會針對響應返回結果做具體分析,如果輸出有漏洞,則輸出到對應的漏洞報告中,該報告在 CI runner 運行完之後,統一輸出到 CI 產物中;
Step 5:根據漏洞報告展示的漏洞具體信息,開發者可以着手進行漏洞修復。
極狐GitLab DAST 配置指南
Web Analyzer
兩種類型的 Web Analyzer
實際開發中,以 Web 應用為主。極狐GitLab 針對 Web 應用提供兩種類型的 Analyzer :Proxy-based analyzer 和 Browser-based analyzer。接下來分別介紹:
➤ Proxy-based analyzer: 用於掃描傳統的簡單 HTML 應用
在極狐GitLab 中配置 DAST 的 Proxy-based analyzer 非常簡單:聲明 DAST stages,通過引入一個模板文件,就可以開箱即用了。
在實際運行的過程中,調用 ZAP 代理程序,對應用程序進行一個掃描過程:
➤ Browser-based analyzer: 用於掃描重度使用了 JavaScript 的應用,包括單頁應用
Browser-based analyzer 使用瀏覽器模擬訪問:配置對應參數 DAST_BROWSER_SCAN,設置為 true,就可以啓用了。
它的原理是在 ZAP 前端設置了一層瀏覽器代理,模擬用户進行行為分析,通過 ZAP 代理,訪問到具體的 Web Application。這樣的好處是所有請求和返回結果實際上都是經過 ZAP,這樣可以利用 ZAP 的請求分析功能,對具體響應就做具體分析,看是否存在漏洞。
上圖配置中引用了一個模版配置文件:DAST.gitlab-ci.yml,它具體是做了哪些事情?如下圖:
- 聲明瞭需要引用的鏡像版本號:13;
- 聲明瞭一個新的 DAST 任務,使用極狐GitLab 官方提供的 DAST 鏡像,進行掃描處理;
- 可以看到具體的 script 參數裏面,先通過提取對應的環境變量
DAST_WEBSITE(如下圖方式1)或者把對應的地址放到根目錄下enviroment_url.txt文件(如下圖方式2),兩種方式取其一; - 執行腳本,分析完之後他通過
artifacts,也就是對應瀏覽 Pipeline 產物; - 最後將漏洞報告輸入到文件中去。
圖注/方式一:適合靜態地址
圖注/方式2:適合動態地址
配置目標應用程序
如果想啓用 DAST,必須要一個 Runtime。如果每次都要預先手動去部署 Runtime 的話,是比較麻煩的,有沒有自動部署方式?答案是有的,並且有兩種方式:
➤ 通過 docker service 配置 Runtime
提前編譯好目標鏡像文件,通過docker service 方式在 Pipeline 中將 Runtime 運行起來。
如下圖,定義了兩個 job,第一個是 deploy 的 job,第二個是 DAST 的一個運行任務。
在 deploy 裏面,通過 docker build 的方式把目標的鏡像文件構建出來,並推送到了極狐GitLab 的一個鏡像倉庫中。
在啓用 DAST 的時候,定義了一個 services 的依賴項,即需要先把對應的鏡像運行起來後,得到了一個實際運行地址,把這個地址填到 DAST_WEBSITE 環境變量中,這樣就可以實現在 Pipeline 裏運行 Runtime 的效果。
這種方式適合簡單的鏡像程序,因為如果有很多依賴項,就需要把對應依賴項的 Service 也一併定義,比較麻煩。
➤ 和 Review apps 搭配使用
極狐GitLab 推薦 Review apps 功能,它可以針對某個合併請求來自動部署,用於 QA 驗證或自動化測試。
Review apps 提供了這樣一種機制:把對應的 MR 部署到某個相對臨時的環境中去,就可以通過這個臨時環境去看到這個變更的實際影響效果。這樣一個臨時 runtime 環境,正好可以搭配 DAST 來使用,做對應的 DAST 檢測(如下圖)。
身份認證:多種登錄方式
因為爬蟲並不能夠自動對未登錄的頁面進行爬取,所以先要在爬蟲裏面做一些設置,讓爬蟲自動登錄,Web Analyzer 支持多種登錄方式,包括:
- HTTP authentication;
- Single-step login form;
- Multi-step login form。
需要注意的幾點:
- 爬蟲不具備人機校驗能力,登錄認證時需要關閉 CAPTCHA;
- 爬蟲會遍歷網站上的所有鏈接,如果不對它進行限制,有可能不小心掃到了一個登出鏈接,然後又會跳到一個重新登錄的狀態。因此要去除掃描登出鏈接。
掃描檢查項與掃描時間控制
極狐GitLab 的漏洞掃描檢查項,包含高等級、低等級,超過 150 種。
有些部署網站可能比較大,涉及的頁面數量和鏈接數量很多,執行 DAST 可能會出現執行時間過長或超時的情況。
此時就要手動控制對應的爬蟲處理數量,DAST 提供了一些對應參數去限制,包括瀏覽器的數量、最大執行數、最大頁面檢查深度、總超時時間、具體操作的操作超時時間等,根據具體應用場景去調整。
API Analyzer
API Analyzer 與 Web Analyzer的區別是,API Analyzer 不支持爬取,需要手動給到 API 文檔,讓它知道哪些端點需要檢測。
支持的 API 格式包括 REST API、 SOAP、 GraphQL、From bodies, JSON or XML。
如下圖,常見的 OpenAPI 需要在 ci.yml 文件中去配置,引入 DAST_API 的樣本文件,設置對應的 API 端點即對應的文檔地址。
模板配置文件
DAST-API.gitlab-ci.yml 文件引入了另外一個倉庫叫做 api-security 鏡像,實際執行時也調用了不同的掃描分析腳本去執行輸出。
下圖是另外一種格式的 API 的配置方式:Postman collection,可以看到的對應的環境變量名稱變了。
接着是 GraphQL API 配置方式,通過直接配置 API 端點即可,如果其支持類型,可以通過 API 本身的到詳盡文檔,不需要指出文檔地址,否則需要手動指出。
Analyzer 拿到文檔後,首先進行掃描操作,之後針對不同 API 進行實際檢測和攻擊。
圖注/GraphQL Schema with introspection
圖注/GraphQL Schema with schema file
身份認證:多種方式
➤ HTTP Basic Auth:直接提供一個賬號密碼
➤ Bearer token,分為兩種:
- token 的過期時間比較長,可以在 CI 腳本 Yaml 文件名配置一個相對固定的 token,這樣在整個分析過程中,只需要用到這一個 token 就可以了。
- token 時效性比較短的情況下,需要在爬取過程中定期去做更新處理,可以去指定更新 token 的腳本、更新時間,做到自動更新。
以上,就是關於 DAST 的基礎知識和操作分享。同時,我們提供了極狐GitLab 旗艦版 30天免費體驗機會,歡迎到極狐GitLab 官網申請試用,結合產品實操,將更加有助於你進一步掌握 DAST 。