공급망 보안
소프트웨어 공급망 보안 관리를 위한 SBOM 및 취약점 관리 가이드
SBOM을 제출하러 오셨나요?
SK텔레콤에 소프트웨어를 납품하는 공급사라면 공급사 가이드에서 바로 시작하세요. 제출까지는 네 단계입니다.
- 공급사 가이드에서 요구사항을 확인합니다.
- SBOM 생성 방법에 따라 BomLens 등 도구를 선택해 SBOM을 생성합니다. 타사가 제조한 상용 완제품이라면 제조사 SBOM을 받아 제출합니다.
- 검증 체크리스트로 제출 전에 점검합니다.
- 제출 절차에 따라 제출합니다.
공급망 보안이 처음이라면
미국과 유럽의 규제 강화에 따라 SBOM(Software Bill of Materials) 관리와 체계적인 취약점 대응이 필수가 되었습니다. 배경부터 차근차근 배우려면 다음 순서를 권합니다.
- 공급망 보안이란?: 공급망 공격 사례와 보안의 필요성, 글로벌 규제 동향, SK텔레콤의 정책을 설명합니다.
- SBOM 이란?: SBOM의 개념과 표준(SPDX, CycloneDX)을 다룹니다.
문의
공급망 보안과 관련하여 문의사항이 있으시면 아래를 참고하세요.
1 - 공급사 SBOM 제출 가이드
SK텔레콤에 소프트웨어를 공급하는 파트너사를 위한 SBOM 생성 및 제출 가이드입니다.
SK텔레콤은 소프트웨어 공급망의 투명성과 보안성을 강화하기 위해, 공급사로부터 납품받는 모든 소프트웨어 구성 요소 및 의존성에 대한 SBOM(Software Bill of Materials) 제출을 요청드리고 있습니다. 본 가이드는 공급사가 SK텔레콤의 보안 정책에 맞는 형식으로 SBOM을 생성하고 제출하는 방법을 안내합니다.
빠른 시작: 제출까지 5단계
- 제출 요구사항에서 허용 포맷(CycloneDX JSON 권장)과 필수 데이터 필드를 확인합니다.
- SBOM 생성 방법에 따라 도구를 선택해 SBOM을 생성합니다. 도구 환경 구축이 부담스럽다면 BomLens를 권장합니다.
- OS 위에 애플리케이션을 얹어 납품하는 서버라면 서버 SBOM 생성에 따라 층별로 생성해 합칩니다.
- 검증 체크리스트로 PURL과 전이 의존성 포함 여부를 점검합니다.
- 제출 절차에 따라 파일명을 정하고 제출합니다.
타사가 제조한 상용 소프트웨어나 완제품을 공급해 소스코드에 접근할 수 없다면, 2~3단계 대신 상용 소프트웨어 공급에 따라 제조사로부터 SBOM을 받아 제출합니다. 제출한 SBOM이 반려되면 자주 발생하는 반려 사유에서 원인별 해결 방법을 확인합니다.
적용 대상
다음 형태의 소프트웨어를 납품하는 모든 공급사(개발사, 리셀러 포함)는 본 가이드라인의 적용을 받습니다.
- 소스코드: Java, Python, JavaScript, Go, C/C++ 등으로 작성된 애플리케이션
- 컨테이너 이미지: Docker 이미지 또는 OCI 호환 컨테이너
- 실행 파일: 컴파일된 바이너리(.jar, .dll, .so) 및 라이브러리
- 임베디드 시스템: 펌웨어 이미지, RootFS, 디바이스 드라이버
- 서버: OS(rootfs와 설치 패키지) 위에 애플리케이션과 정적 링크 라이브러리가 결합된 시스템
- 상용 소프트웨어·완제품: 타사가 제조한 패키지 소프트웨어 또는 어플라이언스 장비 (리셀러·총판 공급 포함)
SBOM 제출 프로세스
공급사는 계약 시점부터 최종 납품까지 아래의 절차에 따라 진행하시기 바랍니다.
flowchart TD
A[계약 검토] --> B["소프트웨어 개발/빌드"]
B --> C{SBOM 생성}
C -->|SKT 제공 도구 활용| D[BomLens 활용]
C -->|자체 도구 활용| E["오픈소스 도구 활용<br>(cdxgen, Syft 등)"]
C -->|상용 완제품 공급| K[제조사 SBOM 수령]
D --> F["데이터 검증 (PURL 확인)"]
E --> F
K --> F
F --> G["SBOM 제출 (이메일/지정 채널)"]
G --> H[SKT 보안성 검토]
H -->|승인| I[납품 완료]
H -->|반려| J[보완 및 재제출]
J --> F
classDef start fill:#F2F2F2,stroke:#171717,color:#171717,stroke-width:1.5px
classDef proc fill:#ffffff,stroke:#c8c8c8,color:#171717,stroke-width:1px
classDef decision fill:#FFF3CD,stroke:#E0A800,color:#5A4100,stroke-width:1.5px
classDef good fill:#D9F0E4,stroke:#00A651,color:#0A5A32,stroke-width:1.5px
classDef danger fill:#FDE1E7,stroke:#EA002C,color:#8A0019,stroke-width:1.5px
classDef vendor fill:#FFF3CD,stroke:#E0A800,color:#5A4100,stroke-width:1.5px
class A start
class B,E,F,G proc
class C,H decision
class D,I good
class J danger
class K vendor관련 문서
1.1 - SBOM 제출 요구사항
SK텔레콤 정책에 따른 표준 SBOM 형식, 필수 포함 정보, PURL 식별자 규칙을 상세히 정의합니다.
1. 표준 데이터 형식
SK텔레콤은 글로벌 표준으로 자리 잡은 두 가지 형식을 모두 지원합니다. 공급사는 사용하는 도구가 지원하는 형식을 선택하여 제출할 수 있습니다.
| 형식 | 버전 | 권장 용도 | 파일 형식 |
|---|
| CycloneDX | v1.3, v1.4, v1.5, v1.6 | 애플리케이션 보안, 취약점 관리 중심 | JSON (권장), XML |
| SPDX | v2.2, v2.3 | 라이선스 컴플라이언스 중심 | JSON, Tag-Value |
참고: 두 형식 모두 동등하게 인정되나, 내부 시스템 연동성을 위해 CycloneDX (JSON) 형식을 권장합니다.
요구 수준 요약
각 항목의 요구 수준입니다. 필수 항목이 누락되면 반려됩니다. 권장 항목은 없어도 반려되지 않지만 포함을 권합니다.
| 항목 | 수준 | 상세 |
|---|
| 표준 포맷과 버전 (CycloneDX 또는 SPDX) | 필수 | 1. 표준 데이터 형식 |
| 메타데이터 (생성 일시, 생성 도구, 최상위 컴포넌트) | 필수 | 2.1 메타데이터 |
| 컴포넌트 이름과 버전 | 필수 | 2.2 컴포넌트 정보 |
| 직접·전이적 의존성 포함 | 필수 | 2.3 의존성 범위 |
PURL (표준 pkg: 형식, generic 금지) | 필수 | 3. PURL 준수 |
| 개발 전용 의존성 | 권장 | 2.3 의존성 범위 |
| 라이선스 정보 | 권장 | 4. 샘플 문서 |
합격 기준을 충족하는 예시 SBOM 파일 (CycloneDX 1.6 JSON)을 내려받아 구조를 비교해 보시기 바랍니다.
2. 필수 포함 정보
제출하는 SBOM 문서에는 다음 정보가 반드시 포함되어야 합니다. 정보가 누락되면 반려될 수 있습니다.
문서 자체와 생성 도구에 대한 정보입니다.
- Timestamp: 생성 일시 (ISO 8601 형식)
- Tool Info: 생성 도구의 벤더, 이름, 버전 (예:
CycloneDX-Maven-Plugin v2.7.9) - Component Info: 납품하는 최상위 소프트웨어의 명칭 및 버전
생성 도구 명시 형식
생성 도구 정보는 형식에 따라 다음 필드에 기재해야 합니다.
- SPDX:
creationInfo.creators 필드에 Tool: 접두어로 도구명과 버전 기재 - CycloneDX:
metadata.tools 배열에 vendor, name, version 기재
// SPDX creationInfo 예시
"creationInfo": {
"created": "2026-04-06T03:22:00Z",
"creators": ["Tool: Syft-0.98.0", "Organization: VendorName"]
}
2.2 컴포넌트 정보 (Components)
소프트웨어를 구성하는 개별 라이브러리 정보입니다.
- Name: 컴포넌트 이름 (예:
commons-lang3) - Version: 컴포넌트 버전 (예:
3.12.0) — 필수. SPDX는 versionInfo, CycloneDX는 version 필드에 정확한 버전을 기재합니다. 버전이 없으면 취약점 매핑이 불가능합니다. - PURL (Package URL): [필수] 패키지 식별자
2.3 의존성 범위 (Dependency Scope)
중요: 전이적 의존성(Transitive Dependencies)을 반드시 포함해야 합니다.
SK텔레콤은 제출된 SBOM을 기반으로 취약점을 분석합니다. 직접 의존성만 포함된 SBOM은 숨겨진 취약점을 놓칠 수 있으므로 반려될 수 있습니다.
| 의존성 종류 | 설명 | 포함 여부 |
|---|
| 직접 의존성 (Direct) | 프로젝트가 직접 선언한 라이브러리 | 필수 |
| 전이적 의존성 (Transitive) | 직접 의존성이 다시 의존하는 라이브러리 | 필수 |
| 개발 전용 의존성 (Dev-only) | 테스트, 빌드 도구 등 런타임 미포함 라이브러리 | 권장 포함 |
전이적 의존성이란?
예를 들어 프로젝트가 library-A를 직접 사용하고, library-A가 내부적으로 library-B를 사용하는 경우, library-B가 전이적 의존성입니다. library-B에 취약점이 있어도 SBOM에 포함되지 않으면 탐지할 수 없습니다.
올바른 SBOM 생성을 위한 전제 조건
전이적 의존성이 정확하게 포함되려면 빌드(또는 패키지 설치)가 완료된 상태에서 SBOM을 생성해야 합니다. 소스코드만 있는 상태에서는 전이적 의존성이 누락될 수 있습니다.
- Java (Maven):
mvn package 또는 mvn dependency:resolve 실행 후 생성 - Java (Gradle):
./gradlew dependencies 실행 후 생성 - Python:
pip install -r requirements.txt (가상환경 활성화) 후 생성 - Node.js:
npm install 또는 yarn install 실행 후 생성 - Go:
go mod download 실행 후 생성
각 도구별 전이적 의존성 포함 방법은 오픈소스 도구 활용 가이드를 참고하시기 바랍니다.
3. Package URL (PURL) 준수
PURL(Package URL)은 소프트웨어 패키지를 고유하게 식별하기 위한 표준 URL 형식입니다. SK텔레콤의 취약점 분석 시스템은 PURL을 기준으로 동작하므로, 모든 컴포넌트에 유효한 PURL이 포함되어야 합니다.
PURL은 반드시 pkg: 접두어로 시작하는 표준 형식이어야 합니다. name:version, org/repo:tag 등 자유 텍스트는 허용되지 않으며, 이 경우 취약점 매핑이 불가능해 반려됩니다. 타입은 생태계를 특정해야 하며 pkg:generic/은 허용되지 않습니다.
언어별 PURL 예시
| 생태계 | PURL 형식 예시 |
|---|
| Java (Maven) | pkg:maven/org.springframework/spring-core@5.3.20 |
| JavaScript (NPM) | pkg:npm/express@4.18.2 |
| Python (PyPI) | pkg:pypi/django@4.1.0 |
| Go | pkg:golang/github.com/gin-gonic/gin@v1.8.1 |
| .NET (NuGet) | pkg:nuget/Newtonsoft.Json@13.0.1 |
| Ruby (RubyGems) | pkg:gem/rails@7.0.4 |
| GitHub (Actions·소스 호스팅) | pkg:github/actions/checkout@v3 |
| OS 패키지 (RPM) | pkg:rpm/centos/glibc@2.17-317.el7?arch=x86_64 |
올바른 / 잘못된 PURL 예시
| 잘못된 예 | 올바른 예 |
|---|
commons-lang3:3.12.0 | pkg:maven/org.apache.commons/commons-lang3@3.12.0 |
actions/checkout:v3 | pkg:github/actions/checkout@v3 |
lodash@4.17.21 | pkg:npm/lodash@4.17.21 |
pkg:generic/foo@1.0 | (생태계에 맞는 타입으로 변경) |
PURL에 대한 자세한 사양은 Package URL 공식 스펙을 참고하시기 바랍니다.
4. 샘플 문서
CycloneDX 샘플
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"version": 1,
"metadata": {
"timestamp": "2026-04-06T10:30:00Z",
"tools": [{
"vendor": "Example Corp",
"name": "cyclonedx-maven-plugin",
"version": "2.7.9"
}],
"component": {
"type": "application",
"name": "PaymentModule",
"version": "2.1.0",
"purl": "pkg:maven/com.example/payment-module@2.1.0"
}
},
"components": [{
"type": "library",
"name": "spring-core",
"version": "5.3.20",
"purl": "pkg:maven/org.springframework/spring-core@5.3.20",
"licenses": [{
"license": {
"id": "Apache-2.0"
}
}]
}]
}
참고 자료
관련 문서
1.2 - 오픈소스 도구를 활용한 SBOM 생성
범용 오픈소스 도구를 활용하여 환경별로 SBOM을 생성하는 방법을 안내합니다.
도구 환경 구축에 익숙하지 않은 경우, Docker가 설치되어 있다면 BomLens를 먼저 검토해 보시기 바랍니다.
도구 선택 가이드
graph TD
A{{"공급 소프트웨어 분류"}}
subgraph G1["소프트웨어 공급"]
direction LR
T1["소스코드·앱<br>(예: OSS/BSS, 관리 포털, 미들웨어)"]
T2["실행 파일·라이브러리<br>(예: .jar, .dll, .so)"]
T3["OS 없는 펌웨어<br>(예: 베어메탈·RTOS 단말)"]
end
subgraph G2["OS(예: Linux) 포함 공급"]
direction LR
T4["컨테이너 이미지<br>(예: CNF, 컨테이너형 네트워크 기능)"]
T5["서버·VM 이미지<br>(예: VNF, 서버 어플라이언스)"]
T6["OS 내장 펌웨어<br>(예: 기지국, 라우터, OLT/ONT, 셋톱박스)"]
end
%% 좌측: 소스코드 스캔 서브 박스 구조
subgraph M1["소스코드 스캔"]
M1_Sub["cdxgen 또는 BomLens"]
end
%% 우측: 소스코드 + OS 이미지 스캔 서브 박스 구조 (세로 배치)
subgraph M2["소스코드 + OS 이미지 스캔"]
direction TB
M2_Top["OS (예: Linux) 스캔<br>(Syft 또는 Trivy)"]
M2_Bottom["소스코드 스캔<br>(cdxgen 또는 BomLens)"]
end
A --> G1
A --> G2
%% 그룹 박스 경계로만 연결 (박스당 화살표 1개)
G1 --> M1
G2 --> M2
%% 그룹 박스에서 다음 단계로 연결
M1 --> P(["SBOM 제출"])
M2 --> P
classDef start fill:#F2F2F2,stroke:#171717,color:#171717,stroke-width:1.5px
classDef typebox fill:#ffffff,stroke:#c8c8c8,color:#171717,stroke-width:1px
classDef submit fill:#F2F2F2,stroke:#171717,color:#171717,stroke-width:1.5px
%% 내부 단일 박스용 흰색 스타일 정의 (좌/우 테두리 색상 구분)
classDef subwhite_left fill:#ffffff,stroke:#00A651,color:#171717,stroke-width:1px
classDef subwhite_right fill:#ffffff,stroke:#68127A,color:#171717,stroke-width:1px
class A start
class T1,T2,T3,T4,T5,T6 typebox
class M1_Sub subwhite_left
class M2_Top,M2_Bottom subwhite_right
class P submit
style G1 fill:#F1FAF5,stroke:#00A651,stroke-width:1px,color:#0A5A32
style G2 fill:#FAF4FB,stroke:#68127A,stroke-width:1px,color:#4A0D57
%% 외곽 박스 스타일 (배경색 및 테두리 유지)
style M1 fill:#D9F0E4,stroke:#00A651,stroke-width:1px,color:#0A5A32
style M2 fill:#EEDCF3,stroke:#68127A,stroke-width:1px,color:#4A0D57소스코드·앱, 실행 파일이나 라이브러리, OS 없는 펌웨어는 모두 자기가 개발한 소스코드를 cdxgen 또는 BomLens로 스캔합니다. 완성된 바이너리를 그대로 스캔하면 패키지 매니저 메타데이터가 없어 purl이 누락되고 반려됩니다.
OS나 베이스 이미지를 포함해 공급하는 경우(컨테이너 이미지, 서버, OS 내장 펌웨어)는 두 층으로 나눠 각각 스캔합니다. OS 층은 납품되는 상태의 이미지나 rootfs를 Syft 또는 Trivy로 스캔하고, 소스코드(앱 층)는 cdxgen 또는 BomLens로 스캔한 뒤 둘을 합쳐 제출합니다. 이때 OS 층의 스캔 대상은 받아온 원본 베이스가 아니라 빌드가 끝나 납품되는 이미지나 rootfs입니다. 빌드 과정에서 설치한 OS 패키지까지 포함해야 하기 때문입니다. 전체 절차는 서버 SBOM 생성을 참고하세요.
정적 링크된 라이브러리나 수동으로 넣은 바이너리는 위 어느 스캔으로도 잡히지 않는 사각지대입니다. 이 경우의 처리는 서버 SBOM 생성의 정적 링크 라이브러리 절을 참고하세요.
타사가 제조한 상용 소프트웨어나 완제품을 공급해 소스코드에 접근할 수 없는 경우는 스캔 대신 제조사로부터 SBOM을 받아 제출합니다. 상용 소프트웨어 공급을 참고하세요.
주요 도구 안내
cdxgen (소스코드 분석 권장)
Java, Python, Node.js, Go 등 다양한 언어 프로젝트를 자동 분석하여 CycloneDX 형식의 SBOM을 생성합니다.
cdxgen은 lockfile이나 매니페스트를 정적으로 해석합니다. 정확한 결과를 얻으려면 의존성이 설치되거나 해결된 상태(lockfile이 있거나 빌드한 뒤)에서 실행하시기 바랍니다. 의존성이 해결되지 않은 순수 소스만 스캔하면 일부 컴포넌트나 purl이 누락될 수 있습니다.
Syft (컨테이너 이미지 및 바이너리 분석 권장)
빌드된 컨테이너 이미지나 패키지 매니저 메타데이터가 포함된 빌드 산출물을 분석하여 OS 패키지와 애플리케이션 라이브러리를 모두 식별합니다. CycloneDX 및 SPDX 형식을 지원합니다.
경고 — 설치 디렉터리나 원시 파일 모음은 스캔하지 마십시오 (purl 누락으로 전량 반려)
syft dir: 모드로 패키지 매니저 메타데이터(package.json, go.mod, *.jar, RPM/DEB 패키지 DB 등)가
없는 설치 디렉터리나 바이너리 모음을 스캔하면, Syft가 생태계(ecosystem)를 식별하지 못해 purl이 비어 있는
SBOM이 생성됩니다. SK텔레콤 시스템은 purl로 취약점을 매핑하므로, 이런 SBOM은 매칭이 전량 실패하여 반려됩니다.
이렇게 반려된 실제 사례는 자주 발생하는 반려 사유를 참고하십시오.
Syft는 다음 대상으로 실행하시기 바랍니다.
# 권장: 빌드된 이미지 스캔 (purl과 생태계를 자동 식별)
syft <이미지명>:<태그> -o cyclonedx-json=sbom.json
# 비권장: 설치 디렉터리나 원시 파일 스캔 (purl 누락으로 반려)
syft dir:/root/nag_pkg # 패키지 매니저 메타데이터가 없으면 purl이 0개가 됩니다
생성 직후 반드시 purl 개수를 확인하시기 바랍니다. 검증 방법은 검증 체크리스트를 참고하십시오.
CentOS 등 OS 위에 애플리케이션을 올려 납품하는 서버는 OS(rootfs/이미지)와 애플리케이션 두 층으로 나눠 생성하고, 정적 링크 라이브러리는 별도로 보강한 뒤 하나로 합칩니다. OS 층은 위 경고대로 패키지 데이터베이스가 있는 rootfs나 이미지를 대상으로 해야 합니다. 전체 절차는 서버 SBOM 생성을 참고하세요.
Trivy (컨테이너 이미지 분석)
컨테이너 이미지 분석과 취약점 스캔을 함께 수행할 수 있는 올인원 도구입니다.
보안 경고 — Trivy 공급망 공격 사례 (2026년)
2026년 3월, 공격자가 aquasecurity/trivy의 기존 릴리즈 태그를 재지정하여 악성코드를 삽입하는
공급망 공격이 발생하였습니다. GitHub 릴리즈 v0.69.4(3/19) 및 DockerHub 이미지
v0.69.5·v0.69.6(3/22)이 오염된 것으로 확인되었으므로 사용을 중단하시기 바랍니다.
Trivy를 안전하게 사용하려면 다음 원칙을 따르시기 바랍니다.
GitHub Actions: 가변 태그(@master, @latest, @v1 등) 대신 고정된 Commit SHA 또는 검증된 버전 태그를 사용합니다.
# 권장: 검증된 버전 고정
- uses: aquasecurity/trivy-action@0.35.0
# 더 안전: Commit SHA 고정
- uses: aquasecurity/trivy-action@<commit-sha>
Docker 이미지: 특정 버전 태그를 명시하거나 이미지 다이제스트(@sha256:...)로 고정합니다.
docker run aquasecurity/trivy:<검증된-버전> image <대상-이미지>
공식 채널: GitHub Security Advisory를 통해 최신 보안 권고사항을 확인합니다.
이 사례는 오픈소스 도구를 도입할 때 버전을 고정하지 않으면 언제든 공급망 공격에 노출될 수 있음을 보여줍니다. 모든 외부 도구는 버전을 명시하고 무결성을 검증한 뒤 사용하시기 바랍니다.
언어별 전용 플러그인
빌드 도구 플러그인을 사용하면 더 정확한 의존성 정보를 추출할 수 있습니다.
| 언어/빌드 도구 | 플러그인/도구 | 공식 문서 |
|---|
| Java (Maven) | cyclonedx-maven-plugin | 링크 |
| Java (Gradle) | cyclonedx-gradle-plugin | 링크 |
| Python | cyclonedx-bom | 링크 |
| Node.js | @cyclonedx/cyclonedx-npm | 링크 |
| Go | cyclonedx-gomod | 링크 |
공통 주의사항
도구를 사용하기 전 아래 사항을 확인하시기 바랍니다.
- 전이적 의존성 포함 여부: 빌드(패키지 설치)가 완료된 상태에서 생성해야 전이적 의존성까지 포함됩니다. 의존성 누락은 반려 사유가 되며, 언어별 빌드 선행 명령은 제출 요구사항의 의존성 범위 절을 참고하세요.
- PURL 포함 여부: 생성된 SBOM에 모든 컴포넌트의
purl 필드가 포함되어 있는지 확인합니다. SK텔레콤 시스템은 PURL을 기반으로 취약점을 매핑합니다. 확인 명령과 재생성 절차는 검증 체크리스트를 참고하세요. - 출력 포맷: CycloneDX JSON 형식을 권장합니다. (
-o cyclonedx-json 또는 동등한 옵션 사용) - 프로젝트 정보: 메타데이터에 납품 프로젝트의 이름과 버전이 정확히 기입되었는지 확인합니다.
관련 문서
1.3 - BomLens
BomLens로 SK텔레콤 정책에 맞는 SBOM을 생성하는 방법을 안내합니다.
BomLens
BomLens는 공급사가 Docker 환경에서 SK텔레콤 정책에 맞는 산출물을 생성할 수 있는 오픈소스 도구입니다. 로컬에 언어별 도구를 따로 설치하지 않아도 여러 언어를 분석해 CycloneDX(JSON) 산출물을 만듭니다.
이 페이지는 빠른 시작만 다룹니다. 설치, 전체 옵션, 언어별 가이드, 입력 시나리오, 웹 UI 등 자세한 내용은 공식 저장소 문서를 참고하세요.
github.com/sktelecom/bomlens
버그 제보, 기능 제안, Pull Request 기여를 환영합니다.
생성되는 산출물
한 번의 실행으로 다음 세 가지가 함께 생성됩니다(--all 옵션).
| 산출물 | 파일 | 용도 |
|---|
| SBOM | {프로젝트}_{버전}_bom.json | CycloneDX 1.6 구성요소 명세 (납품 기준 산출물) |
| 오픈소스 고지문 | {프로젝트}_{버전}_NOTICE.{txt,html} | 라이선스 의무 이행을 위한 고지문 |
| 오픈소스위험분석보고서 | {프로젝트}_{버전}_risk-report.{md,html} | 라이선스와 취약점 위험 집계 |
사전 준비
BomLens는 Docker 위에서 동작합니다. Docker 엔진 20.10 이상을 설치하고 실행해 두세요. Docker가 없는 Windows에서는 무료인 Rancher Desktop을 권장합니다. 첫 실행 때 스캐너 이미지(약 3–4GB)를 내려받느라 5–15분쯤 걸립니다.
Windows에서 명령줄 없이 시작
명령줄이 익숙하지 않다면 두 가지 방법 중 하나로 SBOM을 생성할 수 있습니다. 자세한 절차는 명령줄 없이 시작하기를 참고하세요.
- 실행 파일: 최신 릴리스에서
SBOM-Generator-*.exe(BomLens 실행 파일)를 내려받아 더블클릭합니다. 이 파일은 아직 코드 서명이 되어 있지 않아 Windows SmartScreen 경고가 나타나면 “추가 정보"를 누른 뒤 “실행"을 선택합니다. - 저장소 ZIP: 저장소의
Code 버튼에서 Download ZIP을 받아 압축을 풀고 scripts\sbom-ui.bat를 더블클릭하면 브라우저에서 http://localhost:8080이 열립니다.
웹 UI에서는 오른쪽에 진행 로그가 실시간으로 표시되고, 완료되면 산출물을 내려받을 수 있습니다.

빠른 시작 (CLI)
macOS와 Linux에서는 셸에서 스크립트를 내려받아 실행합니다.
curl -O https://raw.githubusercontent.com/sktelecom/bomlens/main/scripts/scan-sbom.sh
chmod +x scan-sbom.sh
cd /path/to/my-project
/path/to/scan-sbom.sh --project "MyApp" --version "1.0.0" --all --generate-only
--generate-only는 제출 없이 로컬에 파일만 생성합니다(제출 전까지 권장).- 웹 UI로 쓰려면
./scan-sbom.sh --ui를 실행합니다(브라우저에서 http://localhost:8080). - Windows에서 명령줄을 쓸 때는 같은 명령을
scripts\scan-sbom.bat로 실행합니다(Git Bash를 거치므로 Git for Windows 필요). - GitHub URL, 소스 ZIP, Docker 이미지, 펌웨어, 바이너리 등 다른 입력 형태와 전체 옵션은 CLI 레퍼런스를 참고하세요.
더 알아보기
도구 사용법의 정본은 저장소 문서입니다.
다음 단계
SBOM을 생성한 뒤 검증 체크리스트로 파일을 확인하고 제출 절차에 따라 제출합니다. 필수 데이터 필드는 제출 요구사항, SKT 도구 대신 cdxgen, Syft 등을 직접 쓰는 방법은 오픈소스 도구 활용을 참고하세요.
1.4 - 서버(OS + 애플리케이션) SBOM 생성
CentOS 등 OS 위에 애플리케이션을 설치해 납품하는 서버의 SBOM을 OS·애플리케이션 두 층으로 나눠 생성하고, 정적 링크 라이브러리를 별도로 보강해 하나로 합쳐 제출하는 방법을 안내합니다.
이 문서는 OS 위에 애플리케이션을 얹어 서버 형태로 납품하는 공급사를 위한 심화 가이드입니다. 일반 애플리케이션 납품이라면 SBOM 생성 방법만으로 충분합니다.
서버는 두 층(OS와 애플리케이션)으로 보고 각 층을 따로 생성한 뒤 하나로 합칩니다. 두 층 모두 BomLens로 만들 수 있고, 층마다 입력만 바꾸면 됩니다. 여기에 더해, 정적 링크된 라이브러리(빌드 시 바이너리에 포함된 openssl 등)는 두 층의 스캔이 모두 놓치는 사각지대라 별도로 다룹니다. 이를 빠뜨리는 것이 서버 납품에서 가장 흔한 반려 원인입니다.
서버를 이루는 두 층
| 층 | 대상 | 누락 시 증상 |
|---|
| OS | 운영체제와 설치된 패키지 전체 (예: CentOS와 rpm 데이터베이스의 모든 패키지) | OS 취약점 누락 |
| 애플리케이션 | 납품 애플리케이션과 패키지 매니저 의존성(직접·전이) | 앱 의존성 누락 |
층별 생성
아래 명령은 BomLens의 실행 스크립트 scan-sbom.sh를 사용합니다. BomLens 설치와 기본 사용법(스크립트 내려받기, 옵션, 웹 UI 등)은 BomLens를 먼저 참고하세요. BomLens 대신 오픈소스 도구를 직접 쓴다면 OS 층은 Syft(또는 Trivy), 애플리케이션 층은 cdxgen으로 대응합니다. 사용법은 오픈소스 도구 활용을 참고합니다.
OS 층
서버의 rootfs(추출한 루트 파일시스템)나 그 컨테이너 이미지를 스캔합니다. 대상은 받아온 원본 베이스가 아니라 빌드가 끝나 납품되는 상태여야 합니다. 빌드 과정에서 설치한 OS 패키지까지 포함해야 하기 때문입니다. 패키지 데이터베이스(rpm/dpkg/apk)를 읽어 설치된 패키지를 모두 실제 purl(pkg:rpm/...)로 식별합니다.
# rootfs 디렉터리를 대상으로
scan-sbom.sh --project myserver-os --version 7 --target /path/to/server-rootfs --all --generate-only
# 서버가 컨테이너 이미지로 패키징돼 있다면
scan-sbom.sh --project myserver-os --version 7 --target myserver:7 --all --generate-only
대상에는 패키지 데이터베이스가 있어야 합니다. 설치 파일만 풀어 놓고 rpm 데이터베이스가 없는 폴더를 스캔하면 purl이 비어 반려됩니다.
애플리케이션 층
빌드를 마친 뒤 애플리케이션 소스를 스캔합니다. 패키지 매니저(Maven, npm, pip, Go modules, Conan 등)를 쓰면 전이 의존성까지 자동으로 해석됩니다.
cd /path/to/app-source
scan-sbom.sh --project myserver-app --version 2.0.0 --all --generate-only
매니페스트가 없는 순수 CMake/Make 애플리케이션은 컴포넌트 목록이 희소해지므로 --deep-license로 자체 소스의 라이선스를 보강합니다.
정적 링크 라이브러리 (사각지대)
정적 링크된 라이브러리는 패키지 매니저가 선언하지 않고 OS 패키지 데이터베이스에도 올라 있지 않아, 어느 층의 스캔도 잡지 못합니다. 완전 자동 경로가 없으므로 두 가지를 함께 씁니다. 도구가 찾을 수 있는 만큼은 납품 바이너리를 분석하고, 그래도 빠지는 부분은 빌드 스크립트에서 소스와 버전(예: openssl 1.1.1za)을 직접 기재합니다.
scan-sbom.sh --project myserver-bin --version 2.0.0 --target /path/to/delivered-binary --all --generate-only
정적 링크 구성요소의 정밀 식별은 바이너리 구성 분석(BDBA)의 몫이며, SK텔레콤이 보완 검증으로 수행합니다.
하나로 합쳐 제출
SK텔레콤 제출 시스템은 제품당 SBOM 하나를 등록합니다. 따라서 층별 SBOM을 --merge로 합쳐 단일 BOM으로 제출하고, 최상위 컴포넌트를 납품 제품명·버전으로 기재합니다. --merge는 purl 기준으로 중복을 제거하므로 둘 이상의 층에 나타나는 라이브러리는 한 번만 집계됩니다.
scan-sbom.sh --project myserver --version 1.0.0 \
--merge myserver-os_7_bom.json myserver-app_2.0.0_bom.json myserver-bin_2.0.0_bom.json \
--generate-only
서버 전체를 하나의 컨테이너 이미지로 납품한다면, 그 이미지를 --target으로 한 번에 스캔해 OS와 애플리케이션 층을 동시에 담을 수도 있습니다.
검토용으로 층별 SBOM을 함께 보관하세요
공식 제출물은 병합된 단일 BOM이지만, 층별 SBOM은 어느 층이 누락·취약한지 바로 보여 주므로 자체 검토와 재제출 대응에 유용합니다. 함께 보관하시기 바랍니다.
클러스터·다중 노드 구성이라면
여러 대의 노드가 하나의 클러스터를 이루는 제품도 제출 단위는 동일하게 제품당 SBOM 하나입니다. 노드 대수만큼 만들 필요는 없습니다.
- 모든 노드가 동일 구성이라면, 대표 노드 1대를 기준으로 층별 생성과 병합을 진행합니다.
- 노드 역할에 따라 설치된 소프트웨어가 다르다면(예: 관리 노드와 스토리지 노드), 역할별로 층별 SBOM을 만든 뒤 전체를
--merge로 합쳐 하나로 제출합니다.
제출 전 검증
층별 SBOM과 병합본 모두 컴포넌트가 실제 purl을 갖는지 확인해야 합니다. 확인 명령과 점검 항목은 검증 체크리스트를 따르십시오.
더 알아보기
서버 납품 SBOM의 상세 절차와 예시는 BomLens 저장소의 정본 문서에 있습니다.
서버 납품 가이드
관련 문서
1.5 - 상용 소프트웨어·완제품 공급 시 SBOM 제출
타사가 제조한 상용 소프트웨어나 완제품을 공급하는 경우, 제조사로부터 SBOM을 받아 제출하는 방법을 안내합니다.
이 문서는 자사가 개발하지 않은 상용 소프트웨어나 완제품을 SK텔레콤에 공급하는 공급사를 위한 가이드입니다. 이 경우 공급사는 소스코드에 접근할 수 없으므로, SBOM 생성 방법의 소스코드 스캔 방식을 적용할 수 없습니다. 제품을 제조한 원제조사로부터 SBOM을 받아 제출합니다.
납품된 장비나 설치 이미지를 도구로 통째로 스캔하는 방식은 대안이 되지 않습니다. 상용 소프트웨어 부분은 패키지 매니저 메타데이터가 없어 purl이 누락된 컴포넌트로 생성되고, 취약점 매칭이 실패하여 반려됩니다.
적용 대상
다음과 같은 형태로 타사 제품을 공급하는 경우가 해당합니다.
- 상용 소프트웨어 재판매: 타사가 개발한 패키지 소프트웨어의 라이선스를 공급 (리셀러, 총판)
- 어플라이언스·완제품 장비: 제조사가 OS와 소프트웨어를 설치해 출하하는 장비 (예: 스토리지, 백업 어플라이언스, 네트워크 장비)
- 타사 제품이 포함된 시스템: 자체 개발 부분과 타사 상용 제품을 함께 구성해 납품
자체 개발 부분이 함께 있다면, 자체 개발 부분은 SBOM 생성 방법에 따라 직접 생성하고, 상용 부분은 본 문서에 따라 제조사 SBOM을 받아 함께 제출합니다.
제조사 SBOM 수령
원제조사(제조사 또는 개발사)에 CycloneDX 또는 SPDX 형식의 SBOM을 요청합니다. 미국 행정명령 EO 14028, EU Cyber Resilience Act 등 규제 시행에 따라 글로벌 제조사 다수가 제품별 SBOM 제공 체계를 갖추고 있습니다. 요청할 때 다음 사항을 함께 전달하면 회신을 빠르게 받을 수 있습니다.
- 형식: CycloneDX JSON (권장) 또는 SPDX
- 대상: 납품하는 제품의 정확한 모델명과 버전
- 범위: OS를 포함해 출하되는 제품이라면 OS 패키지까지 포함
제조사마다 SBOM 제공 여부와 소요 기간이 다르므로, 납품 일정에 맞추려면 계약 검토 단계에서 미리 요청하시기 바랍니다.
받은 SBOM 점검
제조사에게 받은 SBOM도 자체 생성한 SBOM과 같은 기준으로 검토됩니다. 제출 전에 다음을 확인합니다.
- 제출 요구사항 충족 여부: 표준 포맷과 버전, 메타데이터, 컴포넌트 이름과 버전, purl 포함 여부
- 검증 체크리스트 점검: purl 보유 수 등 필수 항목
- 제품 버전 일치 여부: SBOM의 최상위 컴포넌트가 실제 납품하는 제품의 이름·버전과 일치하는지
점검을 마친 SBOM은 제출 절차에 따라 파일명을 정해 제출합니다.
클러스터로 구성된 제품이라면
여러 대의 노드가 하나의 클러스터를 이루는 제품(예: 분산 스토리지)도 제출 단위는 제품당 SBOM 하나입니다. SBOM 단위를 정하는 기준은 서버 SBOM 생성의 클러스터·다중 노드 구성 절을 참고하세요.
제조사가 SBOM을 제공하지 못하는 경우
제조사가 SBOM을 제공하기 어렵다고 회신한 경우, 임의 방식으로 생성해 제출하기 전에 opensource@sktelecom.com으로 먼저 협의해 주시기 바랍니다.
관련 문서
1.6 - SBOM 제출 전 검증 체크리스트
SBOM 제출 전 필수 확인 사항을 점검하여 반려를 방지합니다.
필수 점검 항목
아래 체크리스트를 통과하지 못한 SBOM은 시스템에서 자동으로 반려될 수 있습니다. 2~4번 항목은 아래 검증 도구의 BomLens 자동 검증으로 한 번에 확인할 수 있습니다.
1. 파일 무결성
2. 필수 데이터 필드
3. 의존성 완전성 확인
전이적 의존성 누락은 가장 흔한 반려 사유입니다. 아래 항목을 반드시 확인하시기 바랍니다.
4. 식별자 (PURL) 확인
SK텔레콤 시스템은 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
purl 보유 수가 0이거나 전체 컴포넌트 수보다 현저히 적으면 제출하지 마십시오. 원인과 재생성 방법은 자주 발생하는 반려 사유를 참고하십시오.
검증 도구
BomLens 자동 검증 (권장)
BomLens의 SBOM 분석 기능은 위 체크리스트의 2~4번을 포함해 제출 요구사항을 자동으로 점검합니다. v1.8.0 이상이 필요합니다.
./scripts/scan-sbom.sh --project my-app --version 1.0.0 \
--analyze "./sbom.json" \
--generate-only
실행하면 my-app_1.0.0/ 폴더에 적합성 리포트(my-app_1.0.0_conformance.html)가 생성됩니다. 리포트가 자동으로 확인하는 항목은 다음과 같습니다.
| 검사 항목 | 체크리스트 대응 |
|---|
스펙 버전 범위 (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 업로드)에서도 같은 검증을 할 수 있습니다.
CycloneDX Validator (스키마 검사)
CycloneDX 파일이 표준 스키마에 맞는지 확인하는 온라인 도구입니다. JSON 문법과 형식 오류(체크리스트 1번)를 설치 없이 빠르게 확인할 때 유용합니다. 다만 스키마 검사만 수행하므로, 통과하더라도 2~4번(필수 필드, 의존성 완전성, PURL)을 충족한다는 뜻은 아닙니다. SPDX 파일은 이 도구로 검사할 수 없습니다.
관련 문서
1.7 - SBOM 제출 절차
작성된 SBOM 파일의 제출 채널과 이메일 양식, 제출 후 프로세스를 안내합니다.
1. 제출 시기
- 소프트웨어 계약 체결 후 초기 납품 시
- 소프트웨어의 주요 버전(Major/Minor) 업데이트 시
- 계약서에 명시된 정기 제출 일정 도래 시
2. 제출 방법
SBOM 파일은 SK텔레콤 사업부서 및 보안부서 담당자에게 이메일(또는 담당자가 지정한 채널)로 제출합니다.
- 이메일 제목:
[SBOM 제출] 공급사명_프로젝트명_버전 - 첨부파일: 생성된 SBOM 파일 (비밀번호 걸린 압축 파일 금지)
본문 필수 기재 사항:
- 납품 계약 번호
- 담당자 정보 (성명, 부서, 연락처)
- 프로젝트 정보 (시스템명, 상세 버전)
- 사용 도구 및 버전 (예: BomLens, cdxgen)
3. 제출 후 검증 및 조치
제출된 SBOM은 사내 오픈소스 & SBOM 관리 시스템(TOSCA)에 등록된 후 아래 절차에 따라 검증됩니다. TOSCA는 사내 시스템이므로 공급사가 접근할 필요는 없습니다.
| 단계 | 내용 | 처리 기한 |
|---|
| 형식 검증 | 필수 필드 누락 여부 확인. 미충족 시 반려 통보 | 접수 후 3일 이내 |
| 보안 취약점 분석 | Critical/High 등급 취약점 탐지 여부 자동 분석 | - |
| 조치 요청 | 심각한 취약점 발견 시 패치 계획 또는 소명서 요청 | Critical: 7일 / High: 30일 |
검증 결과와 조치 요청 사항은 사업부서 담당자를 통해 공급사 및 보안부서 담당자에게 통보됩니다.
관련 문서
1.8 - 자주 발생하는 반려 사유
제출된 SBOM이 반려되는 대표 사유와 원인, 해결 방법을 안내합니다.
제출된 SBOM은 형식 검증과 취약점 분석을 거치며, 기준에 미달하면 반려됩니다. 아래는 실제 접수 과정에서 반복적으로 발생하는 반려 사유입니다. 제출 전에 검증 체크리스트와 함께 확인하시기 바랍니다.
반려 사유 한눈에 보기
| 반려 사유 | 주요 원인 | 해결 방법 |
|---|
| PURL 전량 누락 | 패키지 매니저 메타데이터가 없는 설치 디렉터리나 원시 파일을 스캔 (syft dir: 등) | 빌드된 이미지나 소스코드를 스캔 대상으로 변경. SBOM 생성 방법 |
| 전이 의존성 누락 | 빌드(패키지 설치) 전에 소스만 스캔 | 빌드 완료 후 재생성. 제출 요구사항의 의존성 범위 절 |
pkg:generic/ PURL | 도구가 생태계를 식별하지 못함 | 생태계를 명시하는 타입으로 재생성. 제출 요구사항의 PURL 절 |
| 컴포넌트 버전 누락 | 매니페스트 불완전 또는 도구 설정 문제 | version 필드 필수 기재. 제출 요구사항 |
| 서버의 일부 층만 포함 | OS 층 또는 애플리케이션 층 중 하나만 스캔 | 층별로 생성해 병합. 서버 SBOM 생성 |
| 허용되지 않는 포맷·버전 | 지원 범위 밖의 포맷으로 생성 | CycloneDX JSON 권장. 제출 요구사항 |
| 최상위 컴포넌트 정보 누락 | 메타데이터에 납품 제품명과 버전 미기재 | metadata의 component에 제품명과 버전 기재. 제출 요구사항 |
대표 사례
사례 1: 설치 디렉터리 스캔으로 PURL이 전량 누락
한 공급사가 syft dir:/root/nag_pkg로 설치 디렉터리를 스캔해 제출한 SBOM은 261개 컴포넌트 중 purl이 하나도 없어, 취약점 매칭 251건이 모두 실패하고 전량 반려되었습니다. 패키지 매니저 메타데이터(package.json, go.mod, RPM/DEB 패키지 DB 등)가 없는 위치를 스캔하면 도구가 생태계를 식별하지 못합니다.
스캔 대상을 빌드된 이미지나 소스코드로 바꾸고, 생성 직후 purl 개수를 확인하십시오. 확인 명령은 검증 체크리스트에 있습니다.
사례 2: 빌드 전 스캔으로 전이 의존성 누락
직접 의존성이 수 개인 프로젝트인데 총 컴포넌트가 10개 미만이라면 전이 의존성 누락을 의심해야 합니다. 일반적인 웹 애플리케이션은 전이 의존성까지 포함하면 수십에서 수백 개의 컴포넌트가 나옵니다. npm install, mvn package 같은 빌드를 완료한 뒤 생성하면 해결됩니다.
반려되지 않는 SBOM의 모습
합격 기준을 충족하는 예시 파일을 내려받아 구조를 비교해 보십시오. 모든 컴포넌트에 purl과 버전이 있고, dependencies 배열이 직접·전이 의존 관계를 담고 있습니다.
관련 문서
2 - 소프트웨어 공급망 공격과 보안 필요성
소프트웨어 공급망 보안의 중요성과 최근 위협 동향, 그리고 이를 방어하기 위한 필수 전략을 소개합니다.
제출 방법을 찾으신다면
이 페이지는 공급망 보안의 배경을 설명하는 학습 자료입니다. SBOM 생성과 제출 방법을 찾으신다면 공급사 가이드로 바로 이동하세요.
1. 소프트웨어 공급망 공격이란?
소프트웨어 공급망 공격(Software Supply Chain Attack)은 공격자가 소프트웨어 개발사나 공급업체의 시스템, 또는 개발 과정에 침투하여 악성 코드를 심거나 취약점을 악용하는 사이버 공격 기법입니다.
전통적인 공격이 최종 사용자를 직접 겨냥했다면, 공급망 공격은 신뢰받는 소프트웨어 업데이트나 개발 도구를 오염시켜 이를 사용하는 수많은 하류(Downstream) 기업과 사용자들을 동시에 감염시킵니다.
graph LR
A[공격자] -->|침투| B[공급업체 빌드 서버]
B -->|악성코드 주입| C[오염된 소프트웨어 업데이트]
C -->|배포| D[고객사 A]
C -->|배포| E[고객사 B]
C -->|배포| F[고객사 C]
classDef danger fill:#FDE1E7,stroke:#EA002C,color:#8A0019,stroke-width:1.5px
classDef victim fill:#ffffff,stroke:#c8c8c8,color:#171717,stroke-width:1px
class A,B,C danger
class D,E,F victim2. 주요 공격 사례
- SolarWinds 사태 (2020): 빌드 시스템이 해킹당해 정식 서명된 업데이트에 백도어가 심어졌고, 미국 정부 기관을 포함해 전 세계 18,000여 개 조직이 피해를 입었습니다. 신뢰하는 벤더의 소프트웨어조차 안전하지 않을 수 있음을 보여 주었습니다.
- Log4j 취약점 (2021): 널리 쓰이는 로깅 라이브러리에서 원격 코드 실행 취약점이 발견되어 전 세계 수억 대의 서버가 노출되었습니다. 우리 시스템이 어떤 오픈소스를 쓰는지 파악하는 수단, 즉 SBOM의 필요성을 각인시킨 계기입니다.
3. 왜 공급망 보안인가?
현대 애플리케이션 코드의 70~90%는 오픈소스 컴포넌트로 구성됩니다. 공통 컴포넌트 하나가 오염되면 피해가 전 세계로 확산되고, 빌드 단계에서 오염된 코드는 방화벽이나 백신 같은 전통적인 보안 검사로 잡기 어렵습니다. 이런 위험을 관리하기 위해 SK텔레콤은 SBOM 도입과 공급망 보안 정책을 시행하고 있습니다.
관련 문서
2.1 - 규제 동향
미국 EO 14028, EU CRA 등 전 세계적으로 강화되고 있는 소프트웨어 공급망 보안 규제 현황을 살펴봅니다.
1. 미국: 행정명령 14028 (EO 14028)
2021년 5월, 바이든 행정부는 ‘국가의 사이버 보안 개선에 관한 행정명령(Executive Order 14028)‘을 발표했습니다.
핵심 내용
- SBOM 요구 추진: EO 14028은 SBOM의 최소 요소(데이터 필드, 자동화 지원 등) 정의와 안전한 소프트웨어 개발 관행을 지시했고, 연방 납품 기업의 SBOM 제출과 자기증명 의무는 후속 OMB 지침으로 구체화됐습니다.
- NIST 가이드라인 준수: NIST(미국 국립표준기술연구소)가 정의한 ‘보안 소프트웨어 개발 프레임워크(SSDF)‘를 준수해야 합니다.
2. 유럽연합(EU): 사이버 복원력 법안 (CRA)
EU는 Cyber Resilience Act (CRA)를 통해 디지털 제품의 전체 생명주기에 걸친 보안 요구사항을 법제화했습니다.
핵심 내용
- CE 마크 인증: 디지털 요소가 포함된 모든 제품은 사이버 보안 요구사항을 충족하고 CE 마크를 부착해야만 EU 내에서 판매할 수 있습니다.
- 보안 지원 기간 명시: 제조사는 제품의 예상 사용 기간 동안 보안 업데이트를 제공해야 하며, 그 기간은 원칙적으로 5년 이상입니다. 예상 사용 기간이 5년보다 짧으면 그 기간에 맞춥니다(Regulation (EU) 2024/2847 제13조, Recital 60). 즉 5년은 상한이 아니라 기준선입니다.
- 취약점 신고 의무: 적극적으로 악용되는(actively exploited) 취약점이나 심각한 보안 사고를 인지하면, 24시간 이내에 조정자로 지정된 CSIRT와 ENISA에 조기경보를 제출하고, 이후 72시간 이내 후속 신고와 최종 보고서를 제출해야 합니다(Regulation (EU) 2024/2847 제14조).
- SBOM 관리: 제조사는 제품의 소프트웨어 구성요소를 식별하고 문서화(SBOM)해야 합니다.
3. 한국: SW 공급망 보안 가이드라인
대한민국 정부(과학기술정보통신부, KISA, 국가정보원)도 글로벌 흐름에 발맞춰 ‘SW 공급망 보안 가이드라인’을 발표하고 실증 사업을 추진하고 있습니다.
주요 내용 (v1.0 기준)
- SBOM 도입 권고: 공공 및 민간 분야에서 SW 개발 및 납품 시 SBOM을 생성하고 활용할 것을 권고합니다.
- 공급사 보안 활동: 안전한 개발 환경 구축, SBOM 생성 및 제공, 보안 취약점 점검을 권고합니다.
이러한 규제 흐름에 대응하는 SK텔레콤의 요구사항은 SK텔레콤 공급망 보안 정책에 정리되어 있습니다.
관련 문서
2.2 - SK텔레콤 공급망 보안 정책
SK텔레콤에 소프트웨어를 공급하는 파트너사가 준수해야 할 공급망 보안 정책과 원칙을 설명합니다.
NOTICE.
본 문서는 사내 보안 및 문서 관리 정책에 따라 대외비 내용을 제외한 요약본입니다. 전체 내용이 아닌 개략적인 핵심 사항 위주로 작성되었음을 참고해 주시기 바랍니다.
1. 정책 목적
본 정책은 SK텔레콤이 도입하는 모든 소프트웨어의 투명성을 확보하고, 알려진 취약점(Known Vulnerabilities) 및 라이선스 위반 리스크를 사전에 식별하여 제거하는 것을 목적으로 합니다.
2. 적용 대상
SK텔레콤과 소프트웨어 공급 계약을 체결하는 모든 공급사는 본 정책의 적용을 받습니다.
3. 주요 요구사항
공급사는 다음 3가지 원칙을 준수해야 합니다.
원칙 1: SBOM 제출 의무화
- 모든 소프트웨어 납품 시, 해당 버전에 부합하는 SBOM(Software Bill of Materials)을 제출해야 합니다.
- 허용 포맷과 필수 데이터 필드의 정의는 제출 요구사항을 따릅니다.
원칙 2: 취약점 점검 및 조치
- 공급사는 납품 전 자체적으로 최신 보안 취약점(CVE)을 점검해야 합니다.
- Critical/High 등급의 취약점이 발견된 경우, 이를 패치하거나 완화 조치를 적용한 후 납품해야 합니다.
- 패치가 불가능한 경우, ‘취약점 소명서’를 통해 해당 취약점이 실제 서비스에 영향을 주지 않음을 증명해야 합니다.
원칙 3: 투명한 변경 관리
- 계약 기간 중 소프트웨어의 구성 요소가 변경(업데이트, 패치 등)되는 경우, 갱신된 SBOM을 즉시 제출해야 합니다.
- 오픈소스 라이선스 의무 사항(고지 의무, 소스코드 공개 의무 등)을 준수했음을 보증해야 합니다.
관련 문서
3 - SBOM 이란?
개발자와 관리자가 알아야 할 SBOM의 핵심 개념과 업계 표준을 안내합니다.
개요
이 섹션은 SBOM(Software Bill of Materials)을 처음 접하는 분들을 위한 학습 가이드입니다. SBOM이 무엇이고 왜 필요한지, 업계 표준 포맷은 서로 무엇이 다른지를 다룹니다.
가이드 구성
- 개념 및 필요성: SBOM이 무엇이며, 왜 지금 우리에게 필요한지 근본적인 이유를 설명합니다.
- 표준 비교 (SPDX vs CycloneDX): 업계 표준 포맷의 차이점을 이해하고, 프로젝트 성격에 맞는 포맷을 선택할 수 있습니다.
SBOM을 실제로 생성하고 검증해 제출하는 실무 방법은 공급사 가이드에서 다룹니다.
3.1 - SBOM 개념 및 필요성
소프트웨어 명세서로서의 SBOM의 정의와 3가지 핵심 도입 목적(보안, 라이선스, 관리)을 설명합니다.
SBOM의 정의
SBOM (Software Bill of Materials)은 소프트웨어를 구성하는 모든 컴포넌트, 라이브러리, 모듈 등의 목록과 그들 간의 의존성 관계를 기술한 정형화된 명세서입니다. 제조업에서 제품의 부품 목록을 관리하는 BOM(Bill of Materials) 개념을 소프트웨어 공학에 적용한 것입니다.
graph TD
A[소프트웨어 제품] --> B[직접 의존성]
B --> C[라이브러리 A v1.2.3]
B --> D[라이브러리 B v2.0.1]
B --> E[라이브러리 C v3.1.0]
C --> F[전이적 의존성]
F --> G[라이브러리 D v1.0.0]
F --> H[라이브러리 E v2.5.0]
D --> F
classDef root fill:#F2F2F2,stroke:#171717,color:#171717,stroke-width:1.5px
classDef direct fill:#D9F0E4,stroke:#00A651,color:#0A5A32,stroke-width:1.5px
classDef trans fill:#EEDCF3,stroke:#68127A,color:#4A0D57,stroke-width:1.5px
classDef lib fill:#ffffff,stroke:#c8c8c8,color:#171717,stroke-width:1px
class A root
class B direct
class F trans
class C,D,E,G,H libSBOM의 주요 구성 요소
SBOM 문서에는 다음 정보가 담깁니다.
- 컴포넌트 정보: 이름, 버전, 공급자, 라이선스
- 고유 식별자: 컴포넌트를 명확히 식별하는 표준 식별자. Package URL(purl)이 가장 널리 쓰입니다. (예:
pkg:maven/org.springframework/spring-core@5.3.20) - 의존성 관계: 직접 의존성(프로젝트가 직접 사용)과 전이적 의존성(직접 의존성이 다시 의존)
- 메타데이터: 생성 도구, 생성 시각, 생성자
SK텔레콤에 제출할 때 각 항목의 필수 여부와 형식은 제출 요구사항이 규정합니다.
왜 필요한가?
SBOM은 단순한 문서가 아니라 소프트웨어 투명성을 위한 핵심 데이터입니다.
1. 보안 취약점의 신속한 식별
새로운 취약점(예: Log4j 사태)이 발표되었을 때, 우리 서비스 중 어디에 해당 라이브러리가 쓰이고 있는지 즉시 파악할 수 있습니다. SBOM이 없다면 모든 서버와 코드를 일일이 전수 조사해야 하며, 대응 골든타임을 놓치게 됩니다.
2. 라이선스 리스크 관리
오픈소스 라이선스 위반은 법적 분쟁으로 이어질 수 있습니다. SBOM을 통해 프로젝트에 포함된 모든 라이선스를 식별하고, 호환되지 않는 라이선스(예: GPL과 상용 코드의 결합) 사용을 사전에 차단할 수 있습니다.
3. 소프트웨어 품질 및 노후화 관리
오래되고 지원이 중단된(EOL, End-of-Life) 컴포넌트를 식별하여 기술 부채를 관리하고 소프트웨어의 건전성을 유지할 수 있습니다.
이런 배경에서 미국·유럽 등의 규제도 SBOM 제출을 의무화하는 방향으로 강화되고 있습니다. 자세한 내용은 규제 동향을 참고하세요.
관련 문서
참고 자료
3.2 - SBOM 표준
SBOM의 양대 표준인 SPDX와 CycloneDX의 특징을 비교하고 프로젝트에 적합한 선택 기준을 제시합니다.
실무 결론부터
SK텔레콤 제출용 SBOM은 CycloneDX (JSON) 형식을 권장합니다. 허용 포맷과 버전은 제출 요구사항에서 확인하세요. 이 페이지의 나머지는 두 표준을 깊이 이해하려는 분들을 위한 상세 비교입니다.
주요 SBOM 표준
현재 널리 쓰이는 표준은 두 가지이며, 둘 다 SK텔레콤 제출에 사용할 수 있습니다. 탄생 배경과 주력 분야가 다릅니다.
- SPDX (Software Package Data Exchange): Linux Foundation이 주관하는 표준(ISO/IEC 5962)입니다. 오픈소스 라이선스 정보 교환을 위해 개발되어 라이선스·저작권 정보 표현이 상세하고, 개별 파일 레벨의 정보까지 담을 수 있습니다.
- CycloneDX: OWASP가 개발한 보안 중심 표준(ECMA-424)입니다. 처음부터 취약점 관리를 위해 설계되어 구조가 간결하고, 보안 도구와의 통합이 우수합니다.
SPDX vs CycloneDX 비교
| 구분 | SPDX | CycloneDX |
|---|
| 관리 기관 | Linux Foundation | OWASP |
| 표준 인증 | ISO/IEC 5962 | ECMA-424 |
| 주요 목적 | 라이선스 컴플라이언스 | 보안 취약점 관리 |
| 구조 복잡도 | 높음 (상세) | 낮음 (간결) |
| 파일 레벨 추적 | 지원 | 제한적 |
| 취약점 정보 | 선택사항 | 기본 포함 |
| 도구 생태계 | 성숙 | 빠르게 성장 중 |
| 파일 형식 | JSON, RDF/XML, YAML, Tag-Value | JSON, XML |
| 주요 사용자 | 법무팀, 오픈소스 관리 조직 | 보안팀, DevOps 엔지니어 |
| SKT 권장 | 라이선스 검증이 주 목적일 때 | 보안 취약점 관리가 주 목적일 때 |
어느 형식을 쓰든 제출 가능 여부는 형식이 아니라 내용이 가릅니다. 생성 도구가 지원하는 형식을 선택하고, 제출 요구사항의 필수 필드를 충족하면 됩니다.
상호 변환
SPDX와 CycloneDX 간 변환 도구가 제공됩니다.
SPDX에서 CycloneDX로 변환
# cyclonedx-cli 사용
cyclonedx convert --input-file sbom.spdx.json \
--output-file sbom.cdx.json --input-format spdx \
--output-format json
CycloneDX에서 SPDX로 변환
# spdx-tools 사용
java -jar tools-java-1.1.0-jar-with-dependencies.jar \
Convert bom.cdx.json bom.spdx.json
관련 문서
참고 자료