ネイティブ・イメージのセキュリティに関する考慮事項
native-image
ビルダーは、起動後にアプリケーションのスナップショットを生成し、バイナリ実行可能ファイルにバンドルします。ネイティブ・イメージのビルド出力のセキュリティ・レポート・セクションには、ネイティブ・イメージ・ビルドに関するセキュリティ関連情報が表示されます。
クラスの初期化
native-image
ビルダーでは、ビルド時に特定のクラスの静的イニシャライザを実行できます(詳細はクラスの初期化に関する項を参照)。ビルド時に静的イニシャライザを実行すると、初期化後の状態がイメージ・ヒープに保持されます。このことは、静的イニシャライザで取得または計算された情報が、ネイティブ・実行可能ファイルの一部になることを意味します。これにより、機密データがスナップショットに含められたり、乱数シードなど、起動時に取得されることが想定される初期化データが修正される可能性があります。
開発者は、ネイティブ実行可能ファイルのビルド時に--initialize-at-run-time
CLIパラメータを指定し、その後にイメージのビルド中ではなく、実行時に初期化される必要があるパッケージとクラス(およびそのすべてのサブクラスを暗黙的に含む)のカンマ区切りリストを指定して、機密情報を処理する静的イニシャライザを実行時に実行するようリクエストできます。あるいは、開発者はRuntimeClassInitialization
APIを使用することもできます。
開発者は、そもそもコンテナなどの機密情報が含まれていない専用環境でnative-image
ビルダーを実行する必要があります。
ソフトウェア部品表
ネイティブ・イメージは、アプリケーションを構成するすべてのコンポーネント、ライブラリおよびモジュールのインベントリであるソフトウェア部品表(SBOM)を埋め込むことができます。詳細は、ネイティブ・イメージのソフトウェア部品表(SBOM)を参照してください。
ネイティブ・イメージでのJavaのシリアライズ
ネイティブ・イメージではシリアライズがサポートされており、ネイティブの実行可能ファイルに含まれているクラスのコンストラクタをユーザーがデシリアライズできます。ネイティブ・イメージ分析によって自動的にピックアップされないかぎり、ネイティブ実行可能ファイルに含まれていないクラスはデシリアライズできないため、これらのクラスは事前に指定する必要があります。ネイティブ・イメージは、デシリアライズの脆弱性の悪用を単独で防ぐことはできません。Java SEのシリアライズおよびデシリアライズ・セキュア・コーディング・ガイドラインに従う必要があります。
ネイティブ・イメージのビルド出力のセキュリティ・レポート・セクションには、デシリアライズ・コードがネイティブ・イメージの攻撃対象領域の一部であるかどうかに関する情報が表示されます。
その他
セキュリティ・マネージャの設定は許可されていません。詳細は、互換性に関するドキュメントを参照してください。
ネイティブ・イメージには、デフォルトのTrustStoreの定義に使用される証明書ファイルを指定する複数の方法が用意されています。native-image
のデフォルト動作では、ビルド時のホスト環境からデフォルトのTrustStoreを取得して使用しますが、これは実行時にjavax.net.ssl.trustStore*システム・プロパティを設定して変更できます。詳細は、ドキュメントを参照してください。
実行時にSystem.loadLibrary()
を使用してネイティブ・ライブラリをロードする場合、ネイティブ実行可能ファイルを含むディレクトリは検索パスの一部です。
ネイティブ・イメージでは、Javaセキュリティ・マネージャを有効にできません。この機能がJava 17以降非推奨になったためです。セキュリティ・マネージャを設定しようとすると、ランタイム・エラーが発生します。