문제 해결
다음 해결 시나리오들은 고객 지원 사례에서 수집되었습니다. 만약 여기서 다루지 않는 문제가 발생하거나 여기 있는 정보로 문제가 해결되지 않는다면, 지원 티켓을 만드세요. 자세한 내용은 GitLab 지원 페이지를 참조하세요.
뭔가 잘못되었을 때
DAST 스캔에 문제가 발생했을 때 특정 오류 메시지가 있다면 알려진 문제를 확인하세요.
그 외에도 다음 질문에 답함으로써 문제를 발견해 보세요:
- 예상되는 결과는 무엇입니까?
- 결과는 사람이 수행할 수 있는 것입니까?
- DAST가 작동하지 않을 수 있는 이유는 있나요?
- 애플리케이션이 어떻게 작동합니까?
- DAST가 무엇을 하는 것인가요?
예상되는 결과는 무엇입니까?
DAST 스캔과 관련하여 문제를 겪는 많은 사용자들은 스캐너가 수행해야 한다고 생각하는 것에 대해 좋은 고수준 아이디어를 가지고 있습니다. 예를 들어, 특정 페이지를 스캔하지 않거나 페이지에서 버튼을 선택하지 않는 등의 문제가 발생할 수 있습니다.
문제를 분리하여 해결책을 찾기 위해 최대한 노력하세요. 예를 들어, DAST가 특정 페이지를 스캔하지 않으면 상황을 분리해야 합니다. DAST가 해당 페이지를 어디에서 찾아야 하나요? 거기로 이동하는 데 어떤 경로를 따랐나요? DAST가 선택했어야 할 참조 페이지에 요소가 있었나요?
결과는 사람이 수행할 수 있는 것입니까?
사람이 매뉴얼으로 애플리케이션을 탐색할 수 없다면 DAST는 해당 애플리케이션을 스캔할 수 없습니다.
기대하는 결과를 알고 있다면, 브라우저를 사용하여 매뉴얼으로 복제해 보세요. 예를 들어:
- 새 시크릿/프라이빗 브라우저 창을 엽니다.
- 개발자 도구를 엽니다. 콘솔에서 오류 메시지를 확인하세요.
- 크롬:
보기 -> 개발자 -> 개발자 도구
- 파이어폭스:
도구 -> 브라우저 도구 -> 웹 개발 도구
- 크롬:
- 인증하는 경우:
-
DAST_AUTH_URL
로 이동합니다. -
DAST_USERNAME_FIELD
에DAST_USERNAME
을 입력합니다. -
DAST_PASSWORD_FIELD
에DAST_PASSWORD
를 입력합니다. -
DAST_SUBMIT_FIELD
를 선택합니다.
-
- 링크를 선택하고 양식을 작성하세요. 올바르게 스캔되지 않는 페이지로 이동하세요.
- 애플리케이션이 어떻게 동작하는지 관찰하세요. 자동화된 스캐너에 문제를 발생시킬 수 있는 요소가 있는지 확인하세요.
DAST가 작동하지 않을 수 있는 이유는 있나요?
DAST는 다음 경우에 정상적으로 스캔할 수 없습니다:
- CAPTCHA가 있는 경우. 스캔되는 애플리케이션의 테스트 환경에서 이를 끄세요.
- 대상 애플리케이션에 대한 액세스 권한이 없는 경우. DAST 구성에서 사용되는 URL을 통해 GitLab 러너가 애플리케이션에 액세스할 수 있도록 확인하세요.
애플리케이션이 어떻게 작동합니까?
애플리케이션이 어떻게 작동하는지 이해하는 것은 DAST 스캔이 작동하지 않는 이유를 파악하는 데 중요합니다. 예를 들어, 다음 상황은 추가 구성 설정이 필요할 수 있습니다.
- 요소를 숨기는 팝업 모달이 있나요?
- 로드된 페이지가 일정 시간이 지난 후에 급격하게 변경되나요?
- 애플리케이션의 로드 속도가 특별히 빠르거나 느린가요?
- 대상 애플리케이션이 로드되는 동안부터 끊겼거나 빨랐나요?
- 애플리케이션이 클라이언트 위치에 따라 다르게 작동하나요?
- 애플리케이션이 싱글 페이지 애플리케이션인가요?
- 애플리케이션이 HTML 양식을 제출하나요, 아니면 JavaScript와 AJAX를 사용하나요?
- 애플리케이션이 웹소켓을 사용하나요?
- 애플리케이션이 특정 웹 프레임워크를 사용하나요?
- 버튼을 선택하면 양식 제출을 계속하기 전에 JavaScript가 실행됩니까? 실행이 빠른가요, 느린가요?
- DAST가 준비되지 않은 요소 또는 페이지를 기다리는 동안 요소를 선택하거나 검색할 수 있는 가능성이 있나요?
DAST가 무엇을 하는 것인가요?
로그 기록은 DAST가 하는 작업을 이해하는 데 가장 좋은 방법입니다:
- 브라우저 기반 분석기 로깅: 분석기의 동작을 이해하는 데 유용합니다.
- Chromium DevTools 로깅: DAST와 Chromium 간의 통신을 검사하는 데 유용합니다.
- Chromium 로그: Chromium이 예기치 않게 충돌할 때 오류를 기록하는 데 유용합니다.
브라우저 기반 분석기 로깅
로그는 스캔에 대한 문제를 진단하는 데 가장 유용한 도구 중 하나입니다. 분석기의 다양한 부분은 서로 다른 수준으로 기록될 수 있습니다.
로그 메시지 형식
로그 메시지는 [시간] [로그 수준] [로그 모듈] [메시지] [추가 속성]
형식을 가지고 있습니다.
예를 들어, 다음 로그 항목은 INFO
수준이며 CRAWL
로그 모듈의 Crawled path
메시지와 nav_id
, path
추가 속성을 갖습니다.
2021-04-21T00:34:04.000 INF CRAWL Crawled path nav_id=0cc7fd path="LoadURL [https://my.site.com:8090]"
로그 대상
로그는 파일 또는 콘솔(CI/CD 작업 로그)로 전송됩니다. DAST_BROWSER_LOG
를 사용하여 콘솔 로그, DAST_BROWSER_FILE_LOG
를 사용하여 파일 로그가 다른 로그를 수락하도록 구성할 수 있습니다.
예시:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_SCAN: "true"
DAST_BROWSER_LOG: "auth:debug" # 콘솔 로그는 기본적으로 INFO 수준이며 DEBUG 수준의 로그는 DEBUG 모듈에서 수신합니다
DAST_BROWSER_FILE_LOG: "loglevel:debug,cache:warn" # 파일 로그는 기본적으로 DEBUG 수준이며 WARN 모듈에서 수신합니다
DAST_BROWSER_FILE_LOG_PATH: "$CI_PROJECT_DIR/dast-scan.log" # 프로젝트 디렉터리에 파일 로그를 저장하여 아티팩트로 인식하도록 설정합니다
artifacts:
paths:
- dast-scan.log
when: always
로그 수준
구성할 수 있는 로그 수준은 다음과 같습니다:
로그 모듈 | 구성 요약 | 자세히 알아보기 |
---|---|---|
TRACE
| 구체적이고 종종 소음이 많은 기능용으로 사용됩니다. | |
DEBUG
| 기능의 내부 작업을 설명합니다. 진단 목적으로 사용됩니다. | |
INFO
| 스캔의 고수준 흐름과 결과를 설명합니다. | 지정된 경우 기본 수준은 INFO입니다. |
WARN
| DAST가 복구하고 스캔을 계속할 수 있는 오류 상황을 설명합니다. | |
FATAL /ERROR /PANIC
| 종료 전에 복구할 수 없는 오류를 설명합니다. |
로그 모듈
LOGLEVEL
은 로그 대상의 기본 로그 레벨을 구성합니다. 다음 모듈 중 하나라도 구성되어있는 경우 DAST는 기본 로그 레벨보다 해당 모듈의 로그 레벨을 우선시합니다.
로그 기록을 위해 구성할 수 있는 모듈은 다음과 같습니다:
로그 모듈 | 컴포넌트 개요 |
---|---|
ACTIV
| 활성 공격에 사용됨. |
AUTH
| 인증된 스캔을 생성하는 데 사용됨. |
BPOOL
| 크롤링에 사용되는 브라우저 세트. |
BROWS
| 브라우저의 상태나 페이지를 조회하는 데 사용됨. |
CACHE
| 캐시된 HTTP 리소스의 캐시 적중 및 실패에 대한 보고에 사용됨. |
CHROM
| Chrome DevTools 메시지를 기록하는 데 사용됨. |
CONFG
| 분석기 구성을 기록하는 데 사용됨. |
CONTA
| DevTools 메시지에서 HTTP 요청과 응답의 일부를 수집하는 컨테이너에 사용됨. |
CRAWL
| 코어 크롤러 알고리즘에 사용됨. |
CRWLG
| 크롤 그래프 생성기에 사용됨. |
DATAB
| 내부 데이터베이스로 데이터를 영속화하는 데 사용됨. |
LEASE
| 브라우저를 생성하여 브라우저 풀에 추가하는 데 사용됨. |
MAIN
| 크롤러의 주 이벤트 루프 흐름에 사용됨. |
NAVDB
| 네비게이션 항목을 저장하는 데 사용됨. |
REGEX
| 정규 표현식을 실행할 때 성능 통계를 기록하는 데 사용됨. |
REPT
| 보고서 생성에 사용됨. |
STAT
| 스캔 수행 중 일반 통계에 사용됨. |
VLDFN
| 취약성 정의를 로드하고 구문 분석하는 데 사용됨. |
WEBGW
| 활성 체크를 실행할 때 대상 애플리케이션으로 전송된 메시지를 기록하는 데 사용됨. |
예시 - 크롤된 경로에 대한 로그 설정
크롤 단계에서 발견한 탐색 경로를 로깅하려면 로그 모듈 CRAWL
을 DEBUG
로 설정합니다. 이는 DAST가 대상 애플리케이션을 올바르게 크롤하는지 이해하는 데 유용합니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_LOG: "crawl:debug"
예를 들어, 다음 출력은 https://example.com
의 페이지 크롤 중 발견된 네 개의 앵커 링크를 보여줍니다.
2022-11-17T11:18:05.578 DBG CRAWL 실행 단계 nav_id=6ec647d8255c729160dd31cb124e6f89 path="LoadURL [https://example.com]" step=1
...
2022-11-17T11:18:11.900 DBG CRAWL 새로운 네비게이션 발견 browser_id=2243909820020928961 nav_count=4 nav_id=6ec647d8255c729160dd31cb124e6f89 of=1 step=1
2022-11-17T11:18:11.901 DBG CRAWL 네비게이션 추가 액션="LeftClick [a href=/page1.html]" nav=bd458cc1fc2d7c6fb984464b6d968866 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL 네비게이션 추가 액션="LeftClick [a href=/page2.html]" nav=6dcb25f9f9ece3ee0071ac2e3166d8e6 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL 네비게이션 추가 액션="LeftClick [a href=/page3.html]" nav=89efbb0c6154d6c6d85a63b61a7cdc6f parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL 네비게이션 추가 액션="LeftClick [a href=/page4.html]" nav=f29b4f4e0bdee70f5255de7fc080f04d parent_nav=6ec647d8255c729160dd31cb124e6f89
Chromium DevTools 로깅
DAST 브라우저 기반 스캐너는 Chrome DevTools Protocol을 사용하여 Chromium 브라우저를 조정합니다. DevTools 메시지 기록은 브라우저의 작업을 투명하게 보여줍니다. 예를 들어, 버튼을 선택하는 것이 작동하지 않으면, DevTools 메시지에서 CORS 오류가 브라우저 콘솔 로그에 있다는 원인을 보여줄 수 있습니다. DevTools 메시지를 포함하는 로그는 매우 크기가 커질 수 있습니다. 이러한 이유로 짧은 기간의 작업에만 활성화되어야 합니다.
모든 DevTools 메시지를 기록하려면 CHROM
로그 모듈을 trace
로 설정하고 로깅 레벨을 구성합니다. 다음은 DevTools 로그의 예시입니다:
2022-12-05T06:27:24.280 TRC CHROM 이벤트 수신 {"method":"Fetch.requestPaused","params":{"requestId":"interception-job-3.0","request":{"url":"http://auth-auto:8090/font-awesome.min.css","method":"GET","headers":{"Accept":"text/css,*/*;q=0.1","Referer":"http://auth-auto:8090/login.html","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/105.0.5195.102 Safari/537.36"},"initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"frameId":"A706468B01C2FFAA2EB6ED365FF95889","resourceType":"Stylesheet","networkId":"39.3"}} method=Fetch.requestPaused
2022-12-05T06:27:24.280 TRC CHROM 요청 전송 {"id":47,"method":"Fetch.continueRequest","params":{"requestId":"interception-job-3.0","headers":[{"name":"Accept","value":"text/css,*/*;q=0.1"},{"name":"Referer","value":"http://auth-auto:8090/login.html"},{"name":"User-Agent","value":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/105.0.5195.102 Safari/537.36"}]}} id=47 method=Fetch.continueRequest
2022-12-05T06:27:24.281 TRC CHROM 응답 수신 {"id":47,"result":{}} id=47 method=Fetch.continueRequest
DevTools 로그 레벨 사용자 정의
Chrome DevTools 요청, 응답 및 이벤트는 도메인별로 네임스페이스화됩니다. DAST는 각 도메인 및 메시지별로 다른 로깅 구성을 가질 수 있습니다.
환경 변수 DAST_BROWSER_DEVTOOLS_LOG
은 세미콜론으로 구분된 로깅 구성 디렉터리을 허용합니다.
로깅 구성은 [도메인/메시지]:[무엇을 로깅할 것인가][,truncate:[최대 메시지 크기]]
구조를 사용하여 선언됩니다.
-
도메인/메시지
는 로깅되는 내용을 참조합니다.-
Default
는 모든 도메인 및 메시지를 나타내는 값으로 사용될 수 있습니다. - 도메인일 수 있으며, 예를 들어
Browser
,CSS
,Page
,Network
입니다. - 메시지가 포함된 도메인일 수 있으며, 예를 들어
Network.responseReceived
입니다. - 여러 구성이 적용되는 경우 가장 구체적인 구성이 사용됩니다.
-
-
무엇을 로깅할 것인가
는 로깅 여부와 로깅할 내용을 참조합니다.-
message
는 메시지가 수신되었음을 로깅하며 메시지 내용을 로깅하지 않습니다. -
messageAndBody
는 메시지와 메시지 내용을 로깅합니다.truncate
와 함께 사용하는 것이 좋습니다. -
suppress
는 메시지를 로깅하지 않습니다. 시끄러운 도메인과 메시지를 조용히 하는 데 사용됩니다.
-
-
truncate
는 출력되는 메시지의 크기를 제한하는 선택적 구성입니다.
예시 - 모든 DevTools 메시지 로깅
어디서부터 시작해야 할지 확신이 없을 때 모든 것을 로깅하는 데 사용됩니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_FILE_LOG: "chrom:trace"
DAST_BROWSER_FILE_LOG_PATH: "/zap/wrk/dast-scan.log"
DAST_BROWSER_DEVTOOLS_LOG: "Default:messageAndBody,truncate:2000"
artifacts:
paths:
- dast-scan.log
when: always
예시 - HTTP 메시지 로깅
리소스가 올바르게 로드되지 않을 때 유용합니다. HTTP 메시지 이벤트가 로깅되며, 요청을 계속 진행할지 실패할지에 대한 결정도 로깅됩니다. 브라우저 콘솔의 모든 오류도 로깅됩니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_FILE_LOG: "chrom:trace"
DAST_BROWSER_FILE_LOG_PATH: "/zap/wrk/dast-scan.log"
DAST_BROWSER_DEVTOOLS_LOG: "Default:suppress;Fetch:messageAndBody,truncate:2000;Network:messageAndBody,truncate:2000;Log:messageAndBody,truncate:2000;Console:messageAndBody,truncate:2000"
artifacts:
paths:
- dast-scan.log
when: always
Chromium 로그
Chromium 충돌이 발생하는 경우, Chromium 프로세스의 STDOUT
와 STDERR
를 로깅하는 것이 도움이 될 수 있습니다. 환경 변수 DAST_BROWSER_LOG_CHROMIUM_OUTPUT
을 true
로 설정하면 이러한 목적을 달성할 수 있습니다.
DAST는 많은 Chromium 프로세스를 시작하고 중지합니다. DAST는 각 프로세스 출력을 모든 로그 대상으로 보내며 로그 모듈 LEASE
및 로그 레벨 INFO
를 사용합니다.
예를 들어:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_LOG_CHROMIUM_OUTPUT: "true"
알려진 문제
로그에 response body exceeds allowed size
가 포함되어 있음
기본적으로 DAST는 HTTP 응답 본문이 10MB 이하인 HTTP 요청을 처리합니다. 그 이상인 경우 DAST는 스캔 실패의 원인이 될 수 있는 응답을 차단합니다. 이 제한은 스캔 중 메모리 소비를 줄이기 위한 것입니다.
예시 로그는 다음과 같습니다. DAST가 크기가 제한을 초과하는 JavaScript 파일을 차단하여 https://example.com/large.js
에서 발견한 것입니다.
2022-12-05T06:28:43.093 WRN BROWS response body exceeds allowed size allowed_size_bytes=1000000 browser_id=752944257619431212 nav_id=ae23afe2acbce2c537657a9112926f1a of=1 request_id=interception-job-2.0 response_size_bytes=9333408 step=1 url=https://example.com/large.js
2022-12-05T06:28:58.104 WRN CONTA request failed, attempting to continue scan error=net::ERR_BLOCKED_BY_RESPONSE index=0 requestID=38.2 url=https://example.com/large.js
이는 DAST_MAX_RESPONSE_SIZE_MB
구성을 사용하여 변경할 수 있습니다. 예를 들어,
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_MAX_RESPONSE_SIZE_MB: "25"