SAST 분석기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

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

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

SAST 기본 이미지는 GitLab에서 유지관리하지만 사용자 정의 이미지를 통합할 수도 있습니다.

각 scanner에 대해 분석기는 다음을 합니다:

  • 감지 논리를 노출합니다.
  • 실행을 처리합니다.
  • 표준 형식으로 출력을 변환합니다.

SAST 분석기

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

작은 주석:
  1. 이러한 분석기는 GitLab 16.9에서 [폐기되었으며](https://gitlab.com/gitlab-org/gitlab/-/issues/431123) 17.0에서 제거될 예정입니다. [Semgrep 분석기](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep)가 대체로 제안됩니다.

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

  • bandit (Bandit); 지원 종료 - GitLab 15.4에서. GitLab에서 관리되는 규칙을 사용하는 semgrep 분석기로 대체되었습니다.
  • eslint (ESLint (JavaScript and React)); 지원 종료 - GitLab 15.4. GitLab에서 관리되는 규칙을 사용하는 semgrep 분석기로 대체되었습니다.
  • gosec (Gosec); 지원 종료 - GitLab 15.4에서. GitLab에서 관리되는 규칙을 사용하는 semgrep 분석기로 대체되었습니다.
  • security-code-scan (.NET 보안 코드 스캔); 지원 종료 - GitLab 16.0에서. GitLab에서 관리되는 규칙을 사용하는 semgrep 분석기로 대체되었습니다.

SAST 분석기 기능

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

후 분석기

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

  • CWEs.
  • 위치 추적 필드.
  • 잘못된 양성 또는 미미한 발견을 식별하는 수단.
Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Semgrep 기반 스캐닝으로 전환

SAST에는 Semgrep 기반 분석기가 포함되어 있으며 다양한 언어를 지원합니다. GitLab은 분석기를 유지하고 이를 위한 탐지 규칙을 작성합니다.

만약 GitLab에서 관리되는 CI/CD 템플릿을 사용하는 경우 Semgrep 기반 분석기는 다른 언어별 분석기와 함께 작동합니다. 분석기의 발견 규칙을 모방하는 GitLab에서 관리되는 검출 규칙과 함께 실행됩니다. 언어마다 구별되는 발견 사항이 있는 경우 분석기 순서에 따라 선호되는 분석기의 결과가 결정됩니다.

기본 동작이 변경되기 전에 다른 분석기를 비활성화하고 기본 동작 변경 전에 Semgrep 기반 스캐닝을 지원하는 언어에 대해 사용할 수 있습니다. 이것을 할 경우:

  • 크게 빠른 스캐닝, 줄어든 계산 리소스 사용 및 더 많은 사용자 정의 스캐닝 규칙을 즐길 수 있습니다.
  • 그러나 지정된 조건 하에서 이전에 언어별 분석기에 의해 보고된 취약점이 다시 보고되며 다음을 포함합니다. 취약점을 이전에 무시한 경우 시스템 동작은 다음에 따라 달라집니다.
    • 과거에 Semgrep 기반 분석기를 실행에서 제외했는지 여부.
    • 프로젝트의 취약점 보고서에 나타난 취약점을 처음 발견한 분석기.

취약점 번역

언어에 대한 분석기를 전환할 때 취약점이 일치하지 않을 수 있습니다.

취약점 관리 시스템은 특정 언어에 대해 이전 분석기에서 Semgrep로 취약점을 자동으로 이동합니다:

  • C의 경우, 취약점은 Semgrep도 검출한 파이프라인에서만 Flawfinder에 의해 처음 검출되었을 경우에 이동됩니다. C에 대한 Semgrep 커버리지는 GitLab 14.4 (2021년 10월)부터 CI/CD 템플릿에 기본으로 추가되었습니다.
  • Go의 경우, 취약점은 Semgrep도 검출한 파이프라인에서만 Gosec에 의해 처음 검출되었을 경우에 이동됩니다. Go에 대한 Semgrep 커버리지는 GitLab 14.2 (2021년 8월)부터 CI/CD 템플릿에 기본으로 추가되었습니다.
  • JavaScript 및 TypeScript의 경우, 취약점은 Semgrep도 검출한 파이프라인에서만 ESLint에 의해 처음 검출되었을 경우에 이동됩니다. 이러한 언어에 대한 Semgrep 커버리지는 GitLab 13.12 (2021년 5월)부터 CI/CD 템플릿에 추가되었습니다.

그러나 기존 취약점이 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 변수를 “bandit,gosec,eslint”로 설정하는 Merge Request(MR)을 생성합니다.
    • SpotBugs 스캔을 비활성화하려면 디렉터리에 spotbugs를 추가합니다. Java 프로젝트에만 권장합니다. SpotBugs는 현재 그루비, 코틀린 및 스칼라를 스캔 할 수있는 유일한 분석기입니다.
    • Flawfinder 스캔을 비활성화하려면 디렉터리에 flawfinder를 추가합니다. C++을 스캔할 수있는 유일한 분석기인 Flawfinder는 현재 C 프로젝트에만 권장합니다.
  2. MR에서 스캔 작업이 성공적으로 완료되었는지 확인합니다. 제거된 분석기의 결과는 _수정됨_에, Semgrep의 결과는 _새로 생성됨_에 사용 가능합니다. (일부 결과는 이름, 설명 및 심각성이 다를 수 있으며, GitLab이 Semgrep 규칙 집합을 관리하고 편집하기 때문입니다.)
  3. MR을 Merge하고 기본 브랜치 파이프라인 실행을 기다립니다.
  4. 언어별 분석기에 의해 더 이상 검출되지 않는 결과를 취약점 보고서에서 제거합니다.

Semgrep 기반 스캔 미리보기

GitLab이 관리하는 안정적인 CI/CD 템플릿이 SAST에 대해 업데이트되기 전에 프로젝트에서 Semgrep 기반 스캔이 작동하는 방식을 볼 수 있습니다. 이 변경 사항을 테스트하는 것을 권장하지만 기본 브랜치 파이프라인 구성에서 계속하여 안정적인 템플릿을 사용하십시오.

GitLab 15.3에서 기본 브랜치의 보안 결과를 다른 분석기에서 Semgrep로 마이그레이션하는 피처 플래그를 활성화했습니다. GitLab 15.4에서는 더 이상 사용되지 않는 분석기를 안정적인 CI/CD 템플릿에서 제거했습니다.

GitLab 15.3 이전에 CI/CD 구성에 대한 예정된 변경 사항을 미리보려면 다음을 수행할 수 있습니다:

  1. 안정적인 CI/CD 템플릿 SAST.gitlab-ci.yaml에서 최신 템플릿 SAST.latest.gitlab-ci.yaml로 변경하기 위한 MR을 엽니다.
    • GitLab.com에서는 직접 최신 템플릿을 사용합니다:

      include:
        template: 'Jobs/SAST.latest.gitlab-ci.yaml'
      
    • 자체 호스팅하는 인스턴스의 경우, GitLab.com에서 템플릿을 다운로드합니다:

      include:
        remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/2851f4d5/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml'
      
  2. MR에서 스캔 작업이 성공적으로 완료되었는지 확인합니다. 제거된 분석기의 결과는 _수정됨_에, Semgrep의 결과는 _새로 생성됨_에 사용 가능합니다. (일부 결과는 이름, 설명 및 심각성이 다를 수 있으며, GitLab이 Semgrep 규칙 집합을 관리하고 편집하기 때문입니다.)
  3. MR을 닫습니다.

안정적 템플릿 및 최신 템플릿에 대한 자세한 내용은 CI/CD 템플릿 버전 관리를 참조하십시오.

분석기 사용자 정의

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

커스텀 Docker 미러 사용

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

사전 요구 사항:

  • 사용자 정의 Docker 레지스트리는 모든 공식 분석기에 대한 이미지를 제공해야 합니다.
note
이 변수는 SAST의 분석기에만 영향을 미치며, 모든 SAST 분석기에 영향을 미칩니다.

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

예를 들어, 다음은 SAST가 my-docker-registry/gitlab-images/semgrep 대신 registry.gitlab.com/security-products/semgrep를 가져오도록 지시하는 것입니다.

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

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

기본 분석기 비활성화

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

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

예시:

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

variables:
  SAST_DISABLED: "true"

특정 기본 분석기 비활성화

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

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

예를 들어 spotbugs 분석기를 비활성화하려면:

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

variables:
  SAST_EXCLUDED_ANALYZERS: "spotbugs"

사용자 정의 분석기

사용자 정의 보안 스캐너를 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
Affected item (예: 클래스 또는 패키지)
Confidence x
Description
End column
End line
외부 ID (예: CVE)
파일
내부 문서/설명
내부 ID
심각도
솔루션
소스 코드 추출
시작 열
시작 줄
제목
URL
  • ✓ => 데이터를 사용할 수 있음
  • ⚠ => 데이터는 사용할 수 있지만 부분적으로 신뢰할 수 있거나 비구조화된 콘텐츠에서 추출해야 함
  • ✗ => 데이터를 사용할 수 없거나 획득에 특정한 비효율적이거나 신뢰할 수 없는 논리가 필요함
  1. 이 분석기는 지원 종료에 도달했습니다. 자세한 내용은 SAST 분석기 섹션을 참조하세요.