xsaher/evm-analyzer
GitHub: xsaher/evm-analyzer
一款直接针对 EVM 字节码进行静态安全分析的智能合约漏洞检测工具,无需源代码即可通过多层分析引擎检测以太坊合约中的安全漏洞。
Stars: 0 | Forks: 0
# EVM 字节码安全分析器
一款用于 Ethereum 智能合约的静态安全分析工具。直接在已部署的字节码上运行——无需源代码。
作为个人项目开发,旨在深入理解 EVM 内部机制与智能合约安全。
## 与众不同之处
大多数像 Slither 和 MythX 这样的工具需要 Solidity 源代码。本工具分析任何已部署合约的编译后 EVM 字节码,甚至包括未经验证的合约。它超越了简单的模式匹配,通过三个独立的分析层在每个合约上同时运行。
## 基准测试
在 4 个类别的 50 个真实合约上进行了测试:历史受攻击合约、主要 DeFi 协议、ERC20 代币以及经过正式验证的安全合约。
| 指标 | 得分 |
|---|---|
| 已分析合约 | 50 |
| 受攻击合约 | 18 |
| True Positives | — |
| False Negatives | — |
| Precision | — |
| Recall | — |
| F1 Score | — |
运行基准测试:
```
python benchmark_runner.py
python benchmark_runner.py --category exploited
python benchmark_runner.py --limit 10
```
## 在真实受攻击合约上的测试
| 合约 | 被盗金额 | 工具检测结果 | 关键发现 |
|---|---|---|---|
| The DAO (2016) | $60M | CRITICAL | Reentrancy + Integer Overflow → Storage Corruption |
| Rubixi (2014) | $2M | CRITICAL | Reentrancy + Integer Overflow → Storage Corruption |
| Bancor (2018) | $23M | HIGH | SELFDESTRUCT + 用户控制的 Storage Write |
该工具检测到了每次攻击中被利用的确切漏洞。
## 检测到的漏洞
**通过 Pattern Analysis:**
- Reentrancy(CALL 在 SSTORE 之前)
- 向不受信任地址发起的 DELEGATECALL
- 无访问控制的 SELFDESTRUCT
- tx.origin 身份验证
- Timestamp dependence
- Weak randomness
- 未检查的外部调用返回值
- Integer overflow
**通过 Taint Analysis(块间):**
- 用户控制的 storage write
- 用户控制的 call target
- 用户控制的 ETH 转账金额
- 用户控制的 DELEGATECALL target
- 用户控制的 SELFDESTRUCT beneficiary
**通过 Symbolic Execution:**
- 确认的用户控制的 SSTORE(包含完整 value trace)
- 确认的用户控制的 CALL target(包含 taint origin)
- 确认的用户控制的 ETH 转账金额
- 确认的用户控制的 DELEGATECALL target
- 确认的用户控制的 SELFDESTRUCT beneficiary
**严重程度升级:**
- 流入 SSTORE 的 Integer overflow → 升级为 **CRITICAL**
- 流入 CALL value 的 Integer overflow → 升级为 **CRITICAL**
## 安装说明
```
git clone https://github.com/xsaher/evm-analyzer
cd evm-analyzer
pip install -r requirements.txt
cp .env.example .env
```
将你免费的 Etherscan API key 添加到 `.env` 中。可以在 etherscan.io/myapikey 获取
## 用法
```
# 单个 contract
python main.py 0xdAC17F958D2ee523a2206206994597C13D831ec7
# 多个 contract
python main.py 0xdAC17F958D2ee523a2206206994597C13D831ec7 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# 将报告保存到特定文件夹
python main.py 0xdAC17F958D2ee523a2206206994597C13D831ec7 -o ./reports
# 检查版本
python main.py --version
```
每次分析会生成:
- 带有颜色编码严重程度级别的终端摘要
- `report_.html` — 可视化审计报告
- `report_.json` — 用于集成的结构化输出
## 架构
```
evm-analyzer/
├── fetcher/
│ └── etherscan.py
├── decoder/
│ └── opcode_decoder.py
├── analyzer/
│ ├── cfg_builder.py
│ ├── vulnerability_patterns.py
│ └── taint_analysis.py
├── symbolic_execution/
│ ├── symbolic_value.py
│ ├── symbolic_stack.py
│ ├── symbolic_interpreter.py
│ ├── symbolic_engine.py
│ ├── symbolic_finding.py
│ └── path_state.py
├── reporter/
│ ├── html_report.py
│ └── json_report.py
├── benchmark_runner.py
└── main.py
```
## 工作原理
```
Contract Address
│
▼
Etherscan API → Raw Bytecode
│
▼
Opcode Decoder → Instruction list
│
▼
CFG Builder → Basic blocks + edges
│
├──→ Pattern Matching → Reentrancy, SELFDESTRUCT, tx.origin...
│
├──→ Taint Analysis → Tracks user input across all blocks
│ Escalates severity when overflow hits a sink
│
└──→ Symbolic Execution → Runs every opcode with symbolic values
Confirms taint reaches dangerous sinks
│
▼
HTML + JSON Reports
```
### Symbolic Execution
符号引擎为每个用户控制的输入分配一个符号值——包括 `CALLDATALOAD`、`CALLER`、`CALLVALUE` 等。这些值带有一个 taint origin 标签,该标签会在整个 CFG 中的每一次算术和逻辑操作中传播。
当被污染的值到达危险 sink(`SSTORE`、`CALL`、`DELEGATECALL`、`SELFDESTRUCT`)时,引擎会记录一个已确认的发现,并附带完整的 taint origin。这消除了仅靠模式匹配带来的误报:只有在数据流被证明时才会报告发现,而不仅仅是怀疑。
引擎使用工作列表算法来遍历 CFG,并通过在每个条件跳转处记录路径约束来支持通过 `JUMPI` 进行分支。
## 技术栈
- Python 3.9+
- NetworkX — CFG 构建与遍历
- pycryptodome — 用于函数选择器解析的 keccak256
- Requests — Etherscan API
- Rich — 终端输出
## 参考
- [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf)
- [EVM Opcodes 参考](https://www.evm.codes/)
- [The DAO 攻击分析](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)
- [Consensys 智能合约最佳实践](https://consensys.github.io/smart-contract-best-practices/)
*本工具是用于自动化静态分析的活跃研究原型,不能替代完整的手动安全审计。*
标签:EVM字节码, XSS注入, 云安全监控, 区块链安全, 字符串匹配, 智能合约审计, 特权检测, 逆向工具, 静态分析