docker scout cves

docker scout cves

docker scout cves는 소프트웨어 아티팩트에서 식별된 CVE(취약점)를 보여 주는 명령이에요. 이미지나 파일에 알려진 취약점이 있는지 확인하고 싶을 때 써요.

출처: 문서

본문

docker scout cves 명령은 소프트웨어 아티팩트를 분석해 취약점을 찾아요. 이미지를 지정하지 않으면 가장 최근에 빌드된 이미지를 사용해요.

지원되는 아티팩트 유형은 다음과 같아요:

  • 이미지 (Images)
  • OCI 레이아웃 디렉터리 (OCI layout directories)
  • docker save로 만든 tarball 아카이브 (Tarball archives)
  • 로컬 디렉터리 또는 파일 (Local directory or file)

기본적으로 도구는 이미지 레퍼런스(참조)를 기대해요. 예를 들면:

  • redis
  • curlimages/curl:7.87.0
  • mcr.microsoft.com/dotnet/runtime:7.0

분석하려는 아티팩트가 OCI 디렉터리·tarball 아카이브·로컬 파일이나 디렉터리이거나, 이미지가 어디서 해석될지(레지스트리 조회 여부) 제어하고 싶다면 레퍼런스 앞에 다음 접두사 중 하나를 붙여야 해요:

  • image:// (기본값) 로컬 이미지를 사용하거나, 없다면 레지스트리 조회로 폴백해요
  • local:// 로컬 이미지 스토어의 이미지를 사용해요 (레지스트리 조회 안 함)
  • registry:// 레지스트리의 이미지를 사용해요 (로컬 이미지 사용 안 함)
  • oci-dir:// OCI 레이아웃 디렉터리를 사용해요
  • archive:// docker save로 만든 tarball 아카이브를 사용해요
  • fs:// 로컬 디렉터리 또는 파일을 사용해요
  • sbom:// SPDX predicate가 있는 SPDX 파일 또는 in-toto attestation 파일, syft json SBOM 파일을 사용해요

sbom:// 접두사에서는 파일이 정의되어 있지 않으면 표준 입력(stdin)에서 읽으려고 해요.

사용법 (Usage)

docker scout cves [OPTIONS] [IMAGE|DIRECTORY|ARCHIVE]

옵션 (Options)

옵션 기본값 설명
--details 기본 텍스트 출력에 상세 내용을 출력해요
--env 환경의 이름이에요
--epss EPSS 점수를 표시하고 패키지의 CVE를 EPSS 점수에 따라 정리해요
--epss-percentile 지정한 백분위수(0~1)보다 낮은 EPSS 점수의 CVE를 제외해요
--epss-score 지정한 값(0~1)보다 낮은 EPSS 점수의 CVE를 제외해요
-e, --exit-code 취약점이 감지되면 종료 코드 2를 반환해요
--format packages 생성된 취약점 보고서의 출력 형식이에요: packages(기본 출력, 취약점을 패키지별로 그룹화한 일반 텍스트), sarif(json Sarif 출력), spdx(json SPDX 출력), gitlab(json GitLab 출력), markdown(markdown 출력, 접이식 섹션 같은 일부 html 태그 포함), sbom(json SBOM 출력)
--ignore-base 기본 이미지에서 도입된 CVE를 걸러 내요
--ignore-suppressed 지정된 예외 범위를 기준으로 Scout 예외에 있는 CVE를 걸러 내요
--locations 파일 경로와 레이어 diff_id를 포함한 패키지 위치를 출력해요
--multi-stage 다단계 Docker 빌드의 패키지를 보여 줘요
--only-base 기본 이미지가 도입한 CVE만 보여 줘요
--only-cisa-kev CISA KEV 카탈로그에 나열된 CVE로 걸러 내요
--only-cve-id 검색할 CVE ID의 쉼표 구분 목록이에요 (예: CVE-2021-45105)
--only-fixed 수정 가능한 CVE로 걸러 내요
--only-metric CVE를 필터링할 CVSS 메트릭의 쉼표 구분 목록이에요 (예: AV:N 또는 PR:L)
--only-package 패키지를 필터링하는 쉼표 구분 정규 표현식이에요
--only-package-type 패키지 유형의 쉼표 구분 목록이에요 (예: apk, deb, rpm, npm, pypi, golang 등)
--only-severity CVE를 필터링할 심각도의 쉼표 구분 목록이에요 (critical, high, medium, low, unspecified)
--only-stage 다단계 Docker 빌드 단계 이름의 쉼표 구분 목록이에요
--only-unfixed 수정되지 않은 CVE로 걸러 내요
--only-vex-affected 상태가 not affected가 아닌 VEX 문으로 CVE를 필터링해요
--only-vuln-packages --format=only-packages와 함께 쓸 때 취약점이 없는 패키지를 무시해요
--org Docker 조직의 namespace예요
-o, --output 보고서를 파일로 써요
--platform 분석할 이미지의 플랫폼이에요
--ref 제공된 tarball이 여러 참조를 포함하면 사용할 참조예요. archive에서만 사용할 수 있어요
--vex-author [] 수락할 VEX 문 작성자 목록이에요
--vex-location VEX 문이 들어 있는 디렉터리 또는 파일의 위치예요

