
소프트웨어 자재 명세서(SBOM)를 스캔하여 보안 취약점을 탐지합니다.

bomber는 SBOM을 스캔하여 보안 취약점을 찾는 애플리케이션입니다.
벤더에게 폐쇄형 소스 제품 중 하나에 대한 SBOM(소프트웨어 자재 명세서)을 요청했고, 그들이 JSON 파일로 제공했다면... 이제 무엇을 해야 할까요?
가장 먼저 해야 할 일은 SBOM에 나열된 구성 요소 중 보안 취약점이 있는지, 그리고 이러한 구성 요소가 어떤 라이선스를 가지고 있는지 확인하는 것입니다. 이는 제품을 사용함으로써 감수해야 하는 위험을 파악하는 데 도움이 됩니다.
SBOM에서 식별된 구성 요소에 대한 보안 취약점 및 라이선스 정보를 찾는 것이 바로 bomber의 목적입니다. bomber는 JSON 또는 XML 기반의 CycloneDX 형식, JSON SPDX 또는 Syft 형식의 SBOM을 읽고 취약점이 있는지 빠르게 알려줍니다.
소프트웨어는 오픈소스이거나 폐쇄형 소스일 수 있습니다. Github 또는 모든 공개 소스 저장소에서 찾을 수 있는 타사 구성 요소는 오픈소스로 간주할 수 있습니다. 기술적으로는 회사 내부에서 직접 만든 소프트웨어도 오픈소스입니다. 공개되지는 않았지만 내부 팀에서 볼 수 있기 때문입니다. 폐쇄형 소스 소프트웨어도 내부에 있을 수 있지만, 일반적으로 외부 벤더로부터 구매하는 소프트웨어입니다.
회사는 Github, Sonatype, Snyk 등 벤더가 제공하는 SCA 도구를 사용하여 모든 종류의 오픈소스를 스캔하고 취약점 데이터를 제공할 수 있으며, 경우에 따라 SBOM도 생성할 수 있습니다. 하지만 아직 할 수 없는 것은 접근 권한이 없는 폐쇄형 소스 소프트웨어를 스캔하는 것입니다. 이때 SBOM과 bomber가 필요합니다. SBOM은 접근할 수 없는 소프트웨어의 구성을 제공하고, bomber는 SBOM 내 항목에 취약점이 있는지 확인합니다.
우리는 벤더로부터 받은 폐쇄형 소스 SBOM을 스캔하기 위해 bomber를 만들었습니다. 또한 오픈소스 SBOM도 스캔할 수 있으며, 원한다면 bomber를 오픈소스 SCA 도구로 사용할 수도 있습니다.
현재 사용 가능한 SBOM 형식은 꽤 많습니다. bomber는 다음 형식을 지원합니다:

bomber는 여러 소스의 취약점 정보를 지원합니다. 이를 프로바이더 라고 합니다. 현재 bomber는 기본 프로바이더로 OSV를 사용하지만, Github Advisory Database, Sonatype OSS Index, Snyk도 사용할 수 있습니다.
현재 OSV는 무료이며 자격 증명이 필요하지 않습니다. Sonatype OSS Index는 무료이지만 등록하고 토큰을 받아야 합니다. Snyk 지원은 Snyk 라이선스가 필요합니다.
bomber는 프로바이더로부터 수집한 데이터 외에도 데이터 보강을 통해 익스플로잇 확률과 같은 추가 정보로 취약점 데이터를 보강합니다.
각 프로바이더는 서로 다른 생태계를 지원 합니다. 따라서 한 프로바이더에서 취약점이 보이지 않으면 다른 프로바이더를 시도해 보십시오. 생태계는 단순히 패키지 관리자 또는 패키지 유형을 의미합니다. 예를 들어 rpm, npm, gems 등이 있습니다. 각 프로바이더가 다른 취약점을 보고할 수 있다는 점을 이해하는 것이 중요합니다. 의심스러우면 여러 프로바이더를 확인해 보십시오.
bomber가 취약점을 찾지 못했다고 해서 취약점이 없다는 의미는 아닙니다. 이는 사용 중인 프로바이더가 감지하지 못했거나 해당 생태계를 지원하지 않는다는 의미일 뿐입니다. 일부 프로바이더는 심각도 정보 없이 취약점을 반환하기도 합니다. 이 경우 심각도는 "UNDEFINED"로 표시됩니다.
bomber의 프로바이더 문서는 다음에서 확인할 수 있습니다:
Homebrew를 사용하여 bomber를 설치할 수 있습니다. 다음 명령어를 사용하세요:
brew tap devops-kung-fu/homebrew-tap
brew install devops-kung-fu/homebrew-tap/bomber
Homebrew가 없는 경우에도 최신 릴리스를 다운로드 (예: bomber_0.4.1_darwin_all.tar.gz)하여 파일을 추출한 후 bomber 바이너리를 사용할 수 있습니다.
원한다면 bomber 바이너리를 /usr/local/bin 디렉토리나 PATH에 있는 임의의 위치로 이동할 수 있습니다.
bomber를 설치하려면 플랫폼에 맞는 최신 릴리스를 다운로드하여 로컬에 설치하십시오. 예를 들어 Ubuntu에 bomber를 설치하려면:
dpkg -i bomber_0.5.0_linux_arm64.deb
bomber를 사용하여 SBOM 폴더 전체 또는 개별 SBOM을 스캔할 수 있습니다. bomber는 단일 폴더에 여러 형식이 있어도 상관하지 않습니다. 모든 것을 알아서 정리합니다.
bomber의 기본 출력은 STDOUT입니다. HTML 또는 JSON으로 출력하는 옵션은 이 문서의 뒷부분에서 설명합니다.
# 자격 증명이 필요 없는 기본 프로바이더(OSV) 사용
bomber scan cyclonedx.sbom.json
# 자격 증명이 필요한 프로바이더(ossindex) 사용
bomber scan --provider=xxx --username=xxx --token=xxx [sbom.json]
프로바이더가 취약점을 발견하면 다음과 유사한 출력이 표시됩니다:

