Dependency Scanning 문제 해결

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

의존성 스캔 작업 중 다음과 같은 문제가 발생할 수 있습니다.

디버그 수준 로깅

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

특정 언어 또는 패키지 관리자의 지원 부재 문제 해결

“지원되는 언어” 섹션 에서 언급했듯이 일부 의존성 정의 파일은 아직 지원되지 않습니다. 그러나 언어, 패키지 관리자 또는 서드파티 도구를 사용하여 지원되는 형식으로 정의 파일 변환할 수 있습니다.

일반적으로 다음과 같은 방법을 취합니다:

  1. .gitlab-ci.yml 파일에 전용 컨버터 job를 정의합니다. 변환을 용이하게 하기 위해 적절한 도커 이미지, 스크립트 또는 둘 다를 사용합니다.
  2. 해당 job이 변환된 지원 파일을 artifact로 업로드하도록 합니다.
  3. 변환된 정의 파일을 사용하기 위해 dependency_scanning job에 dependencies: [<your-converter-job>] 를 추가합니다.

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

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

stages:
  - test

gemnasium-python-dependency_scanning:
  # https://gitlab.com/gitlab-org/gitlab/-/issues/32774 우회 방법
  before_script:
    - pip install "poetry>=1,<2"  # 또는 다른 방법을 통해: https://python-poetry.org/docs/#installation
    - poetry update --lock # 분석할 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를 반환합니다. 이로 인해 저장소 파일 수에 따라 의존성 스캔 job이 트리거될 수 있으며, 실제로 스캐너에서 프로젝트를 지원하지 않는 경우가 있습니다. 이 제한 사항에 대한 자세한 내용은 rules:exists 문서를 확인하세요.

에러: dependency_scanning is used for configuration only, and its script should not be executed

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

Java 기반 프로젝트를 위한 여러 인증서 가져오기

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

분석기에 여러 관련 없는 인증서를 추가하려면 gemnasium-maven-dependency_scanning job의 정의에 다음과 같이 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 # 분석기가 가져오기를 중복하지 않도록 변수를 해제합니다.

Dependency Scanning 작업이 strconv.ParseUint: parsing "0.0": invalid syntax 메시지와 함께 실패합니다.

도커인도커를 호출하는 것이 이 오류의 가능한 원인입니다. 도커인도커는 다음과 같습니다:

  • GitLab 13.0 이후로 기본으로 비활성화됨.
  • GitLab 13.4 이후로 더 이상 지원되지 않음.

이 오류를 해결하려면 의존성 스캔을 위해 도커인도커를 비활성화하세요. 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 디렉토리에 전달됩니다. 분석기 실행 전에 캐시가 다운로드되기 때문에, CI_BUILDS_DIR 디렉토리에 잠금 파일이 존재하는 것은 의존성 스캔 작업을 트리거합니다.

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

DS_MAJOR_VERSION 또는 DS_ANALYZER_IMAGE를 설정한 후 최신 도커 이미지를 더 이상 받지 못합니다.

특정한 이유로 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 도커 이미지를 가져옵니다.

setuptool 프로젝트의 의존성 스캔이 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에 의존하는 파이썬 프로젝트의 스캔이 다음과 같은 메시지로 실패할 수 있습니다:

Error: pg_config executable not found.

psycopg2libpq-dev 데비안 패키지에 의존하는데, 이 패키지는 gemnasium-python 도커 이미지에 설치되어 있지 않습니다. 이 오류를 해결하려면 before_script에서 libpq-dev 패키지를 설치하세요:

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

poetry config http-basicCI_JOB_TOKEN과 함께 사용할 때 NoSuchOptionException 오류

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

오류: 프로젝트에 <number>개의 미해결된 종속성이 있습니다.

Project has <number> unresolved dependencies 오류 메시지는 gradle.build 또는 gradle.build.kts 파일에 의해 발생하는 종속성 해결 문제를 나타냅니다. 현재 릴리스에서 gemnasium-maven는 미해결된 종속성을 만나면 처리를 계속할 수 없습니다. 그러나 미해결된 종속성 오류에서 복구하고 종속성 그래프를 생성할 수 있도록 하는 오픈 에픽이 있습니다. 이 에픽이 해결될 때까지 릴리스된 종속성 해결 문서를 참고하여 gradle.build 파일을 수정하는 방법에 대해 상세히 확인하세요.

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 오류 발생

openssh-clientgemnasium 이미지에 설치한 후에 ssh를 사용하면 Host key verification failed 메시지가 나타날 수 있습니다. 이 문제는 이미지를 빌드할 때 사용자 디렉토리를 나타내기 위해 ~를 사용할 경우 발생할 수 있습니다. 이미지 빌드시 $HOME/tmp로 설정하기 때문입니다. 이 문제에 대한 설명은 Cloning project over SSH fails when using gemnasium-python image에서 확인할 수 있습니다. 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 파일을 지정하는 UserKnownHostsFilessh 구성에 추가합니다. 예: echo 'UserKnownHostsFile /tmp/.ssh/known_hosts' >> /etc/ssh/ssh_config.