문제 해결

다음 문제 해결 시나리오들은 고객 지원 사례에서 수집되었습니다. 여기에 언급되지 않은 문제가 발생하거나 여기 있는 정보가 문제를 해결하지 못하는 경우, 고객 지원 티켓을 생성하세요. 자세한 내용은 GitLab 지원 페이지를 참조하세요.

뭔가 잘못될 때

DAST 스캔에 문제가 발생하면 특정 오류 메시지를 가지고 있다면 알려진 문제를 확인하세요.

그렇지 않은 경우, 다음 질문에 대답하여 문제를 발견하려고 노력하세요:

기대되는 결과는 무엇인가요?

DAST 스캔에 문제가 있는 사용자들은 스캐너가 작업해야 한다고 생각하는 전반적인 아이디어를 가지고 있습니다. 예를 들어, 특정 페이지를 스캔하지 않거나 페이지의 버튼을 선택하지 않는 등의 문제가 있습니다.

가능한 한 문제를 격리하여 솔루션을 찾는 데 도움이 되도록 노력하세요. 예를 들어, DAST가 특정 페이지를 스캔하지 않는 상황을 가정해보겠습니다. DAST는 해당 페이지를 어디에서 찾아야 했나요? 어떤 경로로 그곳에 도달했나요? 참조 페이지에서 DAST가 선택해야 했지만 선택하지 않은 요소가 있었나요?

결과는 사람에 의해 달성 가능한가요?

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

기대하는 결과를 알고, 브라우저에서 기계적으로 직접 시도해 보세요. 예를 들어:

  • 새 시크릿(시크릿 모드) 브라우저 창을 엽니다.
  • 개발자 도구를 엽니다. 오류 메시지를 확인하세요.
    • Chrome: 보기 -> 개발자 -> 개발자 도구
    • Firefox: 도구 -> 브라우저 도구 -> 웹 개발자 도구
  • 인증하는 경우:
    • DAST_AUTH_URL로 이동합니다.
    • DAST_AUTH_USERNAME_FIELDDAST_AUTH_USERNAME을 입력합니다.
    • DAST_AUTH_PASSWORD_FIELDDAST_AUTH_PASSWORD을 입력합니다.
    • DAST_AUTH_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]"

로그 목적지

로그는 파일로 전송될 수도 있고 콘솔(컨테이너 상에서의 CI/CD 작업 로그)로 전송될 수도 있습니다. 각 목적지를 포함하여 다른 로그를 수용하도록 환경 변수 DAST_LOG_CONFIG(콘솔 로그에 대해)와 DAST_LOG_FILE_CONFIG(파일 로그에 대해)를 구성할 수 있습니다.

예:

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

dast:
  variables:
    DAST_BROWSER_SCAN: "true"
    DAST_LOG_CONFIG: "auth:debug"                               # 콘솔 로그는 기본적으로 INFO 수준이며, AUTH 모듈을 DEBUG 수준으로 로깅함
    DAST_LOG_FILE_CONFIG: "loglevel:debug,cache:warn"           # 파일 로그는 기본적으로 DEBUG 수준이며, CACHE 모듈을 WARN 수준으로 로깅함

기본적으로 파일 로그는 gl-dast-scan.log라는 작업 artifact입니다. 이 경로를 구성하려면 CI/CD 변수 DAST_LOG_FILE_PATH를 수정하세요.

로그 수준

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

로그 모듈 구성 요약 상세
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 활성 검사를 실행하는 동안 대상 응용 프로그램으로 전송된 메시지를 기록하는 데 사용됨.
SCOPE 범위 관리와 관련된 메시지를 기록하는 데 사용됨.

예제 - 크롤된 경로 로깅

크롤 단계에서 발견된 네비게이션 경로를 기록하려면 CRAWL 로그 모듈을 DEBUG로 설정합니다. 이것은 DAST가 대상 응용 프로그램을 올바르게 크롤하고 있는지 이해하는 데 유용합니다.

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

dast:
  variables:
    DAST_LOG_CONFIG: "crawl:debug"

