소프트웨어 자재 명세서(SBOM)

소프트웨어 자재 명세서(“SBOM”으로 약칭)는 소프트웨어와 그 구성 방식에 관한 정보를 공유하기 위한 문서입니다. 이 형식은 보안 분야에서 CVEOSV 같은 취약점 데이터베이스를 사용하여 소프트웨어와 그 종속성의 취약점을 검사하는 데 가장 흔히 사용됩니다. CPython 프로젝트에서 사용하는 SBOM 형식은 SPDX이며, 사용자가 필요하면 다른 형식으로 변환할 수 있습니다.

CPython의 서드 파티 종속성은 여러 출처에서 가져옵니다. 일부는 CPython 자체의 소스 코드에 벤더링되어 있으며(Modules/_decimal/libmpdec에 벤더링된 mpdecimal 등), 또는 Windows 빌드처럼 python/cpython-source-deps 저장소의 종속성을 사용하여 빌드 중에 선택적으로 가져올 수도 있습니다.

서드 파티 종속성을 추가하거나 업데이트할 때마다 버전과 소프트웨어 식별자를 추적하기 위해 SBOM도 업데이트해야 할 가능성이 큽니다.

종속성 업데이트

CPython에 번들로 포함된 종속성의 SBOM은 Misc/sbom.spdx.json에 보관됩니다. 종속성을 새 버전으로 업데이트할 때는 SBOM에서 해당 종속성의 버전과 기타 메타데이터를 편집해야 합니다.

권장 작업 절차는 다음과 같습니다.

  1. 새 종속성을 아카이브로 다운로드하십시오. 새 버전, 다운로드 URL, 다운로드한 아카이브의 체크섬을 기록하십시오.

  2. CPython 소스 트리의 벤더링된 코드를 업데이트하십시오.

  3. 관련 Misc/sbom.spdx.json을 편집하여 해당 package에 새 versionInfo, downloadLocation, checksums, externalReferences를 추가하십시오. 이러한 업데이트는 대부분 URL과 프로젝트 식별자에 포함된 버전만 업데이트하면 됩니다. filesrelationships 안의 정보는 SBOM 도구가 자동으로 생성하므로 업데이트하지 마십시오.

  4. make regen-sbom 또는 python Tools/build/generate_sbom.py를 실행하십시오. 이 작업이 유효성 검사 오류로 실패하지 않는지 확인하십시오.

  5. git diff Misc/sbom.spdx.json을 실행하고 차이점이 예상한 변경 사항과 일치하는지 확인하십시오.

  6. 종속성 코드 업데이트와 함께 Misc/sbom.spdx.json 변경 사항을 커밋하십시오.

새 종속성 추가

종속성을 추가할 때는 다음 정보를 확보하는 것이 중요합니다.

  • 프로젝트의 이름, 버전, 다운로드 URL

  • SPDX License Expression으로 표현한 프로젝트의 라이선스

  • 취약점 데이터베이스의 값과 일치하는 소프트웨어 식별자(CPEPackage URLs 또는 “PURLs”)

  • 이 종속성에 해당하며 CPython 소스 트리에서 포함하거나 제외할 경로

이 정보를 수집한 후에는 다음을 수행하십시오.

  1. 관련 Misc/sbom.spdx.json 파일의 packages 내 새 항목에 정보를 추가하십시오. 형식은 걱정하지 마십시오. 도구가 수동으로 작성한 JSON의 형식을 자동으로 맞춥니다. 입력해야 할 필드는 다음과 같습니다.

    • name은 프로젝트 이름입니다.

    • SPDXID"SPDXRef-PACKAGE-{name}"입니다.

    • 프로젝트 라이선스의 SPDX 라이선스 식별자는 licenseConcluded에 지정합니다.

    • 프로젝트 버전은 versionInfo에 지정합니다.

    • downloadLocation은 프로젝트를 아카이브로 다운로드할 수 있는 HTTPS URL이어야 합니다.

    • checksums[0].checksumValue.algorithm은 다운로드한 아카이브의 SHA-256 체크섬입니다.

    • 원저자 정보는 originator에 지정하고, 저자 및 유지관리 상황에 따라 Organization: 또는 Person: 접두사를 붙이십시오.

    • primaryPackagePurpose는 대개 "SOURCE"입니다.

    • externalReferences는 CPE 또는 Package URL 형식의 프로젝트 식별자 하나 이상으로 구성된 목록입니다. 식별자가 소프트웨어의 올바른 릴리스에 해당하도록 referenceLocator 값에 versionInfo 값을 포함해야 합니다. 외부 참조에 관한 자세한 내용은 SPDX SBOM specification에서 확인할 수 있습니다.

  2. 새 라이선스 ID를 사용하려면 Tools/build/generate_sbom.pyALLOWED_LICENSE_EXPRESSIONS에 라이선스 표현식을 추가하십시오.

  3. 관련 Tools/build/generate_sbom.py에서 패키지의 SBOM ID(SPDXRef-PACKAGE-* 접두사를 제외한 SPDXID)에 해당하는 키를 사용하여 포함하거나 제외할 경로를 PackageFiles 인스턴스에 추가하십시오.

  4. make regen-sbom 또는 python Tools/build/generate_sbom.py 명령으로 도구를 실행하십시오. 유효성 검사 오류로 도구 실행이 실패하지 않는지 확인하십시오.

  5. git diffMisc/sbom.spdx.json의 변경 사항을 비교하고 모든 정보가 올바른지 확인하십시오.

  6. 관련 Misc/sbom.spdx.jsonTools/build/generate_sbom.py의 변경 사항을 커밋하십시오.

의존성 제거

의존성을 제거할 때는 다음을 수행하십시오:

  1. 관련 Misc/sbom.spdx.jsonpackages 필드 아래에서 해당 항목을 제거하십시오.

  2. 관련 Tools/build/generate_sbom.py에서 해당 PackageFiles 항목을 제거하십시오.

  3. make regen-sbom 또는 python Tools/build/generate_sbom.py 명령으로 도구를 실행하십시오. 유효성 검사 오류로 도구 실행이 실패하지 않는지 확인하십시오.

  4. git diffMisc/sbom.spdx.json의 변경 사항을 비교하고 올바른 패키지가 SBOM에서 제거되었는지 확인하십시오.

  5. 관련 Misc/sbom.spdx.jsonTools/build/generate_sbom.py의 변경 사항을 커밋하십시오.