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を使用すると、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
ディクショナリブロックを設定する必要があります。以下に例を示します。
<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
を参照してください。