hexvero

io.github.maximilianfeix由 GitHub 账号 maximilianfeix 发布v0.12.0更新于 Nov 1, 2026

Electron release diff for security review: what changed in IPC, contextBridge, windows and hosts.

已验证STDIO仅桌面开发者工具安全与监控

概览

AI 生成的概览

静态检查本地软件构建(主要是 Electron 应用),让助手对比两个版本,查看 IPC、preload 桥接、窗口设置和网络主机发生了什么变化。

可以做什么
  • 打开、列出和关闭本地文件或目录作为分析目标,返回大小、哈希和识别出的格式
  • 按目标格式运行内置分析器,并分页查看符号、导入、节区、IPC 通道、窗口、端点、发现项等命名集合
  • 提取带标签的字符串,并读取目标的有界十六进制窗口
  • 将完整分析导出为 JSON,或把打包模块和 source map 中的原始文件恢复到新目录
  • 在两个构建之间对比某个集合、通过 source map 把生成位置映射回原始位置,并对两个构建套用发布策略
  • 检测可选的外部引擎,并运行反汇编、反编译、交叉引用、调用图等有界操作
适用场景
适合在审查 Electron 或其他打包版本两次构建之间改了什么时使用,也适合在不运行软件的前提下审计单个构建中的风险模式。同样适用于 CI 式发布门禁,以及需要标注文件与行号、并说明哪些结论无法确定的调查。
运行要求
通过 npx 以 stdio 在本地运行,需要 Node.js 22.12 或更高版本。未声明认证、环境变量或请求头。目标须使用绝对路径;输入可以是 app.asar、macOS 的 .app、Windows 或 Linux 安装目录,或发布的 zip,安装包需先解包。若已安装 radare2/rizin、Ghidra 等外部引擎会被检测到。
安装前请注意
导出和恢复会在 hexvero 进程可写的任意位置写入文件,路径需谨慎选择。结论反映代码内容,而非运行时行为或可利用性,检查通过并不等于安全结论。解析恶意文件仍会处理攻击者控制的字节。通过云端托管的助手使用时,所请求的结果会发送给该助手的模型提供商。仅可用于你有权检查的软件。

安装

在 SourceWeft 中

  1. 打开 控制台中的 hexvero,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[hexvero logo: an amber H on charcoal]

hexvero

Know what changed inside your Electron release.

Diff two builds of an Electron app and see the IPC channels, preload bridge, window settings and network hosts that changed, with file and line on both sides.

[CI] [npm] [Node] [License]

Website · Try it · CI · AI agents · Comparison · Limits · Docs

English · Deutsch · Español · Français · Português (Brasil) · Русский · 中文 · 日本語 · 한국어


[30 seconds of real output: npx hexvero demo lists what changed between two builds of an example Electron app, including a new preload member with its preload and handler lines and an IPC channel reported as unknown; hexvero check fails the release policy with exit 3; then the local web UI opens the new member and the changed window with the source lines of both builds]

30 seconds of real output: a terminal recording and a browser recording, joined with a fade · mp4 · terminal: release-review-terminal.tape, UI: record-release-review.mjs

Try it in 10 seconds

bash
npx hexvero demo

Needs Node.js 22.12 or newer. It copies two builds of a small example app (NotesDesk 1.4.0 and 1.5.0) into ./hexvero-demo and shows what changed. Excerpt, … marks cuts:

text
What changed between notesdesk-1.4.0.asar and notesdesk-1.5.0.asar  Two builds of a small example Electron app, read statically. Nothing was executed.
  interfaces (2)    + preload.js::notesdesk::checkUpdate  @ b: preload.js:9, handler main.js:30 · link direct    - preload.js::notesdesk::openInShell  @ a: preload.js:9, handler main.js:30 · link direct  …  ipcChannels (2)    + update:check  @ b: receiver main.js:30, sender preload.js:9    ? shell:open  @ a: receiver main.js:30, sender preload.js:9        the other side has values there that could not be resolved  windows (1)    ~ main.js::win  @ b: main.js:8        nodeIntegration: true → false, nodeIntegrationInEffect: "on" → "off", sandbox: false → true  …  endpoints (1)    + main.js::fetch::https://updates.notesdesk.example/latest.json  @ b: main.js:30 · literal

? means hexvero could not tell, so shell:open is reported as unknown, not as removed. Then turn it into a gate:

text
$ npx hexvero check hexvero-demo/notesdesk-1.4.0.asar hexvero-demo/notesdesk-1.5.0.asar --policy hexvero-demo/policy.jsonhexvero check fail: the policy is violated  ✗ new-interface-member  notesdesk.checkUpdate  new · fail  ✗ new-external-host  updates.notesdesk.example  new · fail  …$ echo $?3

npx hexvero ui --demo --open shows the same comparison in a local web UI with the source lines of both builds side by side. The full tour: walkthrough.

Why

  • A release review asks what the update changed: which channels a page can now reach, which preload members appeared, which window got more permissive, which servers the code now calls.
  • A diff of the shipped bundle does not answer that. It is minified JavaScript inside an app.asar; running the app to find out is not always allowed, and a checklist scanner looks at one build, not the change.
  • hexvero answers it from the files: each change with the file and line it was read from in both builds, what it could not establish, and a policy that fails CI on a new member, host or more permissive window. Nothing is executed.

What it reads

IPC and bridge mapwindow → contextBridge member → IPC channel → ipcMain handler, with how each link was read
Window settingswebPreferences per window, and whether nodeIntegration and sandbox are in effect
Runtime and fusesElectron, Chromium and Node versions, fuses and the ASAR integrity record, read from packaged binaries
Hosts and storagenetwork endpoints and localStorage/sessionStorage keys, literal or inferred
CI gate and SARIFhexvero check: exit 0 pass, 3 violated, 4 not decidable; baseline, suppressions, SARIF 2.1.0
MCP for agents16 tools with small paged answers, so a coding agent can run the same review
Local web UIthe comparison with both builds' source lines side by side, plus an offline HTML report

Inputs: an app.asar, a macOS .app, a Windows or Linux install directory, or the release .zip you publish. Installers (.dmg, setup .exe, AppImage) need unpacking first. Per-platform paths: docs/cli.md.

On your own app

bash
npx hexvero compare old/YourApp.app new/YourApp.app --report report.html   # one offline HTML pagenpx hexvero init old/YourApp.app                                            # starting policy, current hosts allowednpx hexvero check old/YourApp.app new/YourApp.app --policy .hexvero/policy.json

To accept what is there today, add --baseline .hexvero/baseline.json --update-baseline once; later runs fail only on new findings.

One build instead of two, with the single-build checks known from Electronegativity (CSP, shell.openExternal, permission handlers, window settings, certificate and command-line switches):

bash
npx hexvero audit YourApp.app --format sarif > audit.sarif   # exit 3 when a rule is violated

Use it in CI

Pinned to a version so a release cannot change your results unannounced:

yaml
jobs:  hexvero:    runs-on: ubuntu-latest    permissions:      contents: read    steps:      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7        with:          persist-credentials: false      - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7        with:          node-version: 24      # Build your app and fetch the previous release here, e.g. into previous/ and dist/.      - run: npx --yes [email protected] check previous/app.asar dist/app.asar --policy .hexvero/policy.json

Baseline, Markdown job summary and a least-privilege SARIF upload for code scanning: docs/ci.md.

For AI agents

In Claude Code, server and skill come as one plugin:

text
/plugin marketplace add maximilianfeix/hexvero/plugin install hexvero@hexvero

Elsewhere, npx hexvero setup --apply registers the MCP server with the coding agents it finds (dry run without --apply), or run npx -y [email protected] mcp over stdio. Text inside the target is treated as data, never as instructions. Clients, tools and what an agent receives: docs/mcp.md.

How it compares

hexveroElectronegativityREAdiff of two bundles
Built forwhat changed between two buildsknown risky patterns in one buildbroad reverse engineering, static and dynamicany text change
Compares two builds of one appyes, list by listno (one build; checks between Electron versions)yes (compare_application_versions)yes, minified bytes
Bridge member → IPC channel, blind holdout265 of 78not measured6 of 66no
Release policy with CI exit codesyes (0/3/4, SARIF)SARIF outputnot comparedno
CSP, shell.openExternal, permission handlersyes, hexvero audit (0.12)yesnot comparedno
Statusactive, MITarchived 2026-10-24, last release 2023activen/a

Electronegativity was archived on 2026-10-24. hexvero audit <build> runs part of its single-build checks with the same exit codes and SARIF as check; which checks are covered and which are not is listed in the migration page. REA does much that hexvero does not (dynamic analysis, devices, decompilers); use it for that. Sources, dates and every caveat: docs/comparison.md.

Accuracy and limits

On the newest blind set, written by someone without access to hexvero, it found 52 of 64 IPC channels with none false, and it misses and misreports rows in other lists (all numbers). On real releases it is checked against the source (GitHub Desktop 3.6.7 → 3.6.10, Electron Fiddle 0.38 → 0.39), misses included. It reads files and never runs them, so a finding is what the code contains, not what it does at run time or whether it is exploitable; a passing check is not a security verdict. Parsing a hostile file still processes attacker-controlled bytes, within size, depth and time limits. The full list: docs/accuracy.md.

Docs

Walkthrough · CLI · CI · MCP · Policy schema · Electron rules and sources · Accuracy · Benchmarks · Other formats (native binaries, APK, WebAssembly and more) · Changelog

FAQ: does it run or upload my files?

No. Targets are parsed as bytes; nothing is executed. The UI binds to 127.0.0.1 with a per-session token. There is no telemetry and no network call in the code base. Through a cloud-hosted agent, the results that agent requests go to its model provider like any other tool output. Use hexvero only on software you may examine (DISCLAIMER.md).

Contributing

