SBOM 제출 전 검증 체크리스트

SBOM 제출 전 필수 확인 사항을 점검하여 반려를 방지합니다.

필수 점검 항목

아래 체크리스트를 통과하지 못한 SBOM은 시스템에서 자동으로 반려될 수 있습니다. 2~4번 항목은 아래 검증 도구의 BomLens 자동 검증으로 한 번에 확인할 수 있습니다.

1. 파일 무결성

  • 파일 확장자가 .json 또는 .xml 인가? (압축 파일 아님)
  • 파일 크기가 1KB 이상이며, 내용이 비어있지 않은가?
  • JSON 문법 오류가 없는가?

아래 명령으로 확인하시기 바랍니다. 오류 없이 종료되면 통과입니다.

jq empty sbom.json && echo "OK: valid JSON"

2. 필수 데이터 필드

  • bomFormat: CycloneDX 또는 SPDX가 명시되었는가?
  • Metadata: 최상위 컴포넌트(납품 프로젝트)의 이름과 버전이 정확한가?
  • Components: 포함된 라이브러리 목록이 실제와 일치하는가?

3. 의존성 완전성 확인

전이적 의존성 누락은 가장 흔한 반려 사유입니다. 아래 항목을 반드시 확인하시기 바랍니다.

  • 직접 의존성(프로젝트가 직접 선언한 라이브러리)이 모두 포함되어 있는가?
  • 전이적 의존성(직접 의존성이 내부적으로 사용하는 라이브러리)이 포함되어 있는가?
  • SBOM 생성 전 빌드(또는 패키지 설치)를 완료하였는가? (예: npm install, mvn package, pip install)
  • 컴포넌트 수가 합리적인가? (직접 의존성만 몇 개인 프로젝트에서 총 컴포넌트 수가 10개 미만이라면 전이적 의존성이 누락되었을 가능성이 높음)
  • Maven·Gradle 프로젝트를 Syft로만 스캔하지 않았는가? Syft는 pom.xml이나 빌드 스크립트의 직접 선언만 읽어 전이 의존성이 빠집니다. cdxgen이나 언어별 CycloneDX 플러그인을 사용하시기 바랍니다.
  • npm 개발 의존성을 포함해야 하는데 빠지지 않았는가? Syft는 기본값으로 제외하므로 SYFT_JAVASCRIPT_INCLUDE_DEV_DEPENDENCIES=true를 지정해야 포함됩니다.
  • 서버 납품인 경우 OS 패키지가 포함되어 있는가? 애플리케이션 소스만 스캔하면 설치된 rpm/dpkg 패키지가 통째로 빠집니다. 절차는 SBOM 생성 방법의 서버 납품 절을 참고하세요.

4. 식별자 (PURL) 확인

SK텔레콤 시스템은 PURL로 취약점을 매핑합니다. 가장 중요한 항목입니다.

  • 모든 컴포넌트(components) 객체 안에 purl 필드가 존재하는가?
  • purl 보유 컴포넌트 수가 전체 컴포넌트 수와 일치(또는 근접)하는가?
  • PURL 형식이 표준(pkg:type/namespace/name@version)을 따르는가?
  • PURL 내에 특수문자 등이 올바르게 인코딩되었는가?
  • PURL이 실제 설치된 것과 같은 배포판·버전을 가리키는가? 예를 들어 RHEL 서버인데 pkg:deb/debian/...으로 선언되어 있으면, 형식은 올바르므로 매칭은 성공하지만 실제와 무관한 컴포넌트의 취약점이 보고됩니다.
  • rpm/deb/apk 패키지의 배포판이 네임스페이스(타입과 패키지 이름 사이)에 있는가? 물음표 뒤 쿼리 파라미터(?distro=...)에만 있으면 인식되지 않아 네임스페이스가 빈 것과 동일하게 반려됩니다.
  • 바이너리 스캔에서 purl 없는 항목이 생기지 않았는가? Syft의 바이너리 카탈로거는 생태계를 특정하지 못한 항목을 purl 없이 남길 수 있습니다. 해당 항목은 제거하거나 실제 컴포넌트로 보완합니다.

