メインコンテンツへスキップ

ASARの整合性

ASARの整合性は、アプリケーションのASARアーカイブのコンテンツをランタイムで検証する実験的な機能です。

バージョンサポート

現在、ASAR整合性チェックは以下でサポートされています。

  • macOS: electron>=16.0.0以降
  • Windows: electron>=30.0.0以降

ASARの整合性チェックを有効にするには、app.asarファイルが、ASARの整合性をサポートする@electron/asar npmパッケージのバージョンによって生成されていることも確認する必要があります。

サポートはasar@3.1.0で導入されました。このパッケージはその後@electron/asarに移行したことに注意してください。@electron/asarのすべてのバージョンはASARの整合性をサポートしています。

仕組み

各ASARアーカイブには、JSON文字列ヘッダーが含まれています。ヘッダー形式には、アーカイブ全体の16進数エンコードハッシュと、blockSizeバイトごとのブロックの16進数エンコードハッシュの配列を含むintegrityオブジェクトが含まれています。

{
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}

別途、Electronアプリをパッケージ化する際に、ASARヘッダー全体の16進数エンコードハッシュを定義する必要があります。

ASAR整合性が有効になっている場合、ElectronアプリはランタイムでASARアーカイブのヘッダーハッシュを検証します。ハッシュが存在しない場合、またはハッシュが一致しない場合、アプリは強制終了されます。

バイナリでのASAR整合性の有効化

ASAR整合性チェックは、現在、Electronではデフォルトで無効になっています。ビルド時にEnableEmbeddedAsarIntegrityValidation Electron fuseを切り替えることで有効にできます。

このfuseを有効にする場合、通常はonlyLoadAppFromAsar fuseも有効にする必要があります。そうしないと、Electronアプリのコード検索パスを介して有効性チェックを回避できます。

const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses')

flipFuses(
// E.g. /a/b/Foo.app
pathToPackagedApp,
{
version: FuseVersion.V1,
[FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
[FuseV1Options.OnlyLoadAppFromAsar]: true
}
)
Electron ForgeのFuses

Electron Forgeを使用すると、Forge設定ファイルで@electron-forge/plugin-fusesを使用してアプリのfuseを構成できます。

ヘッダーハッシュの提供

ASARの整合性は、パッケージ時に提供するヘッダーハッシュに対してASARアーカイブの内容を検証します。このパッケージ化されたハッシュを提供するプロセスは、macOSとWindowsで異なります。

Electronツールを使用する

Electron ForgeとElectron Packagerは、追加の設定なしでこの設定を自動的に行います。ASARの整合性に必要な最小バージョンは次のとおりです。

  • @electron/packager@18.3.1
  • @electron/forge@7.4.0

他のビルドシステムを使用する

macOS

macOS用にパッケージ化する場合は、パッケージ化されたアプリのInfo.plistに有効なElectronAsarIntegrityディクショナリブロックを設定する必要があります。以下に例を示します。

Info.plist
<key>ElectronAsarIntegrity</key>
<dict>
<key>Resources/app.asar</key>
<dict>
<key>algorithm</key>
<string>SHA256</string>
<key>hash</key>
<string>9d1f61ea03c4bb62b4416387a521101b81151da0cfbe18c9f8c8b818c5cebfac</string>
</dict>
</dict>

有効なalgorithmの値は、現在SHA256のみです。hashは、指定されたアルゴリズムを使用してASARヘッダーのハッシュです。@electron/asarパッケージは、結果をハッシュしてこの値を生成できるgetRawHeaderメソッドを公開しています(たとえば、node:cryptoモジュールを使用)。

Windows

Windows用にパッケージ化する場合は、タイプがIntegrityで名前がElectronAsarの有効なリソースエントリを設定する必要があります。このリソースの値は、以下に示す形式のJSONエンコードされたディクショナリである必要があります。

[
{
"file": "resources\\app.asar",
"alg": "sha256",
"value": "9d1f61ea03c4bb62b4416387a521101b81151da0cfbe18c9f8c8b818c5cebfac"
}
]
情報

実装例については、Electron Packagerコードのsrc/resedit.tsを参照してください。