ZAP Alert Filters로 Risk 가지고 놀기

Alert filters

Alert filters는 ZAP에서 발견한 이슈(Alert)들을 쉽게 관리하기 위한 Filter 기능입니다. 지정한 조건에 따라서 Alert의 Risk Level을 조정하거나 나타나지 않게 할 수 있습니다. ZAP을 Proxy로 사용하는 경우 자주 사용되는 기능은 아니지만, DevSecOps 등 DAST 서비스로서 사용하는 경우에는 잘 활용한다면 발견되는 이슈의 정확도를 많이 높일 수 있습니다.

Alert filters는 2가지 형태로 존재합니다.

  • Context Alert Filters
  • Global Alert Filters

Context Alert Filters

Context Alert Filters는 각 Context(Scope)를 대상으로 하는 Alert filters 입니다. 지정한 Context에 설정할 수 있고, 해당 Context에 추가된 Alert 들만 영향을 받습니다.

Context > Alert filters

Global Alert Filters

Global Alert Filters는 ZAP 전체적으로 적용받는 Alert filters입니다.

Options > Global Alert Filters

Struct of Alert fileter

  Type Description Example
Scope 고정 값 Global/Context Name  
Alert Type 조건 Alert name이 같다면 XSS, SQL Injection
URL 조건 URL이 같다면 https://google.com
URL is Regex? 조건 URL 매치 시 정규표현식을 사용할지? true/false
Parameter 조건 파라미터가 같다면 query
Parameter is Regex? 조건 파라미터 매치 시 정규표현식을 사용할지? true/false
Attack 조건 공격코드가 같다면 query=<br>
Attack is Regex? 조건 공격코드 매치 시 정규표현식을 사용할지? true/false
Evidence 조건 탐지결과가 같다면 aaa<br>aaa
Evidence is Regex? 조건 탐지결과 매치 시 정규표현식을 사용할지? true/false
New Risk Level 결과 새로 정의할 Risk Level False Positive,Low,Medium
Enabled 상태 해당 Filter를 적용할지? true/false

Action

조건에 따라 오탐 처리하기

원하는 Alert에서 우클릭 > Create Alert Filters 를 통해 생성해줍니다. 물론 Context나 Settings에서 직접 들어가서 Add 해주셔도 됩니다.

저는 예시로 Access-Control-Allow-Origin: * 인 경우는 기본으로 오탐 처리를 했습니다. Evidence에 Access-Control-Allow-Origin: * 탐지되는 경우 New Risk Level을 False Positive로 설정합니다.

아래 Test Filter를 눌러보면 몇개의 Alert들이 해당되는지 알 수 있고, Apply Filter를 통해서 이전 이력도 한번에 적용 시킬 수 있습니다. 위 Alert Filter가 등록된 이후 부턴 Access-Control-Allow-Origin: *인 Cross-Domain Misconfiguration 항목은 자동으로 False Positive 처리됩니다.

조건에 따라 리스크 조정하기

두번째는 Alert 리스크를 조정해봅시다. 이번에는 Context > Alert Filters 메뉴를 통해 생성하였습니다. 이번에는 Cross Site Scripting (Reflected) 항목을 예외 처리 해보죠. (테스트를 위해 testphp.vulnweb.com으로 스캔을 약간 진행해서 Alert을 만들었습니다.)

아래 Alert은 XSS 이슈로 artist 파라미터에서 발견되었고 현재 High level을 가집니다.

Context > Alert Filter에서 새로 하나 만들어줍니다. Risk Level을 Info로 조정하고, Parameter 조건에 artist를 넣어주었습니다.

이제 artisg 파라미터에서 발견된 Cross Site Scripting (Reflected) 이슈는 Info 로 나타나게 됩니다.

For DevSecOps

제일 중요한건 이러한 과정을 템플릿화 하고 자동화 로직에 넣을 수 있는가? 입니다. 당연히 CLI, API 그리고 Automation으로도 이 작업이 가능합니다.

With API

GET /JSON/alertFilter/action/addGlobalAlertFilter/?ruleId=90011&newLevel=3&url=&urlIsRegex=&parameter=&enabled=&parameterIsRegex=&attack=&attackIsRegex=&evidence=&evidenceIsRegex= HTTP/1.1
Host: localhost:8090
  • http://127.0.0.1:8090/UI/alertFilter/action/addGlobalAlertFilter/
  • http://127.0.0.1:8090/UI/alertFilter/action/addAlertFilter/

With Automation

 - type: alertFilter                  # Used to change the risk levels of alerts
    parameters:
      deleteGlobalAlerts: true         # Boolean, if true then will delete all existing global alerts, default false
    alertFilters:                      # A list of alertFilters to be applied
      - ruleId:                        # Int: Mandatory alert rule id
        newRisk:                       # String: Mandatory new risk level, one of 'False Positive', 'Info', 'Low', 'Medium', 'High'
        context:                       # String: Optional context name, if empty then a global alert filter will be created
        url:                           # String: Optional string to match against the alert, supports environment vars
        urlRegex:                      # Boolean: Optional, if true then the url is a regex
        parameter:                     # String: Optional string to match against the alert parameter field
        parameterRegex:                # Boolean: Optional, if true then the parameter is a regex, supports environment vars
        attack:                        # String: Optional string to match against the alert attack field
        attackRegex:                   # Boolean: Optional, if true then the attack is a regex
        evidence:                      # String: Optional string to match against the alert evidence field
        evidenceRegex:                 # Boolean: Optional, if true then the evidence is a regex

Automation GUI에서 Alert fileter를 만들고 YAML로 Export 하면 편리합니다 :D

With CLI

config.xml에는 이렇게 명시되고 있습니다.

<globalalertfilter version="1">
    <confirmRemoveFilter>true</confirmRemoveFilter>
    <filters>
       <filter>
           <ruleid>90011</ruleid>
           <newrisk>3</newrisk>
           <url/>
           <urlregex>false</urlregex>
           <param/>
           <paramregex>false</paramregex>
           <attack/>
           <attackregex>false</attackregex>
           <evidence/>
           <evidenceregex>false</evidenceregex>
           <enabled>true</enabled>
       </filter>
    </filters>
</globalalertfilter>

결국 아래와 같은 포맷으로 CLI Config를 만들 수 있습니다.

config.globalalertfilter.filters.filter[0].ruleid=90011
config.globalalertfilter.filters.filter[0].newrisk=3
...

References

  • https://www.zaproxy.org/docs/desktop/addons/alert-filters/