跳到主要內容

Electron 保險絲

套件建置時功能開關

什麼是保險絲?

對於 Electron 功能的子集,為整個應用程式停用某些功能是有意義的。例如,99% 的應用程式不會使用 ELECTRON_RUN_AS_NODE,這些應用程式希望能夠發布一個無法使用該功能的二進制檔案。我們也不希望 Electron 消費者從原始碼建置 Electron,因為這既是巨大的技術挑戰,也需要耗費大量的時間和金錢。

保險絲是這個問題的解決方案,從較高的層面來看,它們是 Electron 二進制檔案中的「魔術位元」,可以在封裝 Electron 應用程式時翻轉,以啟用/停用某些功能/限制。因為它們在您程式碼簽署應用程式之前的封裝時程中被翻轉,所以作業系統有責任確保這些位元不會透過作業系統層級的程式碼簽署驗證(Gatekeeper/App Locker)被翻轉回來。

目前的保險絲

runAsNode

預設: 啟用

@electron/fuses: FuseV1Options.RunAsNode

runAsNode 保險絲切換是否要遵循 ELECTRON_RUN_AS_NODE 環境變數。請注意,如果停用此保險絲,則主要程序中的 process.fork 將無法如預期般運作,因為它依賴此環境變數才能運作。相反地,我們建議您使用 工具程序,它適用於許多需要獨立 Node.js 程序的使用案例(例如 Sqlite 伺服器程序或類似情境)。

cookieEncryption

預設: 停用

@electron/fuses: FuseV1Options.EnableCookieEncryption

cookie 加密保險絲切換是否要使用作業系統層級的密碼編譯金鑰來加密磁碟上的 cookie 儲存區。預設情況下,Chromium 用於儲存 cookie 的 sqlite 資料庫會以純文字格式儲存值。如果您希望確保應用程式的 cookie 以與 Chrome 相同的方式加密,則應啟用此保險絲。請注意,這是單向轉換,如果您啟用此保險絲,現有的未加密 cookie 將在寫入時加密,但如果您隨後再次停用此保險絲,您的 cookie 儲存區實際上將會損壞且無用。大多數應用程式可以安全地啟用此保險絲。

nodeOptions

預設: 啟用

@electron/fuses: FuseV1Options.EnableNodeOptionsEnvironmentVariable

nodeOptions 保險絲切換是否要遵循 NODE_OPTIONSNODE_EXTRA_CA_CERTS 環境變數。NODE_OPTIONS 環境變數可用於將各種自訂選項傳遞到 Node.js 執行階段,並且通常不會在生產環境中的應用程式中使用。大多數應用程式可以安全地停用此保險絲。

nodeCliInspect

預設: 啟用

@electron/fuses: FuseV1Options.EnableNodeCliInspectArguments

nodeCliInspect 保險絲切換是否要遵循 --inspect--inspect-brk 等旗標。停用時,它還可以確保 SIGUSR1 訊號不會初始化主要程序偵測器。大多數應用程式可以安全地停用此保險絲。

embeddedAsarIntegrityValidation

預設: 停用

@electron/fuses: FuseV1Options.EnableEmbeddedAsarIntegrityValidation

embeddedAsarIntegrityValidation 保險絲切換 macOS 上的一項實驗性功能,該功能會在載入 app.asar 檔案時驗證其內容。此功能旨在將效能影響降至最低,但可能會稍微減慢從 app.asar 封存檔內部讀取檔案的速度。

有關如何使用 asar 完整性驗證的更多資訊,請閱讀 Asar 完整性 文件。

onlyLoadAppFromAsar

預設: 停用

@electron/fuses: FuseV1Options.OnlyLoadAppFromAsar

onlyLoadAppFromAsar 保險絲變更 Electron 用於定位應用程式碼的搜尋系統。預設情況下,Electron 將依以下順序搜尋:app.asar -> app -> default_app.asar。啟用此保險絲後,搜尋順序將變為單一項目 app.asar,從而確保與 embeddedAsarIntegrityValidation 保險絲結合使用時,無法載入未經驗證的程式碼。

