如何 SBOM 生成?

解读

在国内安全合规语境下,SBOM(软件物料清单) 已成为等保 2.0、关基、信创验收以及国测中心渗透测试前的强制交付物。面试官问“如何 SBOM 生成”,并不是让你背诵 SPDX 或 CycloneDX 的 XML 字段,而是考察:

  1. 你是否理解 Rust 项目的依赖链完全由 Cargo.lock 描述;
  2. 能否用官方/社区工具把依赖图一键转成国内监管认可的 CycloneDX JSON 格式;
  3. 是否知道如何把 SBOM 与许可证、漏洞库(CNNVD、CNVD、NVDB)做二次匹配,形成可落地的安全台账。
    回答时务必突出“编译期即可拿到完整依赖”这一 Rust 独有优势,并给出 CI 集成方案,体现工程化思维。

知识点

  • Cargo.lock 语义:精确到 checksum,保证可重复构建,是 SBOM 的单一真实源。
  • cargo-cyclonedx:官方插件,支持 workspace 级多 crate 一次性输出 CycloneDX 1.5 JSON,字段覆盖 name、version、purl、license、hash、dependency graph。
  • cargo-sbom:国内华为开源镜像仓已同步,可生成 SPDX 2.3 与 CycloneDX 双格式,兼容信创扫描器。
  • 审计阶段:用 cargo-audit 对接 RustSec,再调用 osv.dev 国内加速源,把 CVE/CNNVD 编号写回 SBOM 的 vulnerabilities 数组,满足关基审查“漏洞可追踪”要求。
  • CI 模板:GitLab 官方 Rust 模板已内置 cargo-cyclonedx,产物通过 gitlab-sbom-export 直接推送到国家互联网应急中心接口,10 秒内完成备案。

答案

“在 Rust 项目中生成合规 SBOM 只需三步,全程无需手动维护列表:
第一步,cargo install cargo-cyclonedx,在 workspace 根目录执行
cargo cyclonedx –format json –output-dir ./sbom
即可得到 CycloneDX 1.5 标准文件,包含所有 crate 的精确版本、checksum、license 表达式及依赖树。
第二步,cargo audit –json > vuln.json,把 RustSec 与 CNNVD 双库命中结果合并回 SBOM,形成 vulnerabilities 节点,满足等保“已知漏洞闭环”要求。
第三步,在 GitLab CI 中加一段 6 行脚本:

generate-sbom:
  stage: compliance
  script:
    - cargo cyclonedx –output-dir .
    - cargo audit –json > audit.json
    - cyclonedx-cli merge –input-files *.json –output-file sbom-final.json
  artifacts:
    reports:
      sbom: sbom-final.json

产物可直接对接国家关基检测平台,编译通过即生成完整物料清单,实现零人工、零漏报、零延迟。”

拓展思考

  1. 如果项目混用 C/C++ 子模块,可用 cargo-xwin + syft 组合,先让 syft 扫描 target/release/build 下的 *.a 静态库,再把 Rust 侧 SBOM 与 C 侧 SPDX 用 cyclonedx-cli 合并,解决“混合语言信创验收”难题。
  2. 对于车载场景(ISO 21434),可在 build.rs 中注入 git 哈希与编译器版本,写入 SBOM 的 properties 字段,满足“二进制可重现”审计要求。
  3. 未来 Rust 编译器可能原生支持 –emit=sbom 标志,直接把 MIR 级别的依赖图写进 CycloneDX,届时无需第三方插件即可在 rustc 阶段完成合规输出,值得持续关注官方 RFC 3316 进展。