SAST 분석기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • GitLab Ultimate에서 13.3 버전에서 GitLab Free로 이동했습니다.

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

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

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

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

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

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 (Security Code Scan (.NET)); 지원 종료로 GitLab 16.0에서 대체되었습니다. GitLab 관리 규칙을 사용하는 semgrep 분석기로 대체되었습니다.

SAST 분석기 기능

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

사후 분석기

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

  • CWEs.
  • 위치 추적 필드.
  • 거짓 양성 또는 사소한 결과를 식별하는 방법.
Tier: Ultimate Offering: GitLab.com, 자체 관리, GitLab 전용

Semgrep 기반 스캔으로 전환

SAST에는 Semgrep 기반 분석기가 포함되어 있으며 여러 언어를 커버합니다. GitLab은 이 분석기를 유지보수하고 해당 분석기를 위한 탐지 규칙을 작성합니다.

GitLab 관리 CI/CD 템플릿을 사용하는 경우 Semgrep 기반 분석기는 다른 언어별 분석기와 함께 작동합니다. Semgrep 기반 분석기는 다른 분석기의 탐지 규칙을 모방하는 GitLab 관리 탐지 규칙과 함께 실행됩니다. 언어별 분석기를 제거하고 Semgrep 기반 분석기로 교체하는 작업은 epic 5245에서 추적됩니다. 중복 결과가 있는 경우 분석기 순서가 우선적으로 사용되는 결과를 결정합니다.

기본 동작이 변경되기 전에 다른 분석기를 비활성화하고 기본 동작이 변경되기 전에 지원되는 언어에 대해 Semgrep 기반 스캔을 사용할 수 있습니다. 이렇게 하면 다음과 같은 이점을 얻을 수 있습니다:

  • 크게 빠른 스캔, 줄어든 컴퓨팅 할당량 사용, 더 많은 사용자 정의 스캔 규칙.
  • 그러나 이전에 언어별 분석기에 의해 보고된 취약성은 특정 조건 하에 다시 보고됩니다. 이는 이전에 취약성을 거부한 경우를 포함합니다. 시스템 동작은 다음에 따라 달라집니다:
    • 과거에 Semgrep 기반 분석기를 실행에서 제외했는지 여부.
    • 프로젝트의 취약점 보고서에 표시된 취약성을 먼저 발견한 분석기.

취약점 번역

분석기를 전환하면 취약성이 맞지 않을 수 있습니다.

특정 언어에 대해 이전 분석기에서 Semgrep로 취약점이 자동으로 이동됩니다.

  • C의 경우, Semgrep가 C에서 처음으로 기본 브랜치 파이프라인에 취약점을 감지한 경우 Semgrep로 취약점이 이동됩니다. C의 Semgrep 커버리지는 GitLab 14.4(2021년 10월)의 기본 CI/CD 템플릿에서 소개되었습니다.
  • Go의 경우, Semgrep가 Go에서 처음으로 기본 브랜치 파이프라인에 취약점을 감지한 경우 Semgrep로 취약점이 이동됩니다. Go의 Semgrep 커버리지는 GitLab 14.2(2021년 8월)의 기본 CI/CD 템플릿에서 소개되었습니다.
  • JavaScript 및 TypeScript의 경우, Semgrep가 JavaScript 및 TypeScript에서 처음으로 기본 브랜치 파이프라인에 취약점을 감지한 경우 Semgrep로 취약점이 이동됩니다. 이러한 언어에 대한 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. 병합 요청(MR)을 생성하여 SAST_EXCLUDED_ANALYZERS CI/CD 변수"bandit,gosec,eslint"로 설정합니다.
    • SpotBugs 스캐닝을 비활성화하려면 목록에 spotbugs를 추가합니다. 이는 Java 프로젝트에만 권장됩니다. SpotBugs는 현재 Groovy, Kotlin 및 Scala를 스캔할 수 있는 유일한 분석기입니다.
    • Flawfinder 스캐닝을 비활성화하려면 목록에 flawfinder를 추가합니다. 이는 C 프로젝트에만 권장됩니다. Flawfinder는 현재 C++를 스캔할 수 있는 유일한 분석기입니다.
  2. MR에서 스캐닝 작업이 성공적으로 수행되었는지 확인합니다. 제거된 분석기의 결과는 _수정됨( Fixed )_에, Semgrep의 결과는 _새로 추가된( New )_에 사용할 수 있습니다. (GitLab이 Semgrep 룰셋을 관리하고 편집하기 때문에 일부 결과의 이름, 설명 및 심각성이 다를 수 있습니다.)
  3. MR을 병합하고 기본 브랜치 파이프라인이 실행될 때까지 기다립니다.
  4. 취약점 보고서를 사용하여 언어별 분석기에서 더 이상 감지되지 않는 결과를 해제합니다.

Semgrep 기반 스캐닝 미리 보기

GitLab이 관리하는 Stable CI/CD 템플릿이 SAST의 최신 CI/CD 템플릿으로 업데이트되기 전에 프로젝트에서 Semgrep 기반 스캐닝이 어떻게 작동하는지 볼 수 있습니다. 이 변경 사항을 MR에서 테스트하는 것을 권장하지만, 기본 브랜치 파이프라인 구성에서는 여전히 Stable 템플릿을 계속 사용하십시오.

GitLab 15.3에서 기능 플래그를 활성화했습니다. 이를 통해 기본 브랜치에서 다른 분석기에서 Semgrep으로 보안 결과를 마이그레이션했습니다. GitLab 15.4에서는 사용되지 않는 분석기를 삭제했습니다. Stable CI/CD 템플릿에서 사용되지 않는 분석기를 제거했습니다.

GitLab 15.3 이전에 SAST의 CI/CD 구성에 대한 예상 변경 사항을 미리 보려면:

  1. Stable CI/CD 템플릿인 SAST.gitlab-ci.yaml에서 Latest 템플릿(SAST.latest.gitlab-ci.yaml)로 전환하는 MR을 엽니다.
    • GitLab.com에서는 다음과 같이 최신 템플릿을 직접 사용합니다:

      include:
        template: 'Jobs/SAST.latest.gitlab-ci.yaml'
      
    • 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 변수를 사용하여 분석기의 동작을 사용자 정의할 수 있습니다.

사용자 정의 도커 미러 사용

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

전제 조건:

  • 사용자 정의 도커 레지스트리는 모든 공식 분석기에 대한 이미지를 제공해야 합니다.

참고: 이 변수는 SAST의 모든 분석기에 영향을 미치며, 해당 분석기에서 뿐만 아니라 모든 분석기에서도 사용됩니다.

GitLab이 사용자 정의 도커 레지스트리에서 분석기 이미지를 다운로드하도록 하려면 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"

사용자 정의 분석기

CI/CD 구성에서 작업을 정의하여 자체 분석기를 제공할 수 있습니다. 기본 분석기와 일관성을 유지하기 위해 사용자 정의 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 분석기 섹션을 참조하세요.