loadBrowserProcessSpecificV8Snapshot

預設: 停用

@electron/fuses: FuseV1Options.LoadBrowserProcessSpecificV8Snapshot

loadBrowserProcessSpecificV8Snapshot 保險絲變更用於瀏覽器程序的 V8 快照檔案。預設情況下,Electron 的程序都將使用相同的 V8 快照檔案。啟用此保險絲後,瀏覽器程序會使用名為 browser_v8_context_snapshot.bin 的檔案作為其 V8 快照。其他程序將使用它們通常使用的 V8 快照檔案。

V8 快照可用於提高應用程式啟動效能。V8 允許您取得已初始化堆積的快照,然後將它們載入回去,以避免初始化堆積的成本。

為渲染器程序和主要程序使用單獨的快照可以提高安全性,尤其是確保渲染器不使用啟用 nodeIntegration 的快照。有關詳細資訊,請參閱 #35170

grantFileProtocolExtraPrivileges

預設: 啟用

@electron/fuses: FuseV1Options.GrantFileProtocolExtraPrivileges

grantFileProtocolExtraPrivileges 保險絲變更是否要為從 file:// 協定載入的頁面提供超出傳統 Web 瀏覽器中可獲得的權限。此行為在原始版本的 Electron 應用程式中是核心功能,但現在已不再需要,因為應用程式現在應 改為從自訂協定提供本機檔案。如果您沒有從 file:// 提供頁面,則應停用此保險絲。

此保險絲授予 file:// 協定的額外權限,其不完整的文件記錄如下

  • file:// 協定頁面可以使用 fetch 透過 file:// 載入其他資產。
  • file:// 協定頁面可以使用 Service Workers。
  • 無論沙箱設定為何,file:// 協定頁面都具有授予也以 file:// 協定執行的子框架的通用存取權。

我該如何翻轉保險絲?

簡單的方法

我們製作了一個方便的模組 @electron/fuses,讓翻轉這些保險絲變得容易。查看該模組的 README,以取得有關使用方式和潛在錯誤案例的更多詳細資訊。

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

flipFuses(
// Path to electron
require('electron'),
// Fuses to flip
{
version: FuseVersion.V1,
[FuseV1Options.RunAsNode]: false
}
)

您可以使用 fuses CLI 驗證保險絲是否已翻轉,或檢查任意 Electron 應用程式的保險絲狀態。

npx @electron/fuses read --app /Applications/Foo.app

困難的方法

快速詞彙表

  • 保險絲線:Electron 二進制檔案中用於控制保險絲的位元組序列。
  • 哨兵:您可以用於定位保險絲線的靜態已知位元組序列。
  • 保險絲架構:保險絲線的格式/允許值。

手動翻轉保險絲需要編輯 Electron 二進制檔案,並修改保險絲線以成為代表您想要的保險絲狀態的位元組序列。

在 Electron 二進制檔案中的某處,會有一系列看起來像這樣的位元組

| ...binary | sentinel_bytes | fuse_version | fuse_wire_length | fuse_wire | ...binary |
  • sentinel_bytes 始終是這個確切的字串 dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
  • fuse_version 是一個位元組,其無號整數值代表保險絲架構的版本。
  • fuse_wire_length 是一個位元組,其無號整數值代表以下保險絲線中保險絲的數量。
  • fuse_wire 是一個 N 位元組的序列,每個位元組代表單個保險絲及其狀態。
    • 「0」(0x30)表示保險絲已停用。
    • 「1」(0x31)表示保險絲已啟用。
    • 「r」(0x72)表示保險絲已移除,將位元組變更為 1 或 0 皆無效。

若要翻轉保險絲,請在保險絲線中找到其位置,然後根據您想要的狀態將其變更為「0」或「1」。

您可以在此處查看目前的架構。