예제 (Examples)

패키지별로 그룹화된 취약점 표시하기

$ docker scout cves alpine
Analyzing image alpine
✓ Image stored for indexing
✓ Indexed 18 packages
✓ No vulnerable package detected

docker save tarball의 취약점 표시하기

$ docker save alpine > alpine.tar

$ docker scout cves archive://alpine.tar
Analyzing archive alpine.tar
✓ Archive read
✓ SBOM of image already cached, 18 packages indexed
✓ No vulnerable package detected

OCI 디렉터리의 취약점 표시하기

$ skopeo copy --override-os linux docker://alpine oci:alpine

$ docker scout cves oci-dir://alpine
Analyzing OCI directory alpine
✓ OCI directory read
✓ Image stored for indexing
✓ Indexed 19 packages
✓ No vulnerable package detected

현재 디렉터리의 취약점 표시하기

$ docker scout cves fs://.

취약점을 SARIF JSON 파일로 내보내기

$ docker scout cves --format sarif --output alpine.sarif.json alpine
Analyzing image alpine
✓ SBOM of image already cached, 18 packages indexed
✓ No vulnerable package detected
✓ Report written to alpine.sarif.json

markdown 출력 표시하기

다음 예제는 취약점 보고서를 markdown으로 생성하는 방법을 보여 줘요.

$ docker scout cves --format markdown alpine
✓ Pulled
✓ SBOM of image already cached, 19 packages indexed
✗ Detected 1 vulnerable package with 3 vulnerabilities
<h2>:mag: Vulnerabilities of <code>alpine</code></h2>

<details open="true"><summary>:package: Image Reference</strong> <code>alpine</code></summary>
<table>
<tr><td>digest</td><td><code>sha256:e3bd82196e98898cae9fe7fbfd6e2436530485974dc4fb3b7ddb69134eda2407</code></td><tr><tr><td>vulnerabilities</td><td><img alt="critical: 0" src="https://img.shields.io/badge/critical-0-lightgrey"/> <img alt="high: 0" src="https://img.shields.io/badge/high-0-lightgrey"/> <img alt="medium: 2" src="https://img.shields.io/badge/medium-2-fbb552"/> <img alt="low: 0" src="https://img.shields.io/badge/low-0-lightgrey"/> <img alt="unspecified: 1" src="https://img.shields.io/badge/unspecified-1-lightgrey"/></td></tr>
<tr><td>platform</td><td>linux/arm64</td></tr>
<tr><td>size</td><td>3.3 MB</td></tr>
<tr><td>packages</td><td>19</td></tr>
</table>
</details></table>
</details>
...

