의존성 스캐닝 문제 해결

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

의존성 스캐닝 작업을 수행하는 동안 다음과 같은 문제가 발생할 수 있습니다.

디버그 수준 로깅

디버그 수준 로깅은 문제를 해결하는 데 도움이 될 수 있습니다. 자세한 내용은
디버그 수준 로깅을 참조하세요.

특정 언어 또는 패키지 관리자에 대한 지원이 누락된 경우의 우회 방법

“지원되는 언어” 섹션을 참조하면
일부 의존성 정의 파일은 아직 지원되지 않음을 알 수 있습니다.
하지만 언어, 패키지 관리자 또는 제3자 도구가 정의 파일을
지원되는 형식으로 변환할 수 있다면 의존성 스캐닝이 가능합니다.

일반적으로 접근 방식은 다음과 같습니다:

  1. .gitlab-ci.yml 파일에 전용 변환기 작업을 정의하세요.
    변환을 용이하게 하기 위해 적절한 Docker 이미지, 스크립트 또는 두 가지를 사용하세요.

  2. 해당 작업이 변환된 지원 파일을 아티팩트로 업로드하도록 합니다.

  3. 변환된 정의 파일을 사용하기 위해 dependency_scanning 작업에
    dependencies: [<your-converter-job>]를 추가하세요.

예를 들어, pyproject.toml 파일만 가지고 있는 Poetry 프로젝트는
다음과 같이 poetry.lock 파일을 생성할 수 있습니다.

include:
  - template: Jobs/Dependency-Scanning.gitlab-ci.yml

stages:
  - test

gemnasium-python-dependency_scanning:
  # Work around https://gitlab.com/gitlab-org/gitlab/-/issues/32774
  before_script:
    - pip install "poetry>=1,<2"  # 또는 다른 방법을 통해: https://python-poetry.org/docs/#installation
    - poetry update --lock # 분석할 잠금 파일을 생성합니다.

Error response from daemon: error processing tar file: docker-tar: relocation error

이 오류는 의존성 스캐닝 작업을 실행하는 Docker 버전이 19.03.0인 경우 발생합니다.
Docker 19.03.1 이상으로 업데이트를 고려하세요. 이전 버전은 영향받지 않습니다.
자세한 내용은
이 문제를 참조하세요.

경고 메시지 gl-dependency-scanning-report.json: no matching files

이에 대한 정보는
일반 애플리케이션 보안 문제 해결 섹션을 참조하세요.

Error response from daemon: error processing tar file: docker-tar: relocation error

이 오류는 의존성 스캐닝 작업을 실행하는 Docker 버전이 19.03.0인 경우 발생합니다.
Docker 19.03.1 이상으로 업데이트를 고려하세요. 이전 버전은 영향받지 않습니다.
자세한 내용은
이 문제를 참조하세요.

의존성 스캐닝 작업이 예기치 않게 실행되고 있습니다

의존성 스캐닝 CI 템플릿
rules:exists 구문을 사용합니다.
이 지침은 10000개의 검사로 제한되며, 이 숫자에 도달하면 항상 true를 반환합니다.
이로 인해, 저장소의 파일 수에 따라 스캐너가 귀하의 프로젝트를 지원하지 않더라도
의존성 스캐닝 작업이 트리거될 수 있습니다. 이 제한에 대한
자세한 내용은 the rules:exists documentation을 참조하세요.

오류: dependency_scanning은 구성 용도로만 사용되며, 스크립트가 실행되어서는 안 됩니다

자세한 내용은 GitLab Secure 문제 해결 섹션을 참조하세요.

Java 기반 프로젝트용 여러 인증서 가져오기

gemnasium-maven 분석기는 keytool을 사용하여 ADDITIONAL_CA_CERT_BUNDLE 변수의 내용을 읽으며, 이는 단일 인증서 또는 인증서 체인을 가져옵니다. 여러 개의 관련 없는 인증서는 무시되며, 첫 번째 인증서만 keytool에 의해 가져옵니다.

여러 개의 관련 없는 인증서를 분석기에 추가하기 위해 gemnasium-maven-dependency_scanning 작업의 정의에 다음과 같은 before_script를 선언할 수 있습니다:

gemnasium-maven-dependency_scanning:
  before_script:
    - . $HOME/.bashrc # 자바 도구를 스크립트에서 사용할 수 있도록 설정
    - OIFS="$IFS"; IFS=""; echo $ADDITIONAL_CA_CERT_BUNDLE > multi.pem; IFS="$OIFS" # ADDITIONAL_CA_CERT_BUNDLE 변수를 PEM 파일에 작성
    - csplit -z --digits=2 --prefix=cert multi.pem "/-----END CERTIFICATE-----/+1" "{*}" # 파일을 개별 인증서로 분할
    - for i in `ls cert*`; do keytool -v -importcert -alias "custom-cert-$i" -file $i -trustcacerts -noprompt -storepass changeit -keystore /opt/asdf/installs/java/adoptopenjdk-11.0.7+10.1/lib/security/cacerts 1>/dev/null 2>&1 || true; done # 각 인증서를 keytool로 가져오기 (주: keystore 위치는 사용 중인 자바 버전에 관련이 있으며 다른 버전에 맞게 변경해야 함)
    - unset ADDITIONAL_CA_CERT_BUNDLE # 변수를 언셋하여 분석기가 가져오기를 중복하지 않도록 함

의존성 스캐닝 작업이 strconv.ParseUint: parsing "0.0": invalid syntax 메시지와 함께 실패

Docker-in-Docker는 지원되지 않으며, 이를 호출하려는 시도가 이 오류의 주요 원인입니다.

이 오류를 수정하려면 의존성 스캐닝에 대한 Docker-in-Docker를 비활성화하세요. 각각의 분석기에 대해 CI/CD 파이프라인에서 실행되는 개별 <analyzer-name>-dependency_scanning 작업이 생성됩니다.

include:
  - template: Dependency-Scanning.gitlab-ci.yml

variables:
  DS_DISABLE_DIND: "true"

메시지 <file> does not exist in <commit SHA>

파일의 의존성 위치가 표시되면 링크의 경로는 특정 Git SHA로 이동합니다.

그러나 의존성 스캐닝 도구가 검토한 잠금 파일이 캐시되었을 경우, 해당 링크를 선택하면 다음과 같은 메시지와 함께 리포지토리 루트로 리디렉션됩니다: <file> does not exist in <commit SHA>.

잠금 파일은 빌드 단계에서 캐시되고 스캔이 수행되기 전에 의존성 스캐닝 작업에 전달됩니다. CI_BUILDS_DIR 디렉토리에 잠금 파일이 존재하면 의존성 스캐닝 작업이 트리거됩니다.

이 경고를 방지하려면 잠금 파일을 커밋해야 합니다.

DS_MAJOR_VERSION 또는 DS_ANALYZER_IMAGE 설정 후 더 이상 최신 Docker 이미지를 가져오지 못함

특정 이유로 DS_MAJOR_VERSION 또는 DS_ANALYZER_IMAGE를 수동으로 설정한 경우, 최신 패치 버전의 분석기를 다시 가져오기 위해 구성을 업데이트해야 합니다. .gitlab-ci.yml 파일을 편집하고 다음 중 하나를 수행하세요:

  • DS_MAJOR_VERSION현재 의존성 스캐닝 템플릿에서 볼 수 있는 최신 버전과 일치하도록 설정합니다.
  • DS_ANALYZER_IMAGE 변수를 직접 하드코딩한 경우, 이를 현재 의존성 스캐닝 템플릿에서 찾을 수 있는 최신 줄로 변경합니다. 줄 번호는 편집한 스캐닝 작업에 따라 달라집니다.

예를 들어, gemnasium-maven-dependency_scanning 작업은 DS_ANALYZER_IMAGE"$SECURE_ANALYZERS_PREFIX/gemnasium-maven:$DS_MAJOR_VERSION"로 설정되어 있기 때문에 최신 gemnasium-maven Docker 이미지를 가져옵니다.

setuptools 프로젝트의 의존성 스캐닝이 use_2to3 is invalid 오류로 실패

2to3에 대한 지원이 setuptools 버전 v58.0.0에서 제거되었습니다.

의존성 스캐닝( python 3.9 실행)은 setuptools 버전 58.1.0+를 사용하며, 이 버전은 2to3를 지원하지 않습니다. 따라서 lib2to3에 의존하는 setuptools 의존성이 다음과 같은 메시지로 실패합니다:

error in <dependency name> setup command: use_2to3 is invalid

이 오류를 해결하려면 분석기의 setuptools 버전을 다운그레이드하세요 (예: v57.5.0):

gemnasium-python-dependency_scanning:
  before_script:
    - pip install setuptools==57.5.0

psycopg2를 사용하는 프로젝트의 의존성 스캐닝이 pg_config executable not found 오류로 실패

psycopg2에 의존하는 Python 프로젝트를 스캔할 때 다음과 같은 메시지로 실패할 수 있습니다:

Error: pg_config executable not found.

psycopg2는 설치되지 않은 libpq-dev Debian 패키지에 의존합니다. 이 문제를 해결하려면 before_script에서 libpq-dev 패키지를 설치하세요:

gemnasium-python-dependency_scanning:
  before_script:
    - apt-get update && apt-get install -y libpq-dev

CI_JOB_TOKEN과 함께 poetry config http-basic을 사용할 때 NoSuchOptionException

이 오류는 자동으로 생성된 CI_JOB_TOKEN이 하이픈(-)으로 시작할 때 발생할 수 있습니다. 이 오류를 피하려면 Poetry의 구성 조언을 따르세요.

오류: 프로젝트에 해결되지 않은 의존성이 있습니다

다음 오류 메시지는 build.gradle 또는 build.gradle.kts 파일로 인한 Gradle 의존성 해결 문제를 나타냅니다:

  • Project has <number> unresolved dependencies (GitLab 16.7 to 16.9)
  • project has unresolved dependencies: ["dependency_name:version"] (GitLab 17.0 및 이후)

GitLab 16.7에서 16.9까지, gemnasium-maven은 해결되지 않은 의존성이 발견되면 처리를 계속할 수 없습니다.

GitLab 17.0 및 이후에는 gemnasium-maven이 해결되지 않은 의존성을 처리하는 방법을 제어할 수 있는 DS_GRADLE_RESOLUTION_POLICY 환경 변수를 지원합니다. 기본적으로 스캔은 해결되지 않은 의존성이 발견되면 실패합니다. 그러나 환경 변수 DS_GRADLE_RESOLUTION_POLICY"none"으로 설정하면 스캔을 계속하고 부분 결과를 생성할 수 있습니다.

build.gradle 파일을 수정하는 방법에 대한 가이드는 Gradle 의존성 해결 문서를 참조하십시오. 자세한 내용은 이슈 482650을 참조하십시오.

또한, 의존성 해결에 영향을 미치는 Kotlin 2.0.0의 알려진 문제가 있으며, 이는 Kotlin 2.0.20에서 수정될 예정입니다. 자세한 내용은 이 문제를 참조하십시오.

Go 프로젝트에서 빌드 제약 설정

의존성 스캐닝은 linux/amd64 컨테이너에서 실행됩니다. 결과적으로, Go 프로젝트에 대해 생성된 빌드 목록은 이 환경과 호환되는 의존성을 포함합니다. 배포 환경이 linux/amd64가 아닌 경우, 최종 의존성 목록에 추가적인 호환되지 않는 모듈이 포함될 수 있습니다. 의존성 목록은 배포 환경과 호환되는 모듈을 생략할 수도 있습니다. 이 문제를 방지하려면 .gitlab-ci.yml 파일의 GOOSGOARCH 환경 변수를 설정하여 빌드 프로세스를 배포 환경의 운영 체제와 아키텍처를 대상으로 구성할 수 있습니다.

예를 들어:

variables:
  GOOS: "darwin"
  GOARCH: "arm64"

빌드 태그 제약을 GOFLAGS 변수를 사용하여 공급할 수도 있습니다:

variables:
  GOFLAGS: "-tags=test_feature"

Go 프로젝트의 의존성 스캐닝이 잘못된 양성을 반환

go.sum 파일은 프로젝트의 빌드 목록을 생성하는 동안 고려된 모든 모듈의 항목을 포함합니다. 여러 버전의 모듈이 go.sum 파일에 포함되지만, go build에서 사용되는 MVS 알고리즘은 단 하나만 선택합니다. 이로 인해 의존성 스캐닝이 go.sum을 사용할 경우 잘못된 양성을 보고할 수 있습니다.

잘못된 양성을 방지하기 위해, Gemnasium은 Go 프로젝트에 대한 빌드 목록을 생성할 수 없는 경우에만 go.sum을 사용합니다. go.sum이 선택되면 경고가 발생합니다:

[WARN] [Gemnasium] [2022-09-14T20:59:38Z] ▶ "/test-projects/gitlab-shell/go.sum"에 대한 "go.sum" 파서를 선택했습니다. 잘못된 양성이 발생할 수 있습니다. https://gitlab.com/gitlab-org/gitlab/-/issues/321081를 참조하세요.

ssh 사용 시 Host key verification failed

어떤 gemnasium 이미지에 openssh-client를 설치한 후, ssh 사용 시 Host key verification failed 메시지가 표시될 수 있습니다. 이는 설정 중에 사용자 디렉토리를 나타내기 위해 ~를 사용할 경우 발생할 수 있으며, 이로 인해 이미지 빌드 시 $HOME/tmp로 설정됩니다. 이 문제는 SSH를 사용하여 프로젝트를 클론하는 데 실패하는 경우 설명되어 있습니다. openssh-client/root/.ssh/known_hosts를 찾기를 기대하지만 이 경로는 존재하지 않으며, 대신 /tmp/.ssh/known_hosts가 존재합니다.

