Native Image 中的安全注意事项

native-image 构建器在应用程序启动后生成一个快照,并将其打包成一个二进制可执行文件。Native Image 构建输出的安全报告部分提供了关于 Native Image 构建的安全相关信息。

类初始化 #

native-image 构建器可能会在构建时执行某些类的静态初始化器(详见类初始化)。在构建时执行静态初始化器会将初始化后的状态持久化到镜像堆中。这意味着在静态初始化器中获取或计算的任何信息都将成为原生可执行文件的一部分。这可能导致敏感数据最终进入快照,或者固定本应在启动时获取的初始化数据,例如随机数种子。

开发人员可以通过在构建原生可执行文件时指定 --initialize-at-run-time CLI 参数,来请求处理敏感信息的静态初始化器在运行时执行。此参数后跟一个逗号分隔的包和类列表(以及隐式地,它们的所有子类),这些包和类必须在运行时而不是在镜像构建期间进行初始化。此外,开发人员还可以利用 RuntimeClassInitialization API

开发人员应在专用的环境中运行 native-image 构建器,例如容器,该环境本身不应包含任何敏感信息。

软件物料清单 #

Native Image 可以嵌入软件物料清单 (SBOM),它是一个应用程序所有组件、库和模块的清单。更多信息请参阅Native Image 中的软件物料清单 (SBOM)

Native Image 中的 Java 序列化 #

Native Image 支持序列化,以帮助用户反序列化原生可执行文件中包含的类的构造函数。除非由 Native Image 分析自动识别,否则这些类必须预先指定,因为未包含在原生可执行文件中的类无法反序列化。Native Image 无法单独阻止反序列化漏洞的利用。应遵循 Java SE 序列化和反序列化安全编码指南

Native Image 构建输出的安全报告部分提供了关于反序列化代码是否为 Native Image 攻击面一部分的信息。

杂项 #

不允许设置安全管理器。有关更多信息,请参阅兼容性文档

Native Image 提供了多种方法来指定用于定义默认 TrustStore 的证书文件。虽然 native-image 的默认行为是捕获并使用构建时主机环境中的默认 TrustStore,但这可以通过在运行时设置“javax.net.ssl.trustStore*”系统属性来更改。有关更多详细信息,请参阅文档

在运行时使用 System.loadLibrary() 加载原生库时,包含原生可执行文件的目录是搜索路径的一部分。

Native Image 不允许启用 Java 安全管理器,因为此功能自 Java 17 起已被弃用。尝试设置安全管理器将触发运行时错误。

联系我们