sanbir/evm-hack-analyzer

GitHub: sanbir/evm-hack-analyzer

一个纯浏览器端、无后端的 EVM 漏洞利用调试器,支持对历史攻击交易进行 opcode 级重放、Solidity 源码映射单步调试、漏洞标注及去中心化 PoC 分享。

Stars: 5 | Forks: 2

# EVM Hack Analyzer 一个**完全静态、无后端、纯浏览器端的 EVM 漏洞调试器**。将其指向任意交易哈希,它将: 1. 在该交易发生的*前一个*区块**分叉**链状态(通过普通的归档 JSON-RPC 实现)。 2. 在浏览器内置的 EVM (`@ethereumjs/vm`) 中**重放**确切的历史交易,并记录所有调用深度下的*每一个* opcode —— 包括 stack、memory、storage 写入、transient storage、gas 以及完整的调用帧树。 3. **下载**该交易触及的每个合约的已验证 Solidity 源代码(通过 Etherscan V2),在 Web Worker 中使用其确切的编译设置**编译**它们,并**匹配**链上 bytecode 以生成 `pc → 源码行` 映射。 4. 让你可以逐个 opcode 或逐行对照 Solidity 源码进行**单步调试**,同时保持 opcode、stack、memory 和 storage 同步 —— 并且能够**标记漏洞所在行**以及一组有序的**漏洞利用步骤**,每个步骤都附带描述。 5. 将所有内容**导出**为 ZIP 文件,或者将其**锁定到 IPFS** (Pinata) 并分享链接。任何打开该链接的人都会在本地重放该漏洞利用过程 —— 无需服务器,无需 RPC。 一切都在你的浏览器中运行。唯一的网络请求仅限于你提供的 RPC、Etherscan、`binaries.soliditylang.org`(官方 solc 二进制文件,仅用于编译)、IPFS 网关以及 Pinata(仅在你选择上传时)。 它还可以打开精选的**脚本化漏洞利用 ZIP 文件**,这些文件来自 [evm-hack-poc](https://github.com/sanbir/evm-hack-poc)(由 [evm-hack-registry](https://github.com/sanbir/evm-hack-registry) 数据生成 —— 与 [crypto.training/hacks](https://crypto.training/hacks/) 上展示的数据库相同)。 ## 生态系统 | 项目 | 作用 | |---------|------| | [evm-hack-registry](https://github.com/sanbir/evm-hack-registry) | 源码注册表 / 结构化漏洞数据 | | [evm-hack-analyzer](https://github.com/sanbir/evm-hack-analyzer) (本仓库) | 用于检查和标注漏洞利用的分析器 UI 与工具 | | [evm-hack-poc](https://github.com/sanbir/evm-hack-poc) | 面向社区的可分享 PoC ZIP 归档 | | [crypto.training/hacks](https://crypto.training/hacks/) | 该数据库的公开可浏览镜像 | ## 用法 ``` npm install npm run dev # http://localhost:5173 npm run build # static site → dist/ npm run preview ``` ### 生成 POC 提供一个**交易哈希**、一个**归档 RPC URL**(必须支持历史 `eth_getBalance` / `eth_getCode` / `eth_getStorageAt` —— 例如 Infura、Alchemy、QuickNode),以及一个 **Etherscan V2 API key**(一个 key 即适用于所有受支持的链 —— 链 ID 会从 RPC 中自动检测)。点击 **Generate POC**。 ### 标注 - **Mark vuln** → 点击存在漏洞的源码行 → 填写标题 + 描述。 - **Mark step** → 按照漏洞利用顺序点击源码行 → 为每一步填写标题 + 描述。 这些操作将驱动 **Go to vulnerability** 和 **Watch exploit live** 按钮。 ### 分享 - **⬇ poc.json** → 单个自包含的 JSON(规范格式;最适合用于 IPFS / 重新加载)。 - **Download ZIP** → 人类可读的映射视图,不会重复庞大的数据:包含 `anvil_state.json`(分叉状态)、`sources//…`(Solidity 文件)、`poc-data/core.json`(仅包含 tx + pc→行映射 + 标注)。加载时会自动重组还原。 - **Upload to IPFS** → 输入 Pinata API key + secret → 获取一个 CID 和一个格式为 `…/#` 的分享链接。打开该链接将直接从 IPFS 加载并重放 POC(会依次尝试你的网关,然后是 `ipfs.io`,接着是 `dweb.link`)。 如果你希望自己的研究实现真正的去中心化,也可以将你的 PoC 发布到 IPFS 上。 ### 加载脚本化漏洞利用 ZIP 分析器可以打开**来自 [evm-hack-poc](https://github.com/sanbir/evm-hack-poc) 的 ZIP 文件**(脚本化漏洞利用包,包含 `poc-data/runner.json` + `anvil_state.json` + `sources/`)。将 `.zip` 文件拖放到 **Load** 卡片上,或打开其 IPFS CID 即可。 这些归档文件由 [evm-hack-registry](https://github.com/sanbir/evm-hack-registry) 生成,并镜像了 [crypto.training/hacks](https://crypto.training/hacks/) 上的数据。 与原生 POC(从 `accounts` 重放单个历史 tx)不同,这些 ZIP 文件描述的是一个**脚本化漏洞利用**:分析器会加载转储的分叉状态,并在同一个浏览器内置的 EVM 中运行它 —— 部署(或 `etch`)攻击合约,应用设置(`vm.deal`/`warp`/`roll`/`store`/`dealToken`),然后逐个 opcode 记录攻击过程(一次 `attackFunction()` 调用或一次 `callScript`)。生成的记录将驱动完全相同的调试器(opcode、调用树、memory / stack / storage、源码单步调试),并将漏洞利用合约的源码以及解析到已部署漏洞利用地址上的 `vulnerability` + `story` 标注进行渲染。无需 RPC 或 Etherscan key —— 漏洞利用触及的一切都已经包含在该压缩包中。导出时会重新生成一个 ZIP 文件(或可选地生成重新标注的 poc-data JSON),该文件可以通过加载器和 IPFS 进行完整的往返交互。 ## 产物格式 **规范的**原生产物是一个自包含的 JSON(`.poc.json` 下载 / IPFS 锁定):包含交易信封 + 区块、确切的分叉 `accounts`(代码 + storage + 交易触及的余额)、已验证的 `contractSources`(包含 `pcToLine`)、人类可读的 `labels`,以及 `vulnerability` + `story` 标注。查看器会从 `accounts` 确定性地重新运行 tx,因此无论在哪里加载,POC 的重放效果都是完全一致的。 **ZIP** 是对相同数据的高效、可浏览的映射视图:分叉状态和源码树作为独立文件存在;精简的 `poc-data/core.json` 仅保存这些映射视图中省略的内容(tx、映射、标注)。嵌入了完整 `poc-data/poc.json` 的旧版 ZIP 仍然可以加载。 加载时具备格式自动检测功能:带有 `evm-hack-analyzer-poc` `kind` 标记的 JSON 会走上述的 tx 重放路径;而来自 [evm-hack-poc](https://github.com/sanbir/evm-hack-poc) 的 ZIP(或者包含 `slug` + `expected` + `accounts` 但没有 `kind` 的 runner JSON)则走脚本化漏洞利用路径。 ## 部署到 IPFS `npm run build` 会输出一个完全相对路径的 `dist/` 目录(Vite `base: "./"`),因此它可以在任何网关的子路径下运行。锁定该文件夹: ``` npx kubo add -r dist # or: ipfs add -r dist / Pinata "pin a folder" ``` 打开 `https:///ipfs//` 并将 POC 链接分享为 `https:///ipfs//#`。`#` 哈希值会在加载时被读取 —— 它不依赖于特定的网关路径,因此可以在任何网关前缀下存活。 ## 设计说明 / 限制 - **状态分叉使用 `eth_getBalance/getCode/getStorageAt`,而不是 `eth_getProof`**,因为公共提供商通常会将 `eth_getProof` 限制在最近的区块窗口内。 - **同区块依赖**:状态是在 `block-1` 处分叉的,因此如果一个 tx 依赖于*同一个*区块中较早的 tx,其状态可能会出现偏差(这是标准的分叉测试注意事项)。 - **源码映射需要经过验证且 bytecode 匹配的合约**;proxy 和未经验证的合约将仅以 opcode 形式渲染(漏洞仍然可以锚定在*确实*能映射的任何合约上,例如余额发生变动的 token)。 - **solc 运行在 Web Worker 中**,加载官方的 `soljson-.js`;这仅在*生成*期间发生。查看 POC 不需要 solc,也不需要 RPC。 ## 免责声明 这些材料仅供**教育和防御性安全研究使用**。 - 请勿使用这些内容攻击线上系统或窃取资金。 - 务必遵守适用法律和负责任的漏洞披露惯例。 - 复现历史漏洞利用行为应仅在本地或分叉环境中进行。
标签:自动化攻击