보안 스캐너 통합

GitLab에 보안 스캐너를 통합하는 것은 사용자에게 CI/CD 작업 정의를 제공하는 것으로 구성됩니다. 이를 통해 사용자들은 GitLab 프로젝트를 스캔하기 위해 CI/CD 구성 파일에 추가할 수 있습니다. 그런 다음이 작업은 GitLab에서 지정한 형식으로 결과를 출력해야 합니다. 이러한 결과는 자동으로 파이프라인 뷰, 병합 요청 위젯 및 보안 대시보드와 같은 다양한 위치에서 GitLab에 자동으로 표시됩니다.

스캔 작업은 보통 도커 이미지를 기반으로 하며, 스캐너 및 해당 종속성을 자체 포함하는 환경에서 작동합니다.

이 페이지에서는 보안 스캐너를 구현하는 CI/CD 작업을 작성하는 데 필요한 요구 사항과 지침, 및 Docker 이미지에 대한 요구 사항 및 지침을 문서화합니다.

작업 정의

이 섹션에서는 보안 스캐너의 작업 정의 파일에 추가해야 하는 여러 중요한 필드를 설명합니다. 이와 관련된 전체 문서는 CI 문서에서 볼 수 있습니다.

이름

일관성을 유지하기 위해 스캔 작업은 일반적으로 스캐너 이름으로 명명되며, 소문자로 표기됩니다. 작업 이름은 스캔 유형 뒤에 접미사가 붙습니다:

  • _dependency_scanning
  • _container_scanning
  • _dast
  • _sast

예를 들어, “MySec” 스캐너를 기반으로 한 의존성 스캐닝 작업은 mysec_dependency_scanning로 명명됩니다.

이미지

image 키워드는 보안 스캐너를 포함하는 Docker 이미지를 지정하는 데 사용됩니다.

스크립트

script 키워드는 스캐너를 실행하는 명령을 지정하는 데 사용됩니다. script 항목은 비워둘 수 없기 때문에 스캔을 수행하는 명령으로 설정해야 합니다. 스캔을 실행하기 위해 미리 정의된 도커 이미지의 ENTRYPOINTCMD를 전달하지 않고 자동으로 수행할 수는 없습니다.

before_script 는 사용자가 스캔을 수행하기 전에 프로젝트를 준비하는 데에 의존할 수 있기 때문에 작업 정의에서 사용해서는 안됩니다. 예를 들어, SAST 또는 의존성 스캐닝을 수행하기 전에 특정 프로젝트가 필요로 하는 시스템 라이브러리를 설치하는 데 before_script를 사용하는 것이 일반적입니다.

마찬가지로, 작업 정의에서는 after_script 를 사용해서는 안됩니다. 왜냐하면 사용자에 의해 재정의될 수 있기 때문입니다.

단계

일관성을 유지하기 위해, 스캔 작업은 가능한 경우 test 단계에 속해야 합니다. stage 키워드는 test가 기본값이기 때문에 생략될 수 있습니다.

실패 안전

GitLab 보안 이상론에 맞추기 위해, 스캔 작업은 파이프라인이 실패하는 것을 방해해서는 안 되기 때문에, allow_failure 매개변수는 true로 설정해야 합니다.

아티팩트

스캔 작업은 수행하는 스캔 유형에 해당하는 보고서를 선언해야 하며, artifacts:reports 키워드를 사용합니다. 유효한 보고서는 다음과 같습니다:

  • dependency_scanning
  • container_scanning
  • dast
  • api_fuzzing
  • coverage_fuzzing
  • sast

예를 들어, gl-sast-report.json라는 파일을 생성하고 SAST 보고서로 업로드하는 SAST 작업의 정의는 다음과 같습니다:

mysec_sast:
  image: registry.gitlab.com/secure/mysec
  artifacts:
    reports:
      sast: gl-sast-report.json

