ASAR Integrity
ASAR 무결성 검증은 앱의 ASAR 아카이브 내용을 런타임에 검증하는 실험적인 기능이다.
버전 지원
현재 ASAR 무결성 검사는 다음 플랫폼에서 지원된다:
- macOS:
electron>=16.0.0
버전부터 - Windows:
electron>=30.0.0
버전부터
ASAR 무결성 검사를 활성화하려면, app.asar
파일이 ASAR 무결성을 지원하는 @electron/asar
npm 패키지 버전으로 생성되었는지 확인해야 한다.
ASAR 무결성 검사 기능은 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 무결성 활성화
Electron에서는 기본적으로 ASAR 무결성 검사가 비활성화되어 있다. 빌드 시 EnableEmbeddedAsarIntegrityValidation
Electron 퓨즈를 활성화하면 이 기능을 사용할 수 있다.
이 퓨즈를 활성화할 때는 일반적으로 onlyLoadAppFromAsar
퓨즈도 함께 활성화하는 것이 좋다. 그렇지 않으면 Electron 앱 코드 검색 경로를 통해 무결성 검사를 우회할 수 있다.
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses')
flipFuses(
// 예: /a/b/Foo.app
pathToPackagedApp,
{
version: FuseVersion.V1,
[FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
[FuseV1Options.OnlyLoadAppFromAsar]: true
}
)
Electron Forge를 사용하면 Forge 설정 파일에서 @electron-forge/plugin-fuses를 통해 앱의 퓨즈를 구성할 수 있다.
헤더 해시 제공
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
파일을 참고한다.