
CycloneDX, SPDX 및 syft SBOM을 수집하고, CVE 스캐너 앙상블을 실행하며, EPSS, CISA-KEV 및 nuclei로 결과를 보강하고, SARIF, CSAF 및 PDF로 내보내는 오프라인 단일 바이너리 웹 앱입니다.
SBOM(Software Bill of Materials) 파일을 조사하기 위한 단일 바이너리, 오프라인 웹 애플리케이션입니다. SBOM을 업로드하거나 SBOM 폴더를 가져와서, 독립적인 도구들의 앙상블로 각각을 분석하고, 정규화된 발견 사항을 하나의 로컬 UI에서 검토한 뒤, 결과를 여덟 가지 형식으로 내보냅니다. 설치도, 네트워크 접근도, 텔레메트리도 없습니다.
NOASSERTION과 단순히 누락된 필드를 구분합니다.홈 페이지(/)는 저장된 모든 SBOM을 나열하며, 코퍼스가 커져도 계속 사용할 수 있습니다:
log4j 또는 openssl 같은 질의는 해당 컴포넌트를 포함한 모든 SBOM을 찾아냅니다. 질의는 길이가 제한되며 관대하게 파싱됩니다.각 도구는 런타임에 선택 사항이며 PATH에서 감지됩니다(SBA_TOOL_<NAME>_BIN으로 바이너리를 재정의). 발견 사항은 결코 단일 도구에 의존하지 않습니다.
처음 여덟 개 도구는 CVE 형태의 취약점 발견 사항을 제공합니다. provenant는 다릅니다 — 라이선스, 저작권, 소유자 및 저자 출처를 보고하며, 감사자는 이를 폐기하지 않고 자체 발견 사항 형태로 저장하고 표시합니다(실행별 "Licence & provenance" 섹션, Markdown 내보내기에 포함).
스캐너가 모든 형식을 직접 읽을 수 있는 것은 아닙니다. bomber는 CycloneDX ≤ 1.6만 소비하며, 어떤 스캐너도 SPDX 3.0 JSON-LD를 읽지 않습니다. 두 경우 모두 감사자는 먼저 syft convert를 통해 입력을 CycloneDX로 정규화하고, syft를 사용할 수 없으면 도구가 패키지 0개를 보고하도록 두는 대신 문서화된 사유와 함께 건너뜁니다. grype의 취약점 데이터베이스는 실행당 한 번(대역 외) 새로 고쳐지므로, 일상적인 데이터 노후화가 실패한 스캔이 아니라 신선한 스캔이 됩니다.
분석 후, 각 CVE 형태의 발견 사항은 vulnlookup 서비스(기본값 https://vulnlookup.ndaal.eu)에서 가져온 세 가지 실제 신호로 보강됩니다:
각 발견 사항은 KEV, Nuclei, EPSS 및 Source 값을 표시하며, Source는 vulnlookup 레코드로 다시 연결됩니다. 발견 사항은 가장 긴급한 것부터 정렬됩니다: 알려진 악용(KEV) 항목이 앞서고, 그다음 EPSS 백분위수가 더 높은 항목이 옵니다. 보강이 없는 발견 사항은 분석기가 생성한 순서를 유지합니다. 보강 정보는 모든 내보내기 형식으로 전달됩니다 — SARIF 2.1 / 2.2, Markdown, ODT, DOCX, PDF 및 CSAF 2.1 / 2.2. 여기서 CSAF는 EPSS를 네이티브 지표로 담고 CISA-KEV와 nuclei를 노트로 기록합니다 — 그리고 내보내기 양식은 이제 기본적으로 모든 형식을 체크합니다.
Settings → Vulnerability enrichment에서 설정합니다: 켜기/끄기 토글(기본 활성화)과 최대 세 개의 vulnlookup 소스가 있으며, 각각 기본 URL, TCP 포트, QUIC 포트를 가집니다(포트가 비어 있으면 443으로 처리). 소스 1과 2는 기본적으로 공개 https://vulnlookup.ndaal.eu의 443 포트를 사용하고, 소스 3은 기본적으로 이 호스트 자체의 8680(TCP) / 8681(QUIC) 포트에서 루프백 https://127.0.0.1을 사용하므로, 같은 위치에 있는 vulnlookup이 즉시 작동하는 폴백이 됩니다. 소스는 순서대로 시도됩니다 — 첫 번째가 기본이고 나머지는 폴백입니다.
#![forbid(unsafe_code)]를 사용합니다. 린트 정책은 프로덕션 코드에서 패닉을 일으키는 단축 표현, 미검사 산술 연산, 미검사 인덱싱을 금지합니다.--encryption-key-file).--tls-key는 PKCS#1 RSA 키(no-RSA 정책)를 거부하고, Unix에서는 그룹 또는 전체가 읽을 수 있는 키 파일을 거부합니다.GET /export/download는 인식된 내보내기 또는 체크섬 사이드카 확장자를 가진 이름만 제공하므로, 잘못 구성된 내보내기 디렉터리가 시스템 파일을 내줄 수 없습니다.cargo audit는 깨끗합니다.crates.io에서 게시된 릴리스를 설치하세요 — cargo install은 소스에서 빌드하고, cargo binstall은 GitLab 릴리스에서 미리 빌드된 바이너리를 가져옵니다:
cargo install sbom-auditor # build from source
cargo binstall sbom-auditor # prebuilt GitLab-release binary
또는 이 체크아웃을 직접 빌드하세요(최신 안정 Rust 툴체인 필요):
cargo build --release
./target/release/sbom-auditor
그런 다음 https://127.0.0.1:8680을 여세요(브라우저가 자체 서명 인증서에 대해 한 번 경고합니다). 상단 내비게이션은 Home, Upload, Import, Export, Components, Tools, Settings 순으로 실행되며, 오른쪽에 다크/라이트 테마 전환, 언어 메뉴, 정보 메뉴가 이어집니다. 인터페이스는 49개 언어로 제공됩니다 — 영어, Deutsch, Français에 더해 모든 유럽 공식 언어, 노르웨이어 Nynorsk, 노르웨이에서 공용어인 세 개의 사미어(북부, 룰레, 남부 사미), 그리고 세 개의 아시아 추가 언어 — 중국어(中文), 힌디어(हिन्दी), 우르두어(اردو, 오른쪽에서 왼쪽) — 를 언어 메뉴에서 선택할 수 있습니다(브라우저별로 기억됨). 아래의 Supported GUI languages 섹션에 전체 내역이 있습니다.
--port <PORT> Listen port (default 8680, env SBA_PORT)
--bind <ADDR> Bind address (default 127.0.0.1, env SBA_BIND)
--data-dir <DIR> Data directory (SQLite store + stored SBOMs)
--db <PATH> Database path (default <data-dir>/auditor.db)
--encryption-key-file <F> Enable storage encryption with this 32-byte key
--tls-cert <F> --tls-key <F> Operator certificate instead of self-signed
--allow-non-loopback Permit binding a non-loopback address
--check-update Check gitlab.com for a newer release, then exit
--self-update Download + verify + install the latest release
--help Full option list
포트: 8680은 TLS 1.3(HTTP/1.1 + HTTP/2)을 통해 API와 웹 UI를 제공하며, 8681은 향후 QUIC / HTTP-3 리스너용으로 예약되어 있습니다(아직 구현되지 않음).
웹 UI는 49개 언어로 제공됩니다. 영어, Deutsch, Français는 유지 관리되는 사람이 작성한 집합이며 언어 전환기의 맨 앞에 고정됩니다. 다른 모든 언어는 영어 이름 기준 알파벳 순으로 이어집니다.
이번 주기에 세 개의 아시아 언어가 합류했습니다: 중국어 / 中文(만다린, 간체), 힌디어 / हिन्दी, 우르두어 / اردو. 우르두어는 오른쪽에서 왼쪽으로 쓰이며, 선택된 동안 애플리케이션은 <html dir="rtl">을 렌더링합니다.
고정된 세 언어를 제외한 모든 언어는 기계 번역이며 원어민 검토를 기다리고 있습니다. 번역에서 누락된 문자열은 자동으로 영어로 폴백됩니다. 페이지 내 전환기는 각 언어를 해당 언어의 고유 이름(endonym)으로 나열하며 이것이 권위 있는 목록입니다 — 여기에 열거된 것보다 이를 참조하세요.
이는 웹 UI에만 적용됩니다. 생성된 보고서(SARIF, CSAF 및 PDF 내보내기)와 HTTP API는 영어 전용으로 유지됩니다.
cargo nextest run # unit + integration suite
cargo test --doc # doctests
추가 하네스: loom-harness/(동시성 순열 모델), test/bruno/(API 컬렉션), test/playwright/(브라우저 E2E), test/example-corpus/(번들된 example/ SBOM 코퍼스에 대한 API + GUI 업로드→분석→내보내기), loadtest/(Goose 부하 시나리오). tests/scripts/test_examples_upload_via_api.sh(자매 .bats 포함)는 실행 중인 인스턴스에 대해 모든 example/ SBOM을 업로드하고, 각각이 스트리밍 POST /export/download ZIP을 통해 SARIF, CSAF 및 PDF를 산출하는지 검증합니다. TLS는 비루프백 호스트에 대해 검증되고 localhost의 자체 서명 인증서에 대해서는 건너뛰며, --base-url은 모든 인스턴스를 대상으로 합니다(예: https://sbom.ndaal.eu/). test/magnitude/ 스위트(Magnitude, *.mag.ts)는 내비바 순서와 내보내기 기본값 및 Start download에 대한 AI 기반 시각적 검사를 추가합니다. 이는 결정적 테스트를 보완하며, 실행하려면 LLM이 필요하고 차단 CI 게이트의 일부가 아닙니다. 디렉터리에는 651개의 공개 테스트 SBOM이 있습니다(Git LFS). 를 참조하세요. 모듈 맵과 요청 흐름은 를 참조하세요.
코드는 Apache-2.0으로 라이선스됩니다. 번들된 UI 자산은 자체 라이선스를 가집니다(Bootstrap MIT, htmx 0BSD, Roboto OFL-1.1). src/static/ 아래의 파일별 .license 사이드카를 참조하세요.
| 도구 | 역할 |
|---|
| syft | SBOM 정규화기 / CycloneDX 1.6 변환기 |
| grype | CVE 매처 |
| trivy | 취약점 스캐너 |
| osv-scanner | OSV 데이터베이스 조회 |
| bomber | 독립적 앙상블 매처 |
| bomdrift | 공급망 드리프트 / 타이포스쿼팅 (SARIF) |
| inspektr | SBOM 취약점 스캐너 (JSON) |
| shieldbom | 오프라인 임베디드/IoT CVE 스캐너 (SARIF) |
| provenant | 라이선스 / 저작권 / 출처 (ScanCode) |
example/