{
  "fixture": "container-image",
  "category": "image",
  "input": {
    "kind": "image",
    "ref": "alpine:3.18@sha256:fd032399cd767f310a1d1274e81cab9f0fd8a49b3589eba2c3420228cd45b6a7"
  },
  "componentsComplete": true,
  "vulnComplete": false,
  "axes": [
    "component"
  ],
  "notes": "컨테이너 이미지(입력 타입 image). alpine:3.18 을 linux/amd64 플랫폼 전용 이미지의 sha256 해시(fd032399, 3.18.12)로 고정해 OS 패키지(apk) 15개가 결정적이다. 이전에는 멀티 아키텍처 목록(manifest list)의 해시를 써서 스캔 호스트에 따라 arch 가 달라졌는데(재현성 문제), 플랫폼 전용 해시로 바꿔 어느 호스트에서나 같은 이미지를 스캔한다. amd64 실측(apk info -v)으로 15종 정답이 arch 무관임을 확인했다. 입력 타입을 새로 연다 — image 를 지원하는 syft·trivy·grype 만 스캔하고, source 전용 도구(osv·cdxgen·bomlens·dependency-check·scancode)는 supports 에서 빠져 미지원(N/A)이 된다. 패치된 이미지라 trivy 동결 DB(2026-06-30) 기준 취약점이 0 이므로 컴포넌트 축만 채점한다(axes=[component]). OS 패키지는 scope 구분이 약해 모두 direct 로 두고 버전까지 매칭한다(apk 버전은 sha256 해시 고정으로 결정적). OS 패키지 CVE 측정은 취약 이미지로 후속한다. 측정에서 드러난 점: syft·trivy 는 완전 SBOM(15/15)을 내지만, grype 출력에는 전체 artifacts 가 없고 matches(취약점)만 있어 grype 어댑터가 취약점 매칭 패키지만 컴포넌트로 잡아 recall 0.4(6/15)에 그친다(grype 의 컴포넌트는 SBOM 이 아니라 취약점 부산물). 또 grype 동결 DB 는 이 이미지에서 14건 취약점(busybox·musl·zlib 등)을 보고하나 trivy 동결 DB 는 0 으로, 같은 이미지에 도구 DB 차이가 크다.",
  "components": [
    {
      "purl": "pkg:apk/alpine/alpine-baselayout@3.4.3-r1",
      "version": "3.4.3-r1",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/alpine-baselayout-data@3.4.3-r1",
      "version": "3.4.3-r1",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/alpine-keys@2.4-r1",
      "version": "2.4-r1",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/apk-tools@2.14.4-r0",
      "version": "2.14.4-r0",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/busybox@1.36.1-r7",
      "version": "1.36.1-r7",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/busybox-binsh@1.36.1-r7",
      "version": "1.36.1-r7",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/ca-certificates-bundle@20241121-r1",
      "version": "20241121-r1",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/libc-utils@0.7.2-r5",
      "version": "0.7.2-r5",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/libcrypto3@3.1.8-r0",
      "version": "3.1.8-r0",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/libssl3@3.1.8-r0",
      "version": "3.1.8-r0",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/musl@1.2.4-r3",
      "version": "1.2.4-r3",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/musl-utils@1.2.4-r3",
      "version": "1.2.4-r3",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/scanelf@1.3.7-r1",
      "version": "1.3.7-r1",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/ssl_client@1.36.1-r7",
      "version": "1.36.1-r7",
      "licenses": [],
      "scope": "direct"
    },
    {
      "purl": "pkg:apk/alpine/zlib@1.2.13-r1",
      "version": "1.2.13-r1",
      "licenses": [],
      "scope": "direct"
    }
  ],
  "vulnerabilities": [],
  "buildTarget": "linux/amd64",
  "fpReasons": [
    {
      "id": "pkg:apk/alpine/openssl",
      "reason": "설치 패키지가 아닌 소스 패키지(origin) 이름으로 보고했다 — 정답은 이미지에 실제 설치된 패키지 기준(libssl3, libcrypto3 의 소스 패키지)"
    },
    {
      "id": "pkg:apk/alpine/ca-certificates",
      "reason": "설치 패키지가 아닌 소스 패키지(origin) 이름으로 보고했다 — 정답은 이미지에 실제 설치된 패키지 기준(ca-certificates-bundle 의 소스 패키지)"
    },
    {
      "id": "pkg:apk/alpine/libc-dev",
      "reason": "설치 패키지가 아닌 소스 패키지(origin) 이름으로 보고했다 — 정답은 이미지에 실제 설치된 패키지 기준(libc-utils 의 소스 패키지)"
    },
    {
      "id": "pkg:apk/alpine/pax-utils",
      "reason": "설치 패키지가 아닌 소스 패키지(origin) 이름으로 보고했다 — 정답은 이미지에 실제 설치된 패키지 기준(scanelf 의 소스 패키지)"
    },
    {
      "id": "pkg:generic/busybox",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/apk",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/ldconfig",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/getconf",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/getent",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/iconv",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/ldd",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/scanelf",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/ssl_client",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/ld-musl-x86_64.so.1",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/libapk.so.2.14.0",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/libcrypto.so.3",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/libssl.so.3",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    },
    {
      "id": "pkg:generic/libz.so.1.2.13",
      "reason": "패키지에 속한 개별 실행파일/라이브러리를 별도 컴포넌트로 냈다 — 설치 패키지(busybox, musl 등)와 중복이라 정답에서 제외"
    }
  ]
}
