原生映像檔中的安全性考量

native-image 建構器會在應用程式啟動後產生快照,並將其捆綁在二進位執行檔中。原生映像檔的建構輸出中的安全性報告部分提供關於原生映像檔建構的安全性相關資訊。

類別初始化 #

native-image 建構器可能會在建構時執行特定類別的靜態初始化器 (請參閱類別初始化以取得更多詳細資訊)。在建構時執行靜態初始化器會將初始化後的狀態保留在映像檔堆積中。這表示在靜態初始化器中取得或計算的任何資訊都會成為原生執行檔的一部分。這可能會導致敏感資料最終出現在快照中,或修正應在啟動時取得的初始化資料,例如隨機數種子。

開發人員可以透過在建構原生執行檔時指定 --initialize-at-run-time CLI 參數,並在後面加上以逗號分隔的套件和類別清單 (及其所有子類別),要求在執行階段執行處理敏感資訊的靜態初始化器,而不是在映像檔建構期間。或者,開發人員可以使用 RuntimeClassInitialization API

開發人員應在專用的環境中執行 native-image 建構器,例如容器,該環境本身不包含任何敏感資訊。

軟體物料清單 #

GraalVM 原生映像檔可以在建構時組裝軟體物料清單 (SBOM),以偵測任何可能容易受到已知安全性漏洞影響的程式庫。原生映像檔提供 --enable-sbom 選項,可將 SBOM 嵌入到原生執行檔中 (僅適用於 Oracle GraalVM)。除了嵌入之外,也可以使用 --enable-sbom=classpath,export 將 SBOM 新增至類別路徑或匯出為 JSON。

支援 CycloneDX 格式,且為預設格式。若要將 CycloneDX SBOM 嵌入到原生執行檔中,請將 --enable-sbom 選項傳遞至 native-image 命令。

該實作會透過復原原生執行檔中包含的類別之外部程式庫資訊清單中的所有版本資訊來建構 SBOM。SBOM 也會進行壓縮,以限制 SBOM 對原生執行檔大小的影響。
SBOM 以 gzip 格式儲存,導出的 sbom 符號會參考其起始位址,而 sbom_length 符號則參考其大小。

將壓縮的 SBOM 嵌入到執行檔中後,原生映像檔檢查工具能夠使用可透過 $JAVA_HOME/bin/native-image-inspect --sbom <binary_path> 從執行檔和共用程式庫存取的選用 --sbom 參數來擷取壓縮的 SBOM。它會以以下格式輸出 SBOM

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "version": 1,
  "components": [
    {
      "type": "library",
      "group": "io.netty",
      "name": "netty-codec-http2",
      "version": "4.1.76.Final",
      "properties": [
        {
          "name": "syft:cpe23",
          "value": "cpe:2.3:a:codec:codec:4.1.76.Final:*:*:*:*:*:*:*"
        },
        {
          "name": "syft:cpe23",
          "value": "cpe:2.3:a:codec:netty-codec-http2:4.1.76.Final:*:*:*:*:*:*:*"
        },
        {
          "name": "syft:cpe23",
          "value": "cpe:2.3:a:codec:netty_codec_http2:4.1.76.Final:*:*:*:*:*:*:*"
        },
        ...
      ]
    },
    ...
  ],
  "serialNumber": "urn:uuid:51ec305f-616e-4139-a033-a094bb94a17c"
}

若要掃描任何易受攻擊的程式庫,請將 SBOM 提交至漏洞掃描器。例如,廣受歡迎的 Anchore 軟體供應鏈管理平台免費提供 grype 掃描器。您可以檢查 SBOM 中指定的程式庫是否在 Anchore 的資料庫中有記錄已知的漏洞。為此,該工具的輸出可以直接饋送到 grype 掃描器,以檢查易受攻擊的程式庫,使用命令 $JAVA_HOME/bin/native-image-inspect --sbom <binary_path> | grype,其會產生以下輸出

NAME                 INSTALLED      VULNERABILITY   SEVERITY
netty-codec-http2    4.1.76.Final   CVE-2022-24823  Medium

然後,您可以使用此報告來更新在執行檔中找到的任何易受攻擊的相依性。

請注意,如果 native-image-inspect 在未使用 --sbom 選項的情況下使用,它會執行指定原生二進位檔的部分,以擷取方法層級的資訊。此功能不應在來自不明或不受信任來源的原生映像檔執行檔上使用。

原生映像檔中的 Java 序列化 #

原生映像檔支援序列化,以協助使用者還原序列化原生執行檔中包含的類別的建構函式。除非由原生映像檔分析自動擷取,否則必須預先指定這些類別,因為無法還原序列化原生執行檔中未包含的類別。原生映像檔無法單獨防止利用反序列化漏洞。應遵循 Java SE 的序列化和反序列化安全編碼指南

原生映像檔建構輸出的安全性報告部分提供資訊,說明反序列化程式碼是否為原生映像檔攻擊面的一部分。

其他 #

不允許設定安全性管理員。如需更多資訊,請參閱相容性文件

原生映像檔提供多種方式來指定用於定義預設信任儲存區的憑證檔。雖然 native-image 的預設行為是擷取並使用建構時主機環境中的預設信任儲存區,但可以在執行階段透過設定「javax.net.ssl.trustStore*」系統屬性來變更此行為。如需更多詳細資訊,請參閱文件

當在執行階段使用 System.loadLibrary() 載入原生程式庫時,包含原生執行檔的目錄是搜尋路徑的一部分。

原生映像檔不允許啟用 Java 安全性管理員,因為此功能自 Java 17 起已遭到棄用。嘗試設定安全性管理員會觸發執行階段錯誤。

與我們聯繫