프로바이더가 취약점을 반환하지 않으면 취약점이 발견되지 않았다는 메시지가 표시됩니다.
참고: 지정된 프로바이더를 사용하여 취약점이 발견되지 않았다고 해서 취약점이 없다는 의미는 아닙니다. bomber가 지원하는 다른 프로바이더도 시도해 보십시오.
이 기능은 동일한 제품에 대해 벤더로부터 여러 SBOM을 받을 때 유용합니다. 또는 전체 조직에 어떤 취약점이 있는지 알고 싶을 때도 유용합니다. 폴더 스캔은 모든 구성 요소를 찾아 중복을 제거한 후 취약점을 스캔합니다.
# SBOM 폴더 스캔 (다음 명령어는 현재 폴더에 있는 "sboms" 폴더를 스캔합니다)
bomber scan --provider=xxx --username=xxx --token=xxx ./sboms
단일 SBOM 스캔과 유사한 결과가 표시됩니다.
bomber는 데이터를 세 가지 유용한 형식으로 출력합니다. 기본적으로 출력은 명령줄에 표시됩니다. 향상된 보고를 위해 --output=html 플래그를 사용하여 HTML로 출력할 수 있습니다. JSON으로 출력하려면 --output=json 플래그를 사용하십시오. 여러 형식으로 출력하려면 쉼표로 구분하여 지정하십시오. --output=html,stdout,json.
자세한 취약점 정보가 포함된 읽기 쉬운 보고서를 생성하려면 --output 플래그를 사용하여 HTML 파일로 저장할 수 있습니다.
명령어 예:
bomber scan bad-bom.json --output=html
그러면 현재 폴더에 "YYYY-MM-DD-HH-MM-SS-bomber-results.html" 형식의 파일이 저장됩니다. 웹 브라우저에서 이 파일을 열면 다음과 같은 출력이 표시됩니다:

bomber는 --output 플래그를 사용하여 취약점 데이터를 JSON 형식으로 출력할 수 있습니다. 기본 출력은 STDOUT입니다. JSON 출력에는 터미널에 표시되는 것보다 훨씬 더 많은 정보가 포함되어 있습니다. 패키지 설명 및 용도, 취약점 이름, 취약점 요약 등을 볼 수 있습니다.