gl-sast-report.json은 예시 파일 경로이지만 다른 파일 이름을 사용할 수 있습니다. 자세한 내용은 출력 파일 섹션을 참조하십시오. 이 파일은 작업 정의에서 reports:sast 키 아래에 선언되었기 때문에 SAST 보고서로 처리됩니다. 파일 이름 때문이 아닙니다.

정책

AutoDevOps와 같은 특정 GitLab 워크플로우는 해당 스캔을 비활성화해야 하는지를 나타내는 CI/CD 변수를 정의합니다. 이것을 확인하기 위해 다음과 같은 변수들을 확인할 수 있습니다:

  • DEPENDENCY_SCANNING_DISABLED
  • CONTAINER_SCANNING_DISABLED
  • SAST_DISABLED
  • DAST_DISABLED

스캐너 유형에 따라 적절하다면 사용자 정의 스캐너 실행을 비활성화해야 합니다.

또한, GitLab은 리포지토리 내의 언어 목록을 제공하는 CI_PROJECT_REPOSITORY_LANGUAGES 변수를 정의합니다. 이 값에 따라 스캐너가 다르게 동작할 수도 있고 그렇지 않을 수도 있습니다. 언어 감지는 현재 linguist Ruby gem에 의존합니다. 사전 정의된 CI/CD 변수를 참조하십시오.

정책 확인 예

이 예제는 프로젝트 저장소에 Java 소스 코드가 포함되어 있고 dependency_scanning 기능이 활성화된 경우에만 사용자 정의 Dependency Scanning 작업 mysec_dependency_scanning을 건너뛰는 방법을 보여줍니다:

mysec_dependency_scanning:
  rules:
    - if: $DEPENDENCY_SCANNING_DISABLED == 'true'
      when: never
    - if: $GITLAB_FEATURES =~ /\bdependency_scanning\b/
      exists:
        - '**/*.java'

사용자는 필요에 따라 기존 정책으로 스캐닝 작업을 트리거하지 않아야 합니다. 예를 들어, 특정 브랜치나 특정 파일 집합이 변경될 때 스캐닝 작업이 트리거되지 않아야 합니다.

도커 이미지

도커 이미지는 스캐너와 해당 스캐너가 의존하는 모든 라이브러리와 도구를 결합한 자체 포함 환경입니다. 스캐너를 도커 이미지로 패키징하면 의존성과 구성이 개별 머신에서 스캐너가 실행되더라도 항상 유지됩니다.

이미지 크기

CI 인프라에 따라 CI가 작업을 실행할 때마다 도커 이미지를 가져와야 할 수 있습니다. 스캐닝 작업이 빠르게 실행되고 대역폭이 낭비되지 않도록 하려면 도커 이미지를 가능한 작게 유지해야 합니다. 가능한 경우 50MB 이하를 목표로 설정해야 합니다. 그렇지 않을 경우 DVD-ROM 크기인 1.46GB 미만으로 유지해야 합니다.

스캐너가 완전히 기능하는 Linux 환경이 필요한 경우, Debian “slim” 배포판이나 Alpine Linux를 사용하는 것이 좋습니다. 가능한 경우 FROM scratch 지시문을 사용하여 이미지를 처음부터 빌드하고 필요한 모든 라이브러리로 스캐너를 컴파일하는 것이 좋습니다. 다중 단계 빌드도 이미지 크기를 작게 유지하는 데 도움이 될 수 있습니다.

이미지 크기를 작게 유지하려면 dive를 사용하여 도커 이미지의 레이어를 분석하고 추가적인 부피가 어디에서 발생할 수 있는지 식별할 수 있습니다.

일부 경우에는 이미지에서 파일을 제거하기 어렵습니다. 이런 경우 Zstandard를 사용하여 파일이나 큰 디렉터리를 압축하는 것을 고려해보세요. Zstandard는 압축 수준을 많이 제공하여 압축을 해제하는 속도에 거의 영향을 주지 않으면서 이미지 크기를 줄일 수 있습니다. 이미지가 시작되자마자 압축된 디렉토리를 자동으로 압축 해제하기도 도움이 됩니다. 이런 경우 Docker 이미지의 /etc/bashrc나 특정 사용자의 $HOME/.bashrc에 단계를 추가해야 합니다. 후자의 옵션을 선택한 경우 bash 로그인 셸을 시작하도록 진입점을 변경해야 합니다.

시작하기 위한 몇 가지 예시입니다: - https://gitlab.com/gitlab-org/security-products/license-management/-/blob/0b976fcffe0a9b8e80587adb076bcdf279c9331c/config/install.sh#L168-170 - https://gitlab.com/gitlab-org/security-products/license-management/-/blob/0b976fcffe0a9b8e80587adb076bcdf279c9331c/config/.bashrc#L49

이미지 태그

Docker 공식 이미지 프로젝트에 기록된 대로, 버전 번호 태그에 별칭을 지정하는 것이 강력하게 권장됩니다. 이를 통해 사용자가 특정 시리즈의 “가장 최신” 릴리스를 쉽게 참조할 수 있습니다. 또한 Docker 태깅: Docker 이미지를 태깅하고 버전을 지정하는 최상의 방법를 참조하세요.

명령 줄

스캐너는 환경 변수를 입력으로 받는 명령행 도구로, 작업 정의에 따라 보고서로 업로드되는 파일을 생성합니다. 또한 표준 출력 및 표준 오류 스트림의 텍스트 출력을 생성하고 상태 코드로 종료합니다.

변수

모든 CI/CD 변수는 환경 변수로 스캐너에 전달됩니다. 스캔된 프로젝트는 미리 정의된 CI/CD 변수에 의해 설명됩니다.

SAST 및 의존성 스캔

SAST 및 의존성 스캔 스캐너는 CI_PROJECT_DIR CI/CD 변수로 지정된 프로젝트 디렉터리에 있는 파일을 스캔해야 합니다.

컨테이너 스캔

GitLab을 위한 공식 컨테이너 스캐닝과 일관성을 유지하기 위해, 스캐너는 CI_APPLICATION_REPOSITORYCI_APPLICATION_TAG로 지정된 도커 이미지를 스캔해야 합니다. 만약 DOCKER_IMAGE CI/CD 변수가 제공된 경우, CI_APPLICATION_REPOSITORYCI_APPLICATION_TAG 변수는 무시되고, 대신 DOCKER_IMAGE 변수에서 지정된 이미지가 스캔되어야 합니다.

제공되지 않은 경우, CI_APPLICATION_REPOSITORY는 기본값으로 $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG을 가져야 합니다. 이는 미리 정의된 CI/CD 변수의 조합입니다. CI_APPLICATION_TAGCI_COMMIT_SHA로 기본값을 가져야 합니다.

스캐너는 도커 레지스트리에 로그인해야 합니다. 이를 위해 DOCKER_USERDOCKER_PASSWORD 변수를 사용해야 합니다. 만약 이들이 정의되지 않았다면, 스캐너는 기본값으로 CI_REGISTRY_USERCI_REGISTRY_PASSWORD를 사용해야 합니다.

구성 파일

스캐너는 CI_PROJECT_DIR을 사용하여 특정 구성 파일을 로드할 수 있지만, 파일이 아닌 CI/CD 변수로 구성을 노출하는 것이 좋습니다.

출력 파일

스캐너에 의해 생성된 Secure 보고서는 GitLab CI/CD에 업로드된 다른 artifact와 마찬가지로 프로젝트 디렉토리에 작성되어야 합니다. 이는 CI_PROJECT_DIR CI/CD 변수로 지정됩니다.

추천하는 규칙은 스캐닝 유형에 따라 출력 파일의 이름을 지정하고 gl-을 접두어로 사용하는 것입니다. 모든 Secure 보고서가 JSON 파일이므로 파일 확장자로 .json을 사용하는 것이 좋습니다. 예를 들어, Dependency Scanning 보고서의 제안된 파일 이름은 gl-dependency-scanning.json입니다.

작업 정의의 artifacts:reports 키워드는 보안 보고서가 작성된 파일 경로와 일관성을 유지해야 합니다. 예를 들어, Dependency Scanning 분석기가 보고서를 CI 프로젝트 디렉토리에 작성하고 이 보고서의 파일 이름이 depscan.json인 경우, artifacts:reports:dependency_scanningdepscan.json으로 설정되어야 합니다.

종료 코드

POSIX 종료 코드 표준을 따르면, 스캐너는 성공한 경우 0 또는 실패한 경우 1로 종료됩니다. 성공은 취약점을 발견한 경우도 포함됩니다.

CI 작업이 실패하면 GitLab에서 보안 보고서 결과가 수용되지 않습니다. 심지어 작업이 실패를 허용하더라도 말이죠. 그러나 보고서 artifact는 GitLab에 업로드되어 있으며 파이프라인 보안 탭에서 다운로드할 수 있습니다.

로깅

스캐너는 오류 메시지와 경고를 로깅하여 사용자가 CI 스캔 작업 로그를 확인함으로써 구성 오류 및 통합 문제를 쉽게 조사할 수 있어야 합니다.

스캐너는 ANSI 이스케이프 코드를 사용하여 Unix 표준 출력 및 표준 오류 스트림에 작성하는 메시지에 색상을 입히는 경우가 있습니다. 우리는 오류를 나타내기 위해 빨강, 경고를 나타내기 위해 노랑, 공지를 나타내기 위해 초록을 사용하는 것을 권장합니다. 또한 오류 메시지에는 [ERRO], 경고에는 [WARN], 공지에는 [INFO]를 접두어로 사용하는 것을 권장합니다.

로깅 레벨

스캐너는 로그 레벨이 SECURE_LOG_LEVEL CI/CD 변수에서 설정된 로그 레벨보다 낮은 경우 로그 메시지를 걸러내야 합니다. 예를 들어, infowarn 메시지는 SECURE_LOG_LEVELerror로 설정된 경우 건너뛰어져야 합니다. 가능한 값은 다음과 같습니다(높은 것부터 낮은 것까지 나열됨):

  • fatal
  • error
  • warn
  • info
  • debug

디버깅에 유용한 자세한 로깅을 위해 debug 레벨을 사용하는 것이 좋습니다. SECURE_LOG_LEVEL의 기본값은 info로 설정해야 합니다.

명령줄을 실행할 때, 스캐너는 명령줄과 해당 출력을 로깅하기 위해 debug 레벨을 사용해야 합니다. 명령줄이 실패하는 경우, 해당 명령은 error 로그 레벨로 기록되어야 합니다. 이렇게 하면 로그 레벨을 debug로 변경하지 않고도 스캔 작업을 다시 실행해 디버깅할 수 있습니다.

일반적인 logutil 패키지

만약 gocommon을 사용 중이라면 Logruscommon의 logutil 패키지 를 구성하기 위해 Logrus와 함께 common의 logutil README를 사용하는 것이 좋습니다.

보고서

보고서는 취약점과 가능한 개선 사항을 결합한 JSON 문서입니다.

이 문서는 보고서 JSON 형식, 권장 사항 및 필드 설정에 대한 설명과 예제를 제공하여 통합자가 필드를 설정하는 데 도움을 주는 개요를 제공합니다. 이 형식은 SAST, DAST, Dependency Scanning, Container Scanning의 문서에서 상세히 설명되어 있습니다.

이러한 스캐너의 스키마는 다음에서 찾을 수 있습니다:

보고서 유효성 검사

보고서를 생성기에 의해 선언된 스키마 버전에 대한 유효성 검사를 통과해야 합니다. 유효성 검사에 통과하지 못한 보고서는 GitLab에서 수용되지 않으며, 해당 파이프라인에 오류 메시지가 표시됩니다.

보안 보고서 스키마의 사용이 중단된 버전을 사용하는 보고서는 수용되지만 해당 파이프라인에 경고 메시지가 표시됩니다. 이 경고를 보게 되면 분석기를 최신 사용 가능한 스키마를 사용하도록 업데이트하세요.

