문제 해결

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

뭔가 잘못될 때

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

그렇지 않으면 다음 질문에 답하여 문제를 해결하려고 시도하세요:

예상 결과는 무엇입니까?

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

가능한 한 문제를 격리하여 해결책을 좁히는 데 도움이 되는지 확인하세요. 예를 들어 DAST가 특정 페이지를 스캔하지 않는 상황에서 어디에서 해당 페이지를 찾아야 했나요? 그곳으로 가기 위해 어떤 경로를 따랐습니까? 참조 페이지에는 DAST가 선택해야 하는 요소가 있었지만 선택하지 않았나요?

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

사람이 매뉴얼으로 애플리케이션을 탐색할 수 없다면 DAST도 해당 애플리케이션을 스캔할 수 없습니다.

기대하는 결과를 알면 브라우저를 사용하여 직접 매뉴얼으로 복제하려고 노력하세요. 예를 들어:

  • 개인 브라우저 창을 엽니다.
  • 개발자 도구를 엽니다. 콘솔에서 오류 메시지를 확인하세요.
    • Chrome: 보기 -> 개발 -> 개발자 도구
    • Firefox: 도구 -> 브라우저 도구 -> 웹 개발자 도구
  • 인증이 필요한 경우:
    • DAST_AUTH_URL로 이동합니다.
    • DAST_AUTH_USERNAMEDAST_AUTH_USERNAME_FIELD에 입력합니다.
    • DAST_AUTH_PASSWORDDAST_AUTH_PASSWORD_FIELD에 입력합니다.
    • DAST_AUTH_SUBMIT_FIELD를 선택합니다.
  • 링크를 선택하고 양식을 작성하세요. 올바르게 스캔되지 않는 페이지로 이동하세요.
  • 애플리케이션이 어떻게 동작하는지 관찰하세요. 자동화된 스캐너에 문제를 일으킬 수 있는 요소가 있는지 주목하세요.

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

DAST는 다음 경우에 올바르게 스캔할 수 없습니다:

  • CAPTCHA가 있는 경우. 스캔 대상 애플리케이션의 테스트 환경에서 이를 해제하세요.
  • 대상 애플리케이션에 대한 액세스 권한이 없는 경우. DAST 구성에 사용된 URL을 통해 GitLab 러너가 애플리케이션에 액세스할 수 있도록 확인하세요.

귀하의 애플리케이션은 어떻게 작동합니까?

귀하의 애플리케이션이 어떻게 작동하는지 이해하는 것은 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으로 로깅합니다.

로그 레벨

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

로그 모듈 컴포넌트 개요 자세히 보기
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 활성 검사를 실행할 때 대상 애플리케이션에 전송되는 메시지를 기록하는 데 사용됩니다.

예제 - 크롤링된 경로 로그

스캔의 크롤 단계 중에 발견된 탐색 경로를 로깅하려면 로그 모듈 ‘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 로깅

caution
DevTools 메시지를 로깅하는 것은 보안 리스크입니다. 출력에는 사용자 이름, 비밀번호 및 인증 토큰과 같은 비밀이 포함될 수 있습니다. 출력은 GitLab 서버에 업로드되어 작업 로그에서 볼 수 있습니다.

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_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 로그

Chromium이 충돌하는 경우 드물지만 Chromium 프로세스의 표준 출력 및 표준 오류를 로깅하는 것은 도움이 될 수 있습니다. 환경 변수 DAST_LOG_BROWSER_OUTPUTtrue로 설정하면 이 목적을 달성할 수 있습니다.

DAST는 많은 Chromium 프로세스를 시작하고 중지합니다. 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가 응답을 차단하여 스캔이 실패할 수 있습니다. 이 제약은 스캔 중 메모리 소비를 줄이기 위한 것입니다.

다음은 JavaScript 파일의 크기가 제한을 초과하여 발견된 https://example.com/large.js의 경우 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_PAGE_MAX_RESPONSE_SIZE_MB를 사용하여 변경할 수 있습니다. 예를 들어,

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

dast:
  variables:
    DAST_PAGE_MAX_RESPONSE_SIZE_MB: "25"