跳转至

Electron fuse 状态

inspect_electron_fuses / inspect-electron-fuses 用于判断打包后的 Electron 应用是否会遵循 --inspect 和 --inspect-brk、ELECTRON_RUN_AS_NODE、嵌入式 ASAR 完整性验证,以及是否仅从 app.asar 加载应用代码。它会读取存储在 Electron 二进制文件中的 fuse wire(fuse 字节流)。它不会启动应用、修改 fuse 字节,也不会使用网络。

rea inspect-electron-fuses /Applications/Example.app --json

CLI 会根据调用者的工作目录解析相对路径。MCP 要求使用绝对文件系统路径,并保留该精确选择:

{
  "name": "inspect_electron_fuses",
  "arguments": { "path": "/Applications/Example.app" }
}

在 POSIX 主机上,CLI 会保留路径组件,因此符号链接会在父级(..)步骤之前被跟随。bundle 选择可以以 . 结尾,或通过真实目录进行父级步骤;如果最后一个父级步骤经过目录符号链接,则会被拒绝。Windows CLI 路径保留本机的驱动器盘符及分隔符解析方式。

在使用 electron-main 执行 observe_javascript_runtime 之前,请先检查这一点。当 EnableNodeCliInspectArguments 被禁用或移除时,Electron 会忽略 Inspector 标志,随后的 target 列表可能根本不会显示主进程 target。

读取内容

在 macOS 上,传入 .app bundle 或 Electron Framework 二进制文件。bundle 和 framework 的选择顺序是:先尝试顶层 Electron Framework 二进制文件,然后尝试 Versions/Current/Electron Framework,最后尝试 Versions/A/Electron Framework。只有仍然位于该 framework 内部的符号链接才会被跟随。 在 Windows 和 Linux 上,传入主 Electron 可执行文件。wire 位于该可执行文件中,而不是在 app.asar 中。

内联 Evidence 结果包含:

  • 所选路径、解析后的常规文件、其 SHA-256、大小以及容器格式(mach-o、mach-o-universal、pe 或 elf);
  • 对于 thin Mach-O、PE 或 ELF 文件,包含一个 slice 条目;对于通用 Mach-O,每个 slice 包含一个条目,并带有文件绝对 sentinel_offset 值;
  • wire_version、declared_length 以及有序的 fuses { index, name, state, raw_byte };
  • sentinel_count,包括为零和大于一的情况;
  • runtime_implications,每个都标记为 relationship: "derivation",并关联到其来源的 fuse 索引。

版本 1 的名称,按索引顺序依次为 RunAsNode、EnableCookieEncryption、EnableNodeOptionsEnvironmentVariable、EnableNodeCliInspectArguments、EnableEmbeddedAsarIntegrityValidation、OnlyLoadAppFromAsar、LoadBrowserProcessSpecificV8Snapshot、GrantFileProtocolExtraPrivileges 和 WasmTrapHandlers。超出该表的索引,或任何其他 wire 版本下的索引,会保留 name: null 和原始字节。

Wire 字节中,0x30 表示禁用,0x31 表示启用,0x72 表示移除。任何其他字节均为 unknown。被移除的 fuse 不是启用状态:Inspector 标志和 ELECTRON_RUN_AS_NODE 不会被遵循,应用代码也不会被限制在 app.asar 中。在 macOS 和 Windows 上,被移除或被禁用的 EnableEmbeddedAsarIntegrityValidation 字节意味着嵌入式 ASAR 完整性不会被强制校验;启用字节则意味着会强制校验。Electron 只在 macOS 和 Windows 上编译该验证逻辑。在 Linux ELF 可执行文件上,观察到的字节会被保留,强制校验结果为 unknown。

未知与多个 sentinel

没有 sentinel 意味着 fuse 状态未知,而不是 fuses 被禁用。如果 wire 在 slice 之后仍然继续,则会被报告为截断(truncated),并且只包含实际存在的 fuse 字节。一个 slice 中出现两个或更多 sentinel 时,全部都会被报告;REA 不会只选一个。

Fuse 字节并不能证明应用通过其他方式启用了 Inspector,例如通过 app.commandLine 或应用代码中的远程调试开关。

所选文件必须是常规文件,或者是能解析到常规文件的 bundle。符号链接仅在 Electron Framework.framework 内部才会被跟随。读取器最多接受 1 GiB,使用 256 KiB 窗口进行搜索,并且每个 slice 最多保留 32 个 sentinel。实际的一个九 fuse、单 slice 结果大约为 1,200 个 CLI token;双 slice 结果大约为 1,300 个 token。确切大小会随路径长度和限制条件而变化。此检查不会创建临时文件,也不会修改所选字节。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea