SAST 분석기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated
  • 이동함 GitLab Ultimate에서 13.3에서 GitLab Free로.

정적 응용 프로그램 보안 테스트(SAST)는 분석기를 사용하여 소스 코드의 취약점을 감지합니다. 각 분석기는 스캐너(제 3 자 코드 분석 도구)를 감싸는 래퍼입니다.

분석기는 SAST가 각 분석을 위해 전용 컨테이너를 시작하기 위해 사용하는 Docker 이미지로 발행됩니다. 분석기의 일관된 성능을 보장하기 위해 최소 4GB RAM을 권장합니다.

SAST의 기본 이미지는 GitLab에 의해 유지되지만, 사용자 정의 이미지를 통합할 수도 있습니다.

각 스캐너에 대해 분석기는 다음을 수행합니다:

  • 감지 로직 노출
  • 실행 처리
  • 표준 형식의 출력으로 변환

SAST 분석기

SAST는 다음의 공식 분석기를 지원합니다:

note
brakeman, flawfinder, nodejs-scan, phpcs-security-audit은 GitLab 16.9에서 폐기되었으며 17.0에서 제거 예정입니다. Semgrep 분석기가 그들의 대체로 제안됩니다.

SAST는 이전 버전에서 다른 분석기를 사용했습니다. 이러한 분석기는 지원 종료 상태에 도달했으며 업데이트를 받지 않습니다:

SAST 분석기 기능

분석기가 일반적으로 사용 가능하려면 다음 기능을 최소한 지원해야 합니다:

후 분석기

후 분석기는 분석기의 보고서 출력을 향상시킵니다. 후 분석기는 직접적으로 보고서 내용을 수정하지 않습니다. 대신 다음과 같은 추가 속성으로 결과를 향상시킵니다:

  • CWEs.
  • 위치 추적 필드.
  • 거짓 긍정 또는 미미한 결과를 식별하는 방법.
Tier: Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

Semgrep 기반 스캐닝으로 전환

SAST에는 Semgrep 기반 분석기가 포함되어 다중 언어를 커버합니다. GitLab은 분석기를 유지 관리하고 감지 규칙을 작성합니다.

만약 GitLab 관리 CI/CD 템플릿을 사용하면 Semgrep 기반 분석기가 다른 언어별 분석기와 함께 작동합니다. 그것은 다른 분석기의 감지 규칙을 모방하는 GitLab 관리 감지 규칙과 함께 실행됩니다. 어떤 분석기의 결과가 우선하는지 우선하는지는 분석기 순서에 따라 결정됩니다.

인기 언어별 분석기를 삭제하고 Semgrep 기반 스캐닝을 기본 동작으로 대체하는 작업은 epic 5245에서 추적됩니다. 중복 발견의 경우에는 분석기 순서가 어떤 분석기의 결과를 선호하는 지 결정합니다.

다른 분석기를 미리 비활성화하고 기본 동작이 변경되기 전에 Semgrep 기반 스캐닝을 지원되는 언어에 적용할 수 있습니다. 만약 이렇게 하면:

  • 상당히 빠른 스캐닝, 줄어든 컴퓨팅 할당량 사용, 더 많은 사용자 정의 스캐닝 규칙을 즐길 수 있습니다.
  • 그러나 언어별 분석기에 의해 이전에 보고된 취약성은 특정 조건 하에서 다시 보고됩니다. 다음을 포함합니다:
    • 이전에 Semgrep 기반 분석기를 실행에서 제외했는지 여부
    • 프로젝트의 취약성 리포트에서 보여지는 취약성을 처음으로 발견한 분석기

취약성 변환

언어에 따라 분석기를 전환하면 취약성이 일치하지 않을 수 있습니다.

Vulnerability Management 시스템은 다음 언어에 대해 이전 분석기에서 취약성을 Semgrep으로 자동 이동합니다:

  • C의 경우, Semgrep에서 감지한 경우에만 Flawfinder가 파이프라인에서 이를 감지한 경우에 취약성이 이동됩니다.
  • Go의 경우, Semgrep에서 감지한 경우에만 Gosec가 파이프라인에서 이를 감지한 경우에 취약성이 이동됩니다.
  • JavaScript 및 TypeScript의 경우, Semgrep에서 감지한 경우에만 ESLint가 파이프라인에서 이를 감지한 경우에 취약성이 이동됩니다.

그러나 다음과 같은 경우 기존 취약성이 만들어진 경우 Semgrep 결과를 기반으로 다시 만들어지며 이에 따라 시스템 동작이 달라집니다:

  • Bandit 또는 SpotBugs에 의해 취약성이 생성되었고 해당 분석기를 비활성화하는 경우. 우리는 지금 해당 분석기가 동작하지 않는 경우만 Bandit 및 SpotBugs를 비활성화하기를 권장합니다. Bandit 및 SpotBugs에서 Semgrep로 자동 변환하는 작업은 이 이슈에서 추적됩니다.
  • 기본 브랜치 파이프라인에서 ESLint, Gosec 또는 Flawfinder에 의해 취약성이 생성되었고, Semgrep 스캐닝이 그 언어를 위해 성공적으로 실행되지 않았거나(언어에 대한 Semgrep 커버리지가 도입되기 전이거나, 명시적으로 Semgrep를 비활성화했거나, 해당 파이프라인에서 Semgrep 스캔이 실패했다면) 이러한 취약성들은 현재 계획에 따라 결합하지 않습니다.

취약성이 다시 생성되면 원래 취약성은 “더 이상 감지되지 않음”으로 표시됩니다. 그런 다음 Semgrep 발견을 기반으로 새로운 취약성이 만들어집니다.

Semgrep 기반 스캔 조기 활성화

기본 동작이 변경되기 전에 언어별 분석기 대신 Semgrep 기반 스캔을 사용할 수 있습니다.

다음 경우 중 하나에 해당하는 경우이 접근 방식을 권장합니다:

  • 프로젝트에서 이전에 SAST를 사용한 적이 없어 취약점 보고서에 이미 SAST 취약점이 없는 경우.
  • Semgrep 기반 커버리지가 겹치는 분석기 중 하나를 구성하는 데 문제가 있습니다. 예를 들어 코드를 컴파일하는 SpotBugs 기반 분석기 설정에 문제가 있을 수 있습니다.
  • ESLint, Gosec, 또는 Flawfinder 스캔에 의해 생성된 취약점을 이미 확인하고 무시했으며, Semgrep에 의해 재생성된 취약점을 유지했을 경우.

각 언어별 분석기에 대해 별도의 선택을 할 수 있거나 모두 비활성화할 수 있습니다.

Semgrep 기반 스캔 활성화

일찍 Semgrep 기반 스캔으로 전환하려면 다음을 수행할 수 있습니다:

  1. SAST_EXCLUDED_ANALYZERS CI/CD 변수를 설정하기 위해 Merge Request(MR)를 생성합니다. SAST_EXCLUDED_ANALYZERS CI/CD 변수 설정 방법 참조.
    • SpotBugs 스캔을 비활성화하려면 디렉터리에 spotbugs를 추가하세요. Java 프로젝트에 대해서만 권장합니다. SpotBugs는 현재 Groovy, Kotlin, 그리고 Scala를 스캔할 수 있는 유일한 분석기입니다.
    • Flawfinder 스캔을 비활성화하려면 디렉터리에 flawfinder를 추가하세요. C 프로젝트에 대해서만 권장합니다. Flawfinder는 현재 C++를 스캔할 수 있는 유일한 분석기입니다.
  2. MR에서 스캔 작업이 성공하는지 확인하십시오. 제거된 분석기의 발견은 _Fixed_에, Semgrep에서의 발견은 _New_에 나타납니다. (GitLab이 Semgrep 규칙을 관리하고 수정하기 때문에 일부 발견은 이름, 설명 및 심각도가 다를 수 있습니다.)
  3. MR을 Merge하고 기본 브랜치 파이프라인 실행을 기다립니다.
  4. 언어별 분석기가 더 이상 감지하지 않는 발견을 취약점 보고서를 사용하여 무시합니다.

Semgrep 기반 스캔 미리보기

GitLab이 관리하는 Stable CI/CD 템플릿이 SAST에 대해 업데이트되기 전에 프로젝트에서 Semgrep 기반 스캔이 어떻게 동작하는지 확인할 수 있습니다. 이 변경 사항을 MR에서 테스트하고 기본 브랜치 파이프라인 구성에서 여전히 Stable 템플릿을 사용할 것을 권장합니다.

GitLab 15.3에서 기본 브랜치의 보안 발견을 다른 분석기에서 Semgrep으로 마이그레이션하는 feature flag를 활성화했습니다. GitLab 15.4에서 Deprecated되었던 분석기를 Stable CI/CD 템플릿에서 제거했습니다.

GitLab 15.3나 그 이전에서 CI/CD 구성의 변경 사항을 미리보기하려면 다음을 수행할 수 있습니다:

  1. Stable CI/CD 템플릿 SAST.gitlab-ci.yml에서 최신 템플릿으로 전환할 MR 열기, SAST.latest.gitlab-ci.yml.
    • GitLab.com에서 최신 템플릿을 직접 사용하세요:

      include:
        template: 'Jobs/SAST.latest.gitlab-ci.yml'
      
    • Self-Managed 인스턴스에서 GitLab.com에서 템플릿을 다운로드하세요:

      include:
        remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/2851f4d5/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml'
      
  2. MR에서 스캔 작업이 성공하는지 확인하십시오. 제거된 분석기에서의 발견은 _Fixed_에서, Semgrep에서의 발견은 _New_에서 확인하실 수 있습니다. (GitLab이 Semgrep 규칙을 관리하고 수정하기 때문에 일부 발견은 이름, 설명 및 심각도가 다를 수 있습니다.)
  3. MR을 닫으십시오.