스키마 버전에 대한 사용 중단 기간 이후에는 파일이 GitLab에서 제거됩니다. 제거된 버전을 선언하는 보고서는 거부되며 해당 파이프라인에 오류 메시지가 표시됩니다.

PATCH 버전을 사용하는 보고서가 vendored 스키마 버전과 일치하지 않는 경우, 해당 보고서는 최신 vendored PATCH 버전에 대해 유효성이 검사됩니다. 예를 들어, 보고서 버전이 15.0.23이고 최신 vendored 버전이 15.0.6이면 보고서는 버전 15.0.6에 대해 유효성이 검사됩니다.

GitLab은 유효성 검사를 수행하기 위해 json_schemer gem을 사용합니다.

보고서 유효성에 대한 계속적인 개선은 이 Epic에서 추적됩니다. 한편에서 지원되는 버전은 소스 코드에서 확인할 수 있습니다. 인스턴스에 적합한 버전을 선택해야 합니다. 예를 들어, v15.7.3-ee을 선택하세요.

로컬에서 유효성 검사

GitLab에서 분석기를 실행하기 전에 분석기에 의해 생성된 보고서가 선언된 스키마 버전과 일치하는지 확인하기 위해 보고서를 유효성 검사해야 합니다.

아래 스크립트를 사용하여 주어진 스키마에 대해 JSON 파일을 유효성 검사하세요.

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'json_schemer'
end

require 'json'
require 'pathname'

raise 'Usage: ruby script.rb <security schema filename> <report filename>' unless ARGV.size == 2

schema = JSONSchemer.schema(Pathname.new(ARGV[0]))
report = JSON.parse(File.open(ARGV[1]).read)
schema_validation_errors = schema.validate(report).map { |error| JSONSchemer::Errors.pretty(error) }
puts(schema_validation_errors)
  1. 보고서 유형과 선언된 버전과 일치하는 적절한 스키마를 다운로드하세요. 예를 들어, 버전 15.0.6container_scanning 보고서 스키마를 다음 위치에서 찾을 수 있습니다: https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/v15.0.6/dist/container-scanning-report-format.json?inline=false.
  2. 위의 루비 스크립트를 validate.rb와 같은 파일에 저장하세요.
  3. 스크립트를 실행하여 스키마와 보고서 파일 이름을 차례대로 인수로 전달하세요. 예를 들어:
    1. 로컬 Ruby 인터프리터를 사용하는 경우: ruby validate.rb container-scanning-format_15-0-6.json gl-container-scanning-report.json.
    2. Docker를 사용하는 경우: docker run -it --rm -v $(pwd):/ci ruby:3 ruby /ci/validate.rb /ci/container-scanning-format_15-0-6.json /ci/gl-container-scanning-report.json
  4. 유효성 검사 오류가 화면에 표시됩니다. 이러한 오류를 해결해야만 GitLab이 보고서를 수용할 수 있습니다.

보고서 필드

버전

이 필드는 사용 중인 보안 보고서 스키마 버전을 지정합니다. 사용할 버전에 대한 정보는 릴리스에서 확인하세요.

GitLab 14.10 이상에서는 GitLab이 이 값을 통해 보고서를 해당 스키마 버전에 대해 유효성을 검사합니다. GitLab에서 지원하는 버전은 gitlab/ee/lib/ee/gitlab/ci/parsers/security/validators/schemas에서 찾을 수 있습니다.

취약점

보고서의 vulnerabilities 필드는 취약점 객체의 배열입니다.

ID

id 필드는 취약점의 고유 식별자입니다. 대응 객체에서 수정된 취약점을 참조하는 데 사용됩니다. UUID를 생성하고 id 필드의 값으로 사용하는 것을 권장합니다.

카테고리

category 필드의 값은 보고서 유형과 일치합니다:

  • dependency_scanning
  • container_scanning
  • sast
  • dast
스캔

scan 필드는 스캔 자체에 대한 메타 정보를 포함하는 개체입니다. 스캔을 수행한 analyzerscanner, 스캔이 실행된 start_timeend_time, 스캔의 status(“success” 또는 “failure”) 등이 포함됩니다.