bash
npm install && npm run check      # typecheck, lint, format, unit tests, shape rulesnpm run e2e                       # the user flows on real inputs

Rules in CONTRIBUTING.md; good first issue is sized for an afternoon. Found a wrong or missing fact? Open a bug report with hexvero doctor output and, if you can, the file.

If hexvero showed you something you would have missed in a release, a ⭐ helps the next Electron team find it.

License

MIT

来源:README.md,提交 12626b3

工具

16

hexvero_open

Open target

Register a local file or directory for analysis. Returns its id, size, hash and detected format. Ids are stable per content.

输入参数path必填

hexvero_list

List targets

List targets opened in this session.

无需输入参数。

hexvero_close

Close target

Release a target and its retained analysis.

输入参数targetId必填

hexvero_analyze

Analyze target

Run the built-in analyzer for the target's format (ELF/PE/Mach-O, Go, .NET, WASM, EVM, SQLite, plist, APK, ZIP, Electron ASAR, JavaScript apps, source maps, HAR). Returns a summary, findings with confidence, limitations, a compact overview and the collections available for paging. Large JavaScript apps are read in batches: when `complete` is false, `coverage` says how many files are unread and every list covers the scanned part only; call again with scan to read more.

输入参数scanbatchfreshdetailincludetargetId必填

hexvero_collection

Page a collection

Page through one named list from the analysis, e.g. symbols, imports, exports, sections, libraries, types, methods, pinvokes, selectors, instructions, tables, columns, requests, endpoints, permissions, components, modules, edges, ipcChannels, findings. Use hexvero_analyze to see which exist.

输入参数textlimitoffsetmaxBytestargetId必填collection必填

hexvero_strings

Strings

Printable ASCII (and optional UTF-16LE) strings with offsets and tags (url, path, email, ip, format, secret-ish, base64-ish).

输入参数tagtextlimitutf16offsetmaxBytestargetId必填minLength

hexvero_bytes

Read bytes

Read a bounded window (max 64 KiB) of the target as hex plus an ASCII gutter.

输入参数length必填offset必填targetId必填

hexvero_export

Export analysis

Write the complete analysis as JSON to a file and return its path and size. Use this instead of paging when you need everything.

输入参数path必填targetId必填overwrite

hexvero_recover

Recover sources

Write recoverable sources into a new directory: the modules of a webpack/Rspack/browserify/esbuild bundle (one file each plus hexvero-bundle.json with requires/exports), or the original files embedded in a source map (sourcesContent). No engine needed; nothing is executed.

输入参数targetId必填outputDir必填

hexvero_unknowns

Unknowns ledger

Record a material question the investigation could not answer (with what was already checked), list open or resolved unknowns, or resolve one. Unknowns are exported with the analysis so reports never silently drop them.

输入参数idlimitaction必填offsetstatuscheckedquestiontargetIdresolution

hexvero_compare

Compare collections

Diff one collection between two targets: added, removed, changed (with the fields that differ) and unchanged items, matched by key (auto-detected: name, channel, id, path, url, type+name … or pass key, a+b for composites). States completeness; unknown items are neither added nor removed. Each list pages on its own (list + offset). Without collection: counts per shared collection, to pick one.

输入参数keylistlimitignoreoffsetstricttargetA必填targetB必填collection

hexvero_check

Check release policy

Apply a release policy (inline JSON or file) to two builds, as `hexvero check`: status pass, fail or incomplete, and findings paged by offset. Reads a baseline, never writes one.

输入参数limitformatoffsetpolicytargetA必填targetB必填policyPathbaselinePath

hexvero_sourcemap

Resolve source map position

Map a generated line/column of a source map target back to its original source, line, column and name.

输入参数line必填column必填targetId必填

hexvero_providers

Providers

Detect optional external engines (radare2/rizin, Ghidra) and the operations each supports.

无需输入参数。

hexvero_provider_run

Run provider operation

Run one engine operation on a target: functions, disassemble, decompile, strings, imports, xrefs (references to an address), callers, callees, callgraph or search (names + strings). Output is bounded and cached.

输入参数textaddressprovider必填targetId必填operation必填timeoutMs

hexvero_call_graph

Call graph

Bounded call-graph neighborhood around a function (callers, callees or both, by depth and node count), or the shortest call path from root to goal. One engine run per target, cached; levels state what was cut.

输入参数goalroot必填maxDepthmaxNodesprovider必填targetId必填directiontimeoutMs

版本历史

11
  1. v0.12.0最新Oct 25, 2026
  2. v0.11.1Oct 18, 2026
  3. v0.10.1Oct 18, 2026
  4. v0.9.8Oct 18, 2026
  5. v0.9.6Oct 17, 2026
  6. v0.9.1Oct 17, 2026
  7. v0.9.0Oct 17, 2026
  8. v0.8.0Oct 16, 2026
  9. v0.7.5Oct 15, 2026
  10. v0.6.2Oct 15, 2026
  11. v0.4.0Oct 14, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分