특정 유형의 취약한 패키지 모두 나열하기

다음 예제는 지정된 유형의 패키지만 포함하고, 취약한 패키지만 보여 주는 패키지 목록을 생성하는 방법을 보여 줘요.

$ docker scout cves --format only-packages --only-package-type golang --only-vuln-packages golang:1.18.0
✓ Pulled
✓ SBOM of image already cached, 296 packages indexed
✗ Detected 1 vulnerable package with 40 vulnerabilities

Name   Version   Type         Vulnerabilities
───────────────────────────────────────────────────────────
stdlib  1.18     golang     2C    29H     8M     1L

EPSS 점수 표시 (--epss)

--epss 플래그는 Exploit Prediction Scoring System(EPSS) 점수를 docker scout cves 출력에 추가해요. EPSS 점수는 소프트웨어 취약점이 향후 30일 내에 실제로 악용될 가능성(확률)의 추정치예요. 점수가 높을수록 취약점이 악용될 확률이 크다는 뜻이에요.

$ docker scout cves --epss nginx
 ✓ Provenance obtained from attestation
 ✓ SBOM obtained from attestation, 232 packages indexed
 ✓ Pulled
 ✗ Detected 23 vulnerable packages with a total of 39 vulnerabilities

...

 ✗ HIGH CVE-2023-52425
   https://scout.docker.com/v/CVE-2023-52425
   Affected range  : >=2.5.0-1
   Fixed version   : not fixed
   EPSS Score      : 0.000510
   EPSS Percentile : 0.173680

EPSS Score는 0과 1 사이의 부동소수점 숫자로, 점수 발표 후 향후 30일 내에 실제로 악용될 확률을 나타내요. EPSS Percentile은 현재 점수의 백분위수, 즉 같은 점수 이하의 EPSS 점수를 가진 모든 평가된 취약점의 비율이에요.

--epss-score--epss-percentile 플래그를 사용하면 이 점수를 기준으로 docker scout cves의 출력을 필터링할 수 있어요. 예를 들어, EPSS 점수가 0.5보다 높은 취약점만 보여 주려면:

$ docker scout cves --epss --epss-score 0.5 nginx
 ✓ SBOM of image already cached, 232 packages indexed
 ✓ EPSS scores for 2024-03-01 already cached
 ✗ Detected 1 vulnerable package with 1 vulnerability

...

 ✗ LOW CVE-2023-44487
   https://scout.docker.com/v/CVE-2023-44487
   Affected range  : >=1.22.1-9
   Fixed version   : not fixed
   EPSS Score      : 0.705850
   EPSS Percentile : 0.979410

EPSS 점수는 매일 업데이트돼요. 기본적으로 가장 최근에 사용 가능한 점수가 표시돼요. --epss-date 플래그를 사용해 EPSS 점수를 가져올 날짜를 yyyy-mm-dd 형식으로 직접 지정할 수 있어요.

$ docker scout cves --epss --epss-date 2024-01-02 nginx

SPDX 파일에서 취약점 나열하기

다음 예제는 syft를 사용해 SPDX 파일에서 취약점 목록을 생성하는 방법을 보여 줘요.

$ syft -o spdx-json alpine:3.16.1 | docker scout cves sbom://
 ✔ Pulled image
 ✔ Loaded image                                                                                                                              alpine:3.16.1
 ✔ Parsed image                                                                    sha256:3d81c46cd8756ddb6db9ec36fa06a6fb71c287fb265232ba516739dc67a5f07d
 ✔ Cataloged contents                                                                     274a317d88b54f9e67799244a1250cad3fe7080f45249fa9167d1f871218d35f
   ├── ✔ Packages                        [14 packages]
   ├── ✔ File digests                    [75 files]
   ├── ✔ File metadata                   [75 locations]
   └── ✔ Executables                     [16 executables]
    ✗ Detected 2 vulnerable packages with a total of 11 vulnerabilities

더 알아보기 (Learn more)