예를 들어, 다음 출력은 https://example.com의 페이지 크롤 중 발견된 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_LOG_DEVTOOLS_CONFIG는 로깅 구성의 세미콜론으로 구분된 목록을 허용합니다. 로깅 구성은 [도메인/메시지]:[무엇을 기록할지][,truncate:[최대 메시지 크기]] 구조를 사용하여 선언됩니다.

  • 도메인/메시지는 무엇을 로깅하는지를 참조합니다.
    • 기본(Default)은 모든 도메인과 메시지를 나타내는 값으로 사용할 수 있습니다.
    • 도메인일 수 있으며, 예를 들어 Browser, CSS, Page, Network가 있습니다.
    • 메시지가 포함된 도메인일 수 있으며, 예를 들어 Network.responseReceived가 있습니다.
    • 여러 구성이 적용되는 경우 가장 구체적인 구성이 사용됩니다.
  • 무엇을 기록할지는 로깅을 할지 여부와 내용을 참조합니다.
    • message는 메시지가 수신되었음을 기록하며 메시지 내용을 기록하지 않습니다.
    • messageAndBody는 메시지와 메시지 내용을 기록합니다. truncate와 함께 사용하는 것이 권장됩니다.
    • suppress는 메시지를 기록하지 않습니다. 소음이 많은 도메인 및 메시지를 침묵시키는 데 사용됩니다.
  • truncate는 인쇄된 메시지의 크기를 제한하는 선택적 구성입니다.

예제 - 모든 DevTools 메시지 기록

어디서부터 시작해야 할지 확신이 없을 때 모든 것을 기록하는 데 사용됩니다.

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

dast:
  variables:
    DAST_LOG_FILE_CONFIG: "chrom:trace"
    DAST_LOG_DEVTOOLS_CONFIG: "Default:messageAndBody,truncate:2000"

예제 - HTTP 메시지 기록

자원이 올바르게 로드되지 않을 때 유용합니다. HTTP 메시지 이벤트가 기록되며, 요청을 계속할지 실패할지에 대한 결정도 기록됩니다. 브라우저 콘솔의 모든 오류도 기록됩니다.

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

dast:
  variables:
    DAST_LOG_FILE_CONFIG: "chrom:trace"
    DAST_LOG_DEVTOOLS_CONFIG: "Default:suppress;Fetch:messageAndBody,truncate:2000;Network:messageAndBody,truncate:2000;Log:messageAndBody,truncate:2000;Console:messageAndBody,truncate:2000"

Chromium 로그

크로미움이 충돌하는 드문 경우에 크로미움 프로세스의 STDOUTSTDERR를 기록하는 것이 도움이 될 수 있습니다. 환경 변수 DAST_LOG_BROWSER_OUTPUTtrue로 설정하면 이 목적을 달성할 수 있습니다.

DAST는 많은 크로미움 프로세스를 시작하고 중지합니다. DAST는 각 프로세스 출력을 모든 로그 대상으로 보내며, 로그 모듈 LEASE와 로그 레벨 INFO로 설정합니다.

예를 들어:

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

dast:
  variables:
    DAST_LOG_BROWSER_OUTPUT: "true"

알려진 문제

로그에 response body exceeds allowed size 포함

기본적으로 DAST는 HTTP 응답 본문이 10MB 이하인 HTTP 요청을 처리합니다. 그렇지 않은 경우, DAST는 스캔이 실패할 수 있는 응답을 차단합니다. 이 제약은 스캔 중 메모리 소비를 줄이기 위한 것입니다.

예를 들어, DAST가 https://example.com/large.js에서 찾은 JavaScript 파일의 크기가 한도를 초과하여 차단한 예제 로그는 다음과 같습니다:

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_PAGE_MAX_RESPONSE_SIZE_MB 구성을 사용하여 변경할 수 있습니다. 예를 들어,

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

dast:
  variables:
    DAST_PAGE_MAX_RESPONSE_SIZE_MB: "25"

크롤러가 예상한 페이지에 도달하지 못함

DAST가 응용 프로그램 페이지를 잘못 캐시하면 DAST가 응용 프로그램을 제대로 크롤하지 못할 수 있습니다. 크롤러가 예상대로 페이지를 찾지 못하는 경우, DAST_USE_CACHE: "false" 변수를 설정하여 도움이 되는지 확인해보세요. 캐시를 비활성화하는 것은 스캔의 성능을 크게 저하시킬 수 있음에 유의하시기 바랍니다. 반드시 필요할 때에만 캐시를 비활성화하도록 하세요. 구독권이 있는 경우, 지원 티켓을 생성하여 캐시가 웹사이트 크롤링을 방해하는 이유를 조사하도록 하세요.