analyzerscanner 필드 모두 사람이 읽을 수 있는 name과 기술적인 id를 포함하는 개체입니다. id는 다른 통합자가 제공할 분석기 또는 스캐너와 충돌해서는 안 됩니다.

스캔 기본 식별자

scan.primary_identifiers 필드는 분석기가 스캔을 수행한 모든 규칙 집합의 완전한 목록을 포함하는 선택적인 필드입니다. 때로는 주어진 스캔의 취약점 배열이 비어 있더라도이 선택적인 필드에는 잠재적인 식별자의 완전한 목록이 포함되어야 합니다. 이를 통해 기존에 감지된 취약점이 더 이상 관련이 없음을 자동으로 해결할 수 있습니다.

이름, 메시지 및 설명

namemessage 필드에는 취약점에 대한 간단한 설명이 포함됩니다. description 필드에는 더 많은 세부 정보가 제공됩니다.

name 필드는 문맥에 구애받지 않으며 취약점이 발견된 위치에 대한 정보를 포함하지 않습니다. 반면 message는 위치를 반복할 수 있습니다.

시각적으로 보여주기 위해 다음 이미지는 파이프라인 뷰의 일환으로 취약점을 볼 때 이러한 필드가 사용되는 위치를 강조했습니다.

취약점 예시

예를 들어, 의존성 스캔으로 보고된 취약점의 message는 취약한 종속성에 대한 정보를 제공하는데, 이는 취약점의 location 필드와 중복됩니다. name 필드가 우선되지만 문맥/위치를 취약점의 제목에서 제거할 수 없을 때 message 필드가 사용됩니다.

예를 들어, 다음은 의존성 스캔 스캐너에서 보고된 취약점 객체의 예시이며 messagelocation 필드를 반복하는 것을 보여줍니다:

{
    "location": {
        "dependency": {
            "package": {
            "name": "debug"
          }
        }
    },
    "name": "정규 표현식 거부 서비스",
    "message": "debug에서 정규 표현식 거부 서비스",
    "description": "debug 모듈은 신뢰할 수 없는 사용자 입력이 `o` 포매터에 전달될 때 정규 표현식 거부 서비스에 취약합니다.
        이는 2초 동안 차단하는 데 약 50,000자가 걸리므로 이는 낮은 심각도의 문제입니다."
}

description은 취약점이 작동하는 방식을 설명하거나 악용에 대한 문맥을 제공할 수 있습니다. 이는 다른 취약점 객체의 필드를 반복해서는 안 되며 특히 description에서는 location(영향을 받는 대상)이나 solution(리스크를 완화하는 방법)을 반복해서는 안 됩니다.

솔루션

solution 필드를 사용하여 식별된 취약점을 고치거나 리스크를 완화하는 방법에 대해 사용자에게 지시할 수 있습니다. 최종 사용자는 이 필드와 상호 작용하고 GitLab은 자동으로 remediations 개체를 처리합니다.

식별자

identifiers 배열은 감지된 취약점을 설명합니다. 식별자 개체의 typevalue 필드는 두 개체가 동일한지 여부를 알려주는 데 사용됩니다. 사용자 인터페이스에서는 개체의 nameurl 필드가 식별자를 표시하는 데 사용됩니다.

GitLab 스캐너가 이미 정의한 식별자를 사용하는 것이 좋습니다:

식별자 유형 예시 값
CVE cve CVE-2019-10086
CWE cwe CWE-1026
ELSA elsa ELSA-2020-0085
OSVD osvdb OSVDB-113928
OWASP owasp A01:2021–Broken Access Control Design
RHSA rhsa RHSA-2020:0111
USN usn USN-4234-1
WASC wasc WASC-19

위에 나열된 일반적인 식별자는 GitLab이 유지 관리하는 분석기 중 일부에서 공유하는 공통 라이브러리에 정의되어 있습니다. 필요한 경우 새로운 일반적인 식별자를 기여할 수 있습니다. 분석기는 공통 라이브러리에 속하지 않는 벤더별이나 제품별 식별자를 생성할 수도 있습니다.

identifiers 배열의 첫 번째 항목은 기본 식별자라고 하며, 새 커밋이 저장소에 푸시됨에 따라 새로운 취약점을 추적하는 데 사용됩니다.

모든 취약점이 CVE를 가지고 있지는 않으며, CVE는 여러 번 식별될 수 있습니다. 결과적으로 CVE는 안정적인 식별자가 아니며 취약점을 추적할 때 이를 가정해서는 안 됩니다.

취약점에 대한 식별자의 최대 수는 20으로 설정되어 있습니다. 취약점에 20개 이상의 식별자가 있는 경우 시스템은 그 중 처음 20개만 저장합니다. 파이프라인 보안 탭의 취약점은 이 한도를 적용하지 않으며 보고서 artifact에 있는 모든 식별자가 표시됩니다.

세부 정보

details 필드는 취약점 정보를 보는 동안 표시되는 많은 다양한 콘텐츠 요소를 지원하는 객체입니다. 다양한 데이터 요소의 예시는 security-reports repository에서 확인할 수 있습니다.

위치

location은 취약점이 검출된 위치를 나타냅니다. 위치의 형식은 스캔 타입에 따라 다릅니다.

내부적으로 GitLab은 location의 일부 속성을 추출하여 위치 지문을 생성하여 새로운 커밋이 저장소에 푸시될 때 새로운 취약점을 추적하는 데 사용합니다. 위치 지문을 생성하는 데 사용되는 속성은 스캔 타입에 따라 다릅니다.

종속성 스캔

종속성 스캔 취약점의 locationdependencyfile로 구성됩니다. dependency 객체는 영향을 받는 package와 종속성 version을 설명합니다. package는 영향을 받는 라이브러리/모듈의 name을 내장합니다. file은 영향을 받는 종속성을 선언하는 종속성 파일의 경로입니다.

예를 들어, 여기에 handlebars의 버전 4.0.11을 영향을 주는 취약점의 location 객체가 있습니다: json { "file": "client/package.json", "dependency": { "package": { "name": "handlebars" }, "version": "4.0.11" } }

이 영향을 받는 종속성은 client/package.json에 나열되어 있으며, npm 또는 yarn에 의해 처리된 종속성 파일입니다.

종속성 스캔 취약점의 위치 지문은 file 및 패키지 name을 결합하여, 이러한 속성은 필수적입니다. 다른 모든 속성은 선택적입니다.

컨테이너 스캔

종속성 스캔과 유사하게, 컨테이너 스캔 취약점의 locationdependencyfile를 포함합니다. 또한 operating_system 필드도 있습니다.

예를 들어, 여기에 glib2.0의 버전 2.50.3-2+deb9u1을 영향을 주는 취약점의 location 객체가 있습니다: json { "dependency": { "package": { "name": "glib2.0" }, }, "version": "2.50.3-2+deb9u1", "operating_system": "debian:9", "image": "registry.gitlab.com/example/app:latest" }

영향을 받는 패키지는 registry.gitlab.com/example/app:latest Docker 이미지를 스캔할 때 발견됩니다. Docker 이미지는 debian:9 (Debian Stretch)를 기반으로 합니다.

컨테이너 스캔 취약점의 위치 지문은 operating_system 및 패키지 name을 결합하여, 이러한 속성은 필수적입니다. image 또한 필수적입니다. 다른 모든 속성은 선택적입니다.

SAST

SAST 취약점의 location은 영향을 받는 파일의 경로를 제공하는 file과 영향을 받는 라인 번호를 포함하는 start_line 필드가 있어야 합니다. end_line, class, method도 포함될 수 있습니다.

예를 들어, 여기에 com.gitlab.example.App.javasrc/main/java/com/gitlab/example/App.java 파일에서 com.gitlab.security_products.tests.App Java 클래스의 generateSecretToken 메서드에서 발견된 보안 결함의 location 객체가 있습니다: json { "file": "src/main/java/com/gitlab/example/App.java", "start_line": 41, "end_line": 41, "class": "com.gitlab.security_products.tests.App", "method": "generateSecretToken1" }

SAST 취약점의 위치 지문은 file, start_line, 및 end_line을 결합하여, 이러한 속성은 필수적입니다. 다른 모든 속성은 선택적입니다.

취약점 추적 및 병합

사용자는 취약점에 대한 피드백을 제공할 수 있습니다:

  • 그들은 자신의 프로젝트에 적용되지 않는다면 취약점을 해제할 수 있습니다
  • 위협 가능성이 있는 경우 취약점에 대한 이슈를 작성할 수 있습니다

GitLab은 새로운 Git 커밋이 저장소에 푸시될 때 사용자 피드백이 손실되지 않도록 취약점을 추적합니다. 취약점은 UUIDv5 다이제스트를 사용하여 추적되며, 이는 네 가지 속성의 SHA-1 해시로 생성됩니다:

현재 GitLab은 위치가 변경되면 새로운 Git 커밋이 푸시될 때 취약점을 추적할 수 없으며, 이로 인해 사용자 피드백이 손실됩니다. 예를 들어, SAST 취약점에 대한 사용자 피드백이 해당 파일의 이름이 변경되거나 영향을 받는 라인이 이동하면 손실됩니다. 이 문제는 issue #7586에서 다루어지고 있습니다.

또한 중복 처리 프로세스도 참조하세요.

심각도

severity 필드는 취약점이 소프트웨어에 어떤 심각한 영향을 미치는지를 설명합니다. 심각도는 보안 대시보드에서 취약점을 정렬하는 데 사용됩니다.

심각도는 Info에서 Critical까지 범위가 있지만, Unknown일 수도 있습니다. 유효한 값은 Unknown, Info, Low, Medium, High, 또는 Critical입니다.

Unknown 값은 실제 값이 결정하기 어려운 데이터를 의미합니다. 따라서 high, medium, 또는 low일 수 있으며 조사가 필요합니다. 현재 사용 가능한 SAST Analyzers 및 데이터에 대한 차트를 제공했습니다.

치료

보고서의 remediations 필드는 치료 개체의 배열입니다. 각 치료는 취약점 집합을 해결하기 위해 적용할 수 있는 패치를 설명합니다.

다음은 치료가 포함된 보고서의 예시입니다.

{
    "vulnerabilities": [
        {
            "category": "dependency_scanning",
            "name": "Regular Expression Denial of Service",
            "id": "123e4567-e89b-12d3-a456-426655440000",
            "solution": "Upgrade to new versions.",
            "scanner": {
                "id": "gemnasium",
                "name": "Gemnasium"
            },
            "identifiers": [
                {
                  "type": "gemnasium",
                  "name": "Gemnasium-642735a5-1425-428d-8d4e-3c854885a3c9",
                  "value": "642735a5-1425-428d-8d4e-3c854885a3c9"
                }
            ]
        }
    ],
    "remediations": [
        {
            "fixes": [
                {
                    "id": "123e4567-e89b-12d3-a456-426655440000"
                }
            ],
            "summary": "Upgrade to new version",
            "diff": "ZGlmZiAtLWdpdCBhL3lhcm4ubG9jayBiL3lhcm4ubG9jawppbmRleCAwZWNjOTJmLi43ZmE0NTU0IDEwMDY0NAotLS0gYS95Y=="
        }
    ]
}
요약

summary 필드는 취약점을 어떻게 해결할 수 있는지에 대한 개요입니다. 이 필드는 필수입니다.

해결된 취약점

fixes 필드는 치료로 해결된 취약점을 참조하는 객체의 배열입니다. fixes[].id에는 고정된 취약점의 고유 식별자가 포함되어 있습니다. 이 필드는 필수입니다.

Diff

diff 필드는 git apply와 호환되는 base64로 인코딩된 치료 코드 차이입니다. 이 필드는 필수입니다.