返回

在原生可执行文件中嵌入 SBOM 以识别其依赖项

Native Image 可以嵌入软件物料清单 (SBOM)。SBOM 是构成应用程序的所有组件、库和模块的清单。它提供应用程序使用的所有开源和专有库及其版本的详细信息。使用 --enable-sbom 选项将 SBOM 合并到原生可执行文件中。它默认支持 CycloneDX 格式。(在 GraalVM 社区版中不可用。)

先决条件

  • 确保您已安装 Oracle GraalVM。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问下载部分
  • Syft

在构建时生成 SBOM

对于演示应用程序,您将使用 jwebserver 工具,并将其打包为带有嵌入式 SBOM 的原生可执行文件。

jwebserver 是 JDK 中包含的用于从单个目录层次结构提供静态文件的最小 HTTP 服务器。它于 Java 18 中添加

  1. 将以下代码保存到名为 index.html 的文件中,以便 Web 服务器有内容可提供
     <!DOCTYPE html>
     <html>
         <head>
             <title>jwebserver</title>
         </head>
         <body>
         <h2>Hello, GraalVM user!<p>
         </body>
     </html>
    
  2. 从您保存 index.html 的目录中,运行以下命令以创建原生可执行文件并嵌入 SBOM
     native-image --enable-sbom=cyclonedx -m jdk.httpserver -o jwebserver
    

    Native Image 通过传递 -m 选项,从 JDK 提供的 jdk.httpserver 模块编译 jwebserver。它生成一个包含 GZIP 格式压缩 SBOM 的原生可执行文件。

  3. (可选)运行已编译的 jwebserver 可执行文件并在浏览器中访问 localhost:8000
     ./jwebserver
    

提取嵌入式 SBOM

有两种可能的方法可以将压缩的 SBOM 内容提取为可读格式

Syft

Syft,即 syft,是由 Anchore 维护的开源工具。Syft 可以提取嵌入式 SBOM,并以原生 Syft 格式或 CycloneDX 格式呈现。得益于 GraalVM 团队的贡献,syft 现在可以提取针对 Linux、macOS 或 Windows 构建的原生可执行文件中的 SBOM。

对原生可执行文件运行 syft 以读取其 SBOM 内容

syft jwebserver

它列出了其中包含的所有 Java 库。

Native Image 检查工具

GraalVM Native Image 提供 Inspect Tool 以检索嵌入在原生可执行文件中的 SBOM。如果您不想安装 syft,Inspect Tool 是一个可行的替代方案。

运行以下命令,使用 Inspect Tool 读取 SBOM 内容

native-image-inspect --sbom jwebserver

更进一步,您可以将 SBOM 提交给任何可用的漏洞扫描器,并检查记录的库是否存在已知的安全漏洞。漏洞扫描器会将 SBOM 中列出的组件与漏洞数据库中的 CVE 进行交叉引用。

本指南演示了如何获取应用程序供应链的洞察,以帮助评估与第三方依赖项相关的风险。Native Image 可以在构建时将 SBOM 嵌入到原生可执行文件或共享库中。

联系我们