이 문제는 openssh-client가 미리 설치된 gemnasium-python에서 해결되었지만, 다른 이미지에서 openssh-client를 처음부터 설치할 경우 문제가 발생할 수 있습니다. 이를 해결하기 위해 다음 중 하나를 선택할 수 있습니다:

  1. 키와 호스트를 설정할 때 절대 경로(/root/.ssh/known_hosts 대신 ~/.ssh/known_hosts)를 사용합니다.

  2. 관련 known_hosts 파일을 지정하여 ssh 구성에 UserKnownHostsFile을 추가합니다. 예: echo 'UserKnownHostsFile /tmp/.ssh/known_hosts' >> /etc/ssh/ssh_config.

ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE

이 오류는 requirements.txt 파일의 패키지 해시가 다운로드된 패키지의 해시와 일치하지 않을 때 발생합니다. 보안 조치로 인해 pip는 패키지가 변조되었다고 가정하고 설치를 거부합니다. 이를 해결하려면 요구 사항 파일에 포함된 해시가 올바른지 확인하세요.

pip-compile에 의해 생성된 요구 사항 파일의 경우, pip-compile --generate-hashes를 실행하여 해시가 최신인지 확인합니다.

pipenv에 의해 생성된 Pipfile.lock을 사용하는 경우, pipenv verify를 실행하여 잠금 파일이 최신 패키지 해시를 포함하는지 확인하세요.

ERROR: In --require-hashes mode, all requirements must have their versions pinned with ==

이 오류는 요구 사항 파일이 GitLab Runner에서 사용하는 것과 다른 플랫폼에서 생성된 경우 발생합니다.

다른 플랫폼을 대상으로 하는 지원은 문제 416376에서 추적됩니다.

편집 가능한 플래그는 Python의 의존성 스캔을 중단시킬 수 있습니다

requirements.txt 파일에서 현재 디렉토리를 겨냥하기 위해 -e/--editable 플래그를 사용하면, Gemnasium Python 의존성 스캐너가 pip3 download를 실행할 때 멈추는 문제가 발생할 수 있습니다.

이 명령은 대상 프로젝트를 빌드하는 데 필요합니다.

이 문제를 해결하려면 Python 의존성 스캔을 실행할 때 -e/--editable 플래그를 사용하지 마세요.

SBT로 메모리 부족 오류 처리

Scala 프로젝트에서 의존성 스캔을 사용하는 동안 SBT로 메모리 부족 오류가 발생하면, SBT_CLI_OPTS 환경 변수를 설정하여 이 문제를 해결할 수 있습니다. 예시 구성은 다음과 같습니다:

variables:
  SBT_CLI_OPTS: "-J-Xmx8192m -J-Xms4192m -J-Xss2M"

Kubernetes 실행기를 사용하는 경우, 기본 Kubernetes 리소스 설정을 덮어써야 할 수도 있습니다. 메모리 문제를 방지하기 위해 컨테이너 리소스를 조정하는 방법에 대한 내용은 Kubernetes 실행기 문서를 참고하세요.

NPM 프로젝트에 package-lock.json 파일 없음

기본적으로, 의존성 스캔 작업은 저장소에 package-lock.json 파일이 있을 때만 실행됩니다. 그러나 일부 NPM 프로젝트는 Git 저장소에 저장하는 대신 빌드 프로세스 중에 package-lock.json 파일을 생성합니다.

이러한 프로젝트에서 의존성을 스캔하려면:

  1. 빌드 작업에서 package-lock.json 파일을 생성합니다.

  2. 생성된 파일을 아티팩트로 저장합니다.

  3. 의존성 스캔 작업을 수정하여 아티팩트를 사용하고 규칙을 조정합니다.

예를 들어, 구성은 다음과 같을 수 있습니다:

include:
  - template: Dependency-Scanning.gitlab-ci.yml

build:
  script:
    - npm i
  artifacts:
    paths:
      - package-lock.json  # 생성된 package-lock.json을 아티팩트로 저장

gemnasium-dependency_scanning:
  needs: ["build"]
  rules:
    - if: "$DEPENDENCY_SCANNING_DISABLED == 'true' || $DEPENDENCY_SCANNING_DISABLED == '1'"
      when: never
    - if: "$DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/"
      when: never
    - if: $CI_COMMIT_BRANCH && $GITLAB_FEATURES =~ /\bdependency_scanning\b/ && $CI_GITLAB_FIPS_MODE == "true"
      variables:
        DS_IMAGE_SUFFIX: "-fips"
        DS_REMEDIATE: 'false'
    - if: "$CI_COMMIT_BRANCH && $GITLAB_FEATURES =~ /\\bdependency_scanning\\b/"