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)
기본적으로 도구는 이미지 레퍼런스(참조)를 기대해요. 예를 들면:
rediscurlimages/curl:7.87.0mcr.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