‘Stable’ 및 ‘Latest’ 템플릿에 대한 자세한 내용은 CI/CD 템플릿 버전 관리를 참조하세요.

분석기 사용자 정의

.gitlab-ci.yml 파일에서 CI/CD 변수를 사용하여 분석기의 동작을 사용자 정의할 수 있습니다.

사용자 정의 Docker 미러 사용

GitLab 레지스트리 대신 사용자 지정 Docker 레지스트리를 사용하여 분석기 이미지를 호스팅할 수 있습니다.

전제 조건:

  • 사용자 지정 Docker 레지스트리는 모든 공식 분석기 이미지를 제공하여야 합니다.
note
이 변수는 SAST 분석기뿐만 아니라 모든 Secure 분석기에 영향을 미칩니다.

GitLab이 사용자 정의 Docker 레지스트리에서 분석기 이미지를 다운로드하도록 하려면 SECURE_ANALYZERS_PREFIX CI/CD 변수로 접두사를 정의하세요.

예:

include:
  - template: Jobs/SAST.gitlab-ci.yml

variables:
  SECURE_ANALYZERS_PREFIX: my-docker-registry/gitlab-images

모든 기본 분석기 비활성화

모든 기본 SAST 분석기를 비활성화하고 사용자 정의 분석기만을 활성화할 수 있습니다.

모든 기본 분석기를 비활성화하려면 .gitlab-ci.yml 파일에서 SAST_DISABLED CI/CD 변수를 "true"로 설정하세요.

예시:

include:
  - template: Jobs/SAST.gitlab-ci.yml

variables:
  SAST_DISABLED: "true"

특정 기본 분석기 비활성화

소스 코드 언어 감지에 따라 분석기는 자동으로 실행됩니다. 그러나 특정 분석기를 비활성화할 수 있습니다.

선택한 분석기를 비활성화하려면 SAST_EXCLUDED_ANALYZERS CI/CD 변수를 사용하여 비활성화하려는 분석기를 쉼표로 구분된 문자열로 설정하세요.

예시, spotbugs 분석기를 비활성화하려면:

include:
  - template: Jobs/SAST.gitlab-ci.yml

variables:
  SAST_EXCLUDED_ANALYZERS: "spotbugs"

사용자 정의 분석기

기본 분석기와 일관성 유지를 위해 사용자 정의 SAST 작업에는 이름에 -sast 접미사를 추가하는 것이 좋습니다.

GitLab에 사용자 정의 보안 스캐너를 통합하는 방법에 대한 자세한 내용은 보안 스캐너 통합을 참조하세요.

사용자 정의 분석기 예시

아래 예시는 Docker 이미지 my-docker-registry/analyzers/csharp를 기반으로 하는 스캔 작업을 추가하는 방법을 보여줍니다. /analyzer run 스크립트를 실행하고 SAST 보고서 gl-sast-report.json을 출력합니다.

.gitlab-ci.yml 파일에 다음을 정의하세요:

csharp-sast:
  image:
    name: "my-docker-registry/analyzers/csharp"
  script:
    - /analyzer run
  artifacts:
    reports:
      sast: gl-sast-report.json

분석기에 의해 제공되는 데이터

각 분석기는 감지하는 취약성에 대한 데이터를 제공합니다. 다음 표는 각 분석기에서 제공하는 데이터를 자세히 설명하고 있습니다. 이러한 도구가 제공하는 값들은 때로는 이질적일 수 있으므로 종종 severityconfidence와 같은 공통 값으로 표준화됩니다.

속성/도구 Apex Bandit1 Brakeman ESLint security1 SpotBugs Flawfinder Gosec1 Kubesec Scanner MobSF NodeJsScan PHP CS Security Audit Security code Scan (.NET)1 Semgrep Sobelow
영향을 받는 항목 (예: 클래스 또는 패키지)
신뢰도 x
설명
종료 열
시작 행
외부 ID (예: CVE)
파일
내부 문서/설명
내부 ID
심각도
솔루션
소스 코드 추출
시작 열
시작 행
제목
URL
  • ✓ => 데이터 사용 가능
  • ⚠ => 데이터 사용 가능하나 일부 신뢰할 수 없거나 비구조화된 콘텐츠에서 추출되어야 할 때
  • ✗ => 데이터 사용 불가능 또는 특정한, 비효율적 또는 신뢰할 수 없는 논리를 필요로 함
  1. 이 분석기는 지원이 종료되었습니다. 자세한 내용은 SAST 분석기 섹션을 참조하세요.