아래 명령으로 purl 개수를 직접 확인하시기 바랍니다. 전체 컴포넌트 수와 purl 보유 수가 같아야 합니다.

# CycloneDX — 두 값이 같아야 한다
jq '.components | length' sbom.json                      # 전체 컴포넌트 수
jq '[.components[] | select(.purl)] | length' sbom.json  # purl 보유 수

# SPDX — purl(externalRef) 보유 패키지 수
jq '[.packages[] | select(.externalRefs[]?.referenceType == "purl")] | length' sbom.json

# CycloneDX — rpm/deb/apk 중 배포판 네임스페이스가 비어 있는 개수 (0이어야 한다)
jq '[.components[] | (.purl // "") | select(test("^pkg:(rpm|deb|apk)/[^/@]+@"))] | length' sbom.json

purl 보유 수가 0이거나 전체 컴포넌트 수보다 현저히 적으면 제출하지 마십시오. 원인과 재생성 방법은 자주 발생하는 반려 사유를 참고하십시오.

검증 도구

BomLens 자동 검증 (권장)

BomLens의 SBOM 분석 기능은 위 체크리스트의 2~4번을 포함해 제출 요구사항을 자동으로 점검합니다. v1.8.0 이상이 필요합니다.

./scripts/scan-sbom.sh --project my-app --version 1.0.0 \
  --analyze "./sbom.json" \
  --lang ko \
  --generate-only

실행하면 my-app_1.0.0/ 폴더에 적합성 리포트(my-app_1.0.0_conformance.html)가 생성됩니다. 리포트가 자동으로 확인하는 항목은 다음과 같습니다.

BomLens로 SBOM을 직접 생성한 경우에도 이 명령으로 한 번 더 점검하시기 바랍니다. 방금 만든 SBOM을 그대로 --analyze에 넣으면 됩니다 — 생성과 검증을 한 번에 하지 않는 이유는, 갓 만든 SBOM이 자기 자신을 채점하는 것보다 별도 단계로 재확인하는 편이 실수를 더 잘 잡아내기 때문입니다.

검사 항목체크리스트 대응
스펙 버전 범위 (CycloneDX 1.31.6, SPDX 2.22.3)2. 필수 데이터 필드
생성 일시, 생성 도구, 최상위 컴포넌트 이름·버전2. 필수 데이터 필드
모든 컴포넌트의 이름·버전2. 필수 데이터 필드
직접·전이적 의존성 포함 여부3. 의존성 완전성 확인
PURL 보유율, 표준 형식(pkg:type/name@version), pkg:generic 금지4. 식별자 (PURL) 확인
라이선스·해시 보유율 (권장 항목)

결과가 fail이면 어떤 컴포넌트가 어느 항목에 미달하는지 목록으로 표시되므로, 해당 부분을 보완해 SBOM을 다시 생성한 뒤 재검증하면 됩니다. 웹 UI(--ui 실행 후 SBOM 업로드)에서도 같은 검증을 할 수 있습니다.

제출 전에는 위 명령에 --conformance-profile skt-submission을 추가해서, SK텔레콤 심사와 같은 기준(PURL 포함률 100%, pkg:generic 식별자 없음)으로 확인하시기 바랍니다. 웹 UI의 제출 검토 화면은 이 기준을 이미 기본값으로 적용하므로, 이 옵션은 CLI를 직접 실행할 때만 필요합니다.

CycloneDX Validator (스키마 검사)

CycloneDX 파일이 표준 스키마에 맞는지 확인하는 온라인 도구입니다. JSON 문법과 형식 오류(체크리스트 1번)를 설치 없이 빠르게 확인할 때 유용합니다. 다만 스키마 검사만 수행하므로, 통과하더라도 2~4번(필수 필드, 의존성 완전성, PURL)을 충족한다는 뜻은 아닙니다. SPDX 파일은 이 도구로 검사할 수 없습니다.

관련 문서