문제 해결

다음 문제 해결 시나리오는 고객 지원 사례에서 수집된 내용입니다. 여기서 다루지 않는 문제가 발생하거나 여기에 있는 정보가 문제를 해결하지 못하는 경우 지원 티켓을 만드십시오. 자세한 내용은 GitLab 지원 페이지를 참조하십시오.

문제 발생 시

DAST 스캔에 문제가 발생하면 특정 오류 메시지가 있는 경우 알려진 문제를 확인하십시오.

그렇지 않으면 다음 질문에 답하여 문제를 파악하려고 하십시오:

예상 결과는 무엇입니까?

DAST 스캔에 문제가 있는 사용자 중 많은 사람들은 스캐너가 해야 하는 것에 대한 대략적인 높은 수준의 아이디어를 가지고 있습니다. 예를 들어, 특정 페이지를 스캔하지 않거나 페이지의 버튼을 선택하지 않는 등의 문제가 있을 수 있습니다.

가능한 한 문제를 분리하여 해결 방법을 좁히기 위해 노력하십시오. 예를 들어, DAST가 특정 페이지를 스캔하지 않는 상황을 가정해 보겠습니다. DAST가 페이지를 어디에서 발견해야 했습니까? 그것을 찾아가기 위해 어떤 경로를 따랐습니까? 참조 페이지에는 DAST가 선택해야 하는 요소가 있었지만 선택하지 않았던 것이 있었습니까?

결과를 사람이 달성할 수 있습니까?

사람이 수동으로 애플리케이션을 탐색할 수 없는 경우 DAST는 애플리케이션을 스캔할 수 없습니다.

예상되는 결과를 알면 브라우저에서 직접 수동으로 복제해보십시오. 예를 들어:

  • 새 시크릿 브라우저 창을 엽니다.
  • 개발자 도구를 엽니다. 오류 메시지를 확인하세요.
    • Chrome에서: 보기 -> 개발자 -> 개발자 도구.
    • Firefox에서: 도구 -> 브라우저 도구 -> 웹 개발 도구.
  • 인증하는 경우:
    • DAST_AUTH_URL로 이동합니다.
    • DAST_USERNAMEDAST_USERNAME_FIELD에 입력합니다.
    • DAST_PASSWORDDAST_PASSWORD_FIELD에 입력합니다.
    • DAST_SUBMIT_FIELD을 선택합니다.
  • 링크를 선택하고 양식을 작성합니다. 정확하게 스캔되지 않는 페이지로 이동합니다.
  • 애플리케이션이 어떻게 동작하는지 관찰하세요. 자동화된 스캐너에 문제가 될 수 있는 요소가 있는지 주의 깊게 관찰하세요.

DAST가 작동하지 않을 가능성이 있는 이유가 있습니까?

DAST는 다음과 같은 경우에 올바르게 스캔할 수 없습니다.

  • CAPTCHA가 있는 경우. 스캔 중인 애플리케이션의 테스트 환경에서 이 기능을 끄십시오.
  • 대상 애플리케이션에 대한 액세스 권한이 없는 경우. DAST 구성에 사용된 URL을 통해 GitLab Runner가 애플리케이션에 액세스할 수 있도록 하십시오.

애플리케이션이 작동하는 방식은 무엇입니까?

애플리케이션이 작동하는 방식을 이해하는 것은 DAST 스캔이 작동하지 않는 이유를 파악하는 데 중요합니다. 예를 들어 다음 상황은 추가 구성 설정이 필요할 수 있습니다.

  • 요소를 숨기는 팝업 모달이 있나요?
  • 로드된 페이지가 일정 시간 이후에 급격히 변경되나요?
  • 애플리케이션이 특히 느리거나 빠르게 로드되나요?
  • 대상 애플리케이션이 로드되는 동안 부드럽거나 끊겨 있습니까?
  • 애플리케이션이 클라이언트의 위치에 따라 다르게 작동합니까?
  • 애플리케이션이 단일 페이지 애플리케이션입니까?
  • 애플리케이션이 HTML 양식을 제출하거나 JavaScript 및 AJAX를 사용합니까?
  • 애플리케이션이 웹 소켓을 사용합니까?
  • 특정한 웹 프레임워크를 사용합니까?
  • 버튼을 선택하면 양식 제출을 계속하기 전에 JavaScript가 실행되나요? 그런 경우 이 작업이 빠른가요, 느린가요?
  • DAST가 준비된 요소나 페이지보다 이전에 요소를 선택하거나 검색할 수 있는 가능성이 있습니까?

DAST가 무엇을 하고 있습니까?

로그 기록은 DAST가 무엇을 하는지 이해하는 데 가장 좋은 방법입니다:

브라우저 기반 분석기 로깅

분석기 로그는 스캔 문제를 진단하는 데 가장 유용한 도구 중 하나입니다. 분석기의 다른 부분을 서로 다른 수준으로 기록할 수 있습니다.

로그 메시지 형식

로그 메시지는 [시간] [로그 수준] [로그 모듈] [메시지] [추가 속성] 형식을 가지고 있습니다.

예를 들어, 다음 로그 항목은 레벨 INFO이며 CRAWL 로그 모듈의 일부이며 메시지로 Crawled path를 가지고 있으며 추가 속성으로 nav_idpath를 가지고 있습니다.

2021-04-21T00:34:04.000 INF CRAWL Crawled path nav_id=0cc7fd path="LoadURL [https://my.site.com:8090]"

로그 대상

로그는 파일 또는 콘솔(지속적인 통합/지속적인 배포 작업 로그)로 전송됩니다. 환경 변수 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 레벨에서 AUTH 모듈 로그 출력
    DAST_BROWSER_FILE_LOG: "loglevel:debug,cache:warn"           # 파일 로그 기본값은 DEBUG 레벨이며, WARN 레벨에서 CACHE 모듈 로그 출력
    DAST_BROWSER_FILE_LOG_PATH: "$CI_PROJECT_DIR/dast-scan.log"  # 프로젝트 디렉토리에 파일 로그 저장하여 아티팩트로 인식될 수 있도록 함
  artifacts:
    paths:
      - dast-scan.log
    when: always

로그 레벨

구성할 수 있는 로그 레벨은 다음과 같습니다:

로그 모듈 구성 요약 추가 정보
TRACE 특정 기능의 내부 작업에 자주 사용됩니다.  
DEBUG 기능의 내부 작업을 설명합니다. 진단 목적으로 사용됩니다.  
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 적용중인 활성화 점검을 실행하는 동안 대상 애플리케이션에 전송된 메시지를 기록하는 데 사용됩니다.

예시 - 크롤된 경로 로깅

크롤 단계에서 발견된 네비게이션 경로를 이해하는 데 유용하도록 로그 모듈 CRAWLDEBUG로 설정합니다.

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_BROWSER_LOG: "crawl:debug"

예를 들어, 다음 출력은 크롤링된 페이지에서 발견된 네비게이션 링크 4개를 보여줍니다.

2022-11-17T11:18:05.578 DBG CRAWL executing step nav_id=6ec647d8255c729160dd31cb124e6f89 path="LoadURL [https://example.com]" step=1
...
2022-11-17T11:18:11.900 DBG CRAWL found new navigations browser_id=2243909820020928961 nav_count=4 nav_id=6ec647d8255c729160dd31cb124e6f89 of=1 step=1
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page1.html]" nav=bd458cc1fc2d7c6fb984464b6d968866 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page2.html]" nav=6dcb25f9f9ece3ee0071ac2e3166d8e6 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page3.html]" nav=89efbb0c6154d6c6d85a63b61a7cdc6f parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page4.html]" nav=f29b4f4e0bdee70f5255de7fc080f04d parent_nav=6ec647d8255c729160dd31cb124e6f89

Chromium DevTools 로깅

경고: DevTools 메시지를 로깅하는 것은 보안 위험을 초래할 수 있습니다. 출력물에는 사용자 이름, 비밀번호 및 인증 토큰과 같은 비밀 정보가 포함될 수 있습니다. 출력물은 GitLab 서버에 업로드되어 작업 로그에서 확인할 수 있습니다.

DAST 브라우저 기반 스캐너는 Chrome DevTools Protocol을 사용하여 Chromium 브라우저를 조정합니다. DevTools 메시지를 기록하는 것은 브라우저의 작업 내용을 투명하게 확인하는 데 도움이 됩니다. 예를 들어 버튼을 선택해도 작동하지 않는 경우, DevTools 메시지에 원인이 브라우저 콘솔 로그에 CORS 오류로 표시될 수 있습니다. DevTools 메시지를 포함하는 로그는 매우 크기가 클 수 있습니다. 따라서 짧은 기간의 작업에서만 활성화해야 합니다.

모든 DevTools 메시지를 로깅하려면 CHROM 로그 모듈을 trace로 전환하고 로깅 수준을 구성하면 됩니다. 다음은 DevTools 로그의 예입니다:

2022-12-05T06:27:24.280 TRC CHROM event received    {"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 request sent      {"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 response received {"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 프로세스의 STDOUTSTDERR을 로그로 기록하는 것이 도움이 될 수 있습니다. 환경 변수 DAST_BROWSER_LOG_CHROMIUM_OUTPUTtrue로 설정하면 이 목적을 달성할 수 있습니다.

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가 스캔 실패를 유발할 수 있는 응답을 차단합니다. 이 제약은 스캔 중 메모리 소비를 줄이기 위한 것입니다.

아래는 예시 로그인데, https://example.com/large.js에서 발견된 JavaScript 파일의 크기가 제한을 초과하여 DAST가 차단한 것입니다:

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"