명령어 예:
bomber scan bad-bom.json --output=json > filename.json
bomber는 Markdown 형식의 출력도 지원합니다. HTML 출력과 매우 유사하지만 스타일링은 GitHub와 같은 Markdown 렌더러에 맡깁니다. 출력은 "YYYY-MM-DD-HH-MM-SS-bomber-results.md" 형식의 파일로 저장됩니다.
명령어 예:
bomber scan bad-bom.json --output=md
필요한 경우 --ignore-file 플래그를 사용하여 취약점 출력에서 무시할 CVE 목록을 로드할 수 있습니다. 이 목록은 다음과 같은 형식이어야 하며, 무시할 각 CVE는 별도의 줄에 입력합니다:
CVE-2022-31163
CVE-2022-23520
bomber.ignore 파일의 예시는 여기에서 확인할 수 있습니다.
bomber.ignore 파일을 사용하려면 다음 구문을 사용하십시오:
bomber --ignore-file=bomber.ignore scan bom.json
--severity 플래그를 사용하여 특정 취약점 심각도만 반환하도록 설정할 수 있습니다. 예를 들어 --severity=moderate를 설정하면 심각도가 MODERATE 이상인 취약점만 반환됩니다.
다음 명령어는 높음(high) 및 심각(critical) 취약점만 반환합니다.
bomber --severity=high scan bom.json
bomber는 프로바이더로부터 얻은 취약점 데이터를 보강할 수 있습니다. 현재 구현된 첫 번째 "보강기"는 EPSS입니다.
참고: EPSS 점수는 bomber 0.5.0 이상에서 더 이상 기본값이 아닙니다. EPSS 점수를 표시하려면 --enrich=epss 플래그를 사용해야 합니다.
EPSS는 익스플로잇 예측 점수 시스템(Exploit Prediction Scoring System)의 약자로, 취약점이 악용될 확률을 예측하는 프레임워크입니다. EPSS는 종종 위험도가 높은 취약점을 식별하여 우선적으로 수정하는 데 사용됩니다.
EPSS는 확률을 백분율로 사용합니다. 따라서 94가 보이면 해당 취약점이 악용될 확률이 94%라는 의미입니다. 94와 같은 점수를 가진 취약점은 즉각적인 주의가 필요하며, 20과 같은 점수를 가진 취약점은 낮은 우선순위를 가져야 합니다.
원하는 경우 두 개의 환경 변수를 설정하여 자격 증명을 저장하고 명령줄에 입력하지 않아도 됩니다. 이 README 뒷부분의 환경 변수 정보를 확인하십시오.
CI/CD 파이프라인에서 bomber를 사용하는 경우 Syft를 사용하여 SBOM을 생성하고 취약점을 스캔하는 올인원 명령어를 사용할 수 있습니다. 이를 위해 다음과 같은 명령어를 사용할 수 있습니다:
# 명령어 끝에 - 문자를 포함해야 합니다. 이는 bomber가 STDIN에서 읽도록 트리거합니다.
syft packages . -o cyclonedx-json | bomber scan --provider ossindex --output json -
이 명령어는 SBOM을 생성하고, 이를 bomber로 파이프하여 JSON 형식의 결과를 생성합니다.
매번 자격 증명을 입력하고 싶지 않다면 .bashrc 또는 .bash_profile에 다음을 추가할 수 있습니다:
export BOMBER_PROVIDER_USERNAME={{your OSS Index user name}}
export BOMBER_PROVIDER_TOKEN={{your OSS Index API Token}}
--exitcode 플래그를 사용하면 발견된 가장 높은 취약점 심각도를 나타내는 종료 코드가 반환됩니다. 이 플래그가 없으면 성공 시 종료 코드 0, 오류 발생 시 1이 반환됩니다.
오류가 없다고 가정할 때, --exitcode 사용 시 bomber는 다음 값을 반환합니다.
| 심각도 | 반환 코드 |
|---|---|
| UNSPECIFIED (공급자가 이상한 정보를 제공하거나 정보가 없는 상태) | 10 |
| LOW | 11 |
| MODERATE | 12 |
| HIGH | 13 |
| CRITICAL |
bomber는 이제 html 출력에서 취약점 설명을 보강하는 실험적 기능을 포함합니다. 이 기능은 취약점을 가져와서 비기술 사용자도 이해할 수 있는 설명으로 변경합니다.
참고: 이 기능은 현재 주요 알파 상태입니다. 매우 느리며 출력 형식이 잘 정리되지 않습니다.
이 기능을 사용하려면 OpenAI API 키를 제공해야 합니다. CLI에서 --openai-api-key={{your OpenAI API Key}}를 사용하여 키를 전달하거나 환경 변수를 추가할 수 있습니다:
export OPENAI_API_KEY={{your OpenAI API Key}}
OpenAI API 키를 설정한 후 다음과 같이 출력 플래그를 설정할 수 있습니다:
bomber scan --output ai [sbom.json]
bomber를 시험해보고 싶다면 test 폴더에서 테스트용 SBOM을 찾을 수 있습니다.
--license 플래그가 필요합니다. 라이선스 정보가 필요하면 SBOM과 함께 요청하십시오.bomber는 한 번에 하나의 PURL을 보내 취약점을 가져와야 하므로 큰 SBOM에서는 시간이 걸립니다. 계속 주시하겠습니다.bomber 개발에 기여하고 싶다면 이 저장소의 CONTRIBUTING.md 파일을 참조하십시오. 기여하기 전에 CODE_OF_CONDUCT.md 파일을 읽어 주십시오.
bomber는 개발자가 이 저장소에 코드를 커밋할 때마다 Syft를 사용하여 SBOM을 생성합니다(Hookz를 사용 중이고 작업 디렉토리에서 초기화된 경우). CycloneDX에 대한 자세한 정보는 여기에서 확인할 수 있습니다.
bomber의 현재 CycloneDX SBOM은 여기에서 확인할 수 있습니다.
bomber의 스폰서와 후원자에게 감사드립니다.

bomber 로고를 제공해 주신 ZERO의 친구들에게 큰 감사를 드립니다.
Sonatype OSS Index와 같은 멋진 도구를 제공해 주신 Sonatype에게 감사드립니다.
프로바이더를 만들고 STDIN에서 SBOM을 처리하는 코드를 작성해 주신 Snyk의 친구 및 동료 bomber 기여자들에게 많은 감사를 드립니다. 여러분은 최고입니다.
EPSS 설명은 Nucleus 팀에서 제공했습니다. 감사합니다!
| 14 |