aswathas/Project-Hail-Mary
GitHub: aswathas/Project-Hail-Mary
一款端到端 EVM 区块链取证工具,通过本地化分析解决链上攻击调查的可追溯性与证据完整性问题。
Stars: 0 | Forks: 0
# ChainSentinel
**EVM 区块链取证工具** — 端到端调查链上漏洞利用。
给定一个交易哈希、钱包地址或区块范围,ChainSentinel 将运行完整的取证流水线:收集原始链数据、解码数据、推导安全事件、通过 ES|QL 运行 20 种启发式信号检测、通过 EQL 匹配 4 种复合攻击模式、追踪 5 跳内的资金流向、聚类攻击者钱包,并在带有 Ollama 驱动的协办的 React 调查工作区中呈现结果,该协办可生成 7 部分取证报告。
为 SISA 构建。完全离线运行 — 无云依赖。
## 快速开始
### 先决条件
| 工具 | 安装 |
|------|------|
| Docker | [docker.com](https://docs.docker.com/get-docker/) |
| Python 3.11+ | `sudo apt install python3.11 python3.11-venv` |
| Node 18+ | `curl -fsSL https://deb.nodesource.com/setup_18.x \| sudo -E bash - && sudo apt install -y nodejs` |
| Foundry (Anvil) | `curl -L https://foundry.paradigm.xyz \| bash && foundryup` |
| Ollama | `curl -fsSL https://ollama.com/install.sh \| sh` |
### 一键启动
```
cd chainsentinel
chmod +x start.sh
./start.sh
```
在浏览器中打开 **http://localhost:5173**。
### 手动启动(5 个终端)
**终端 1 — Elasticsearch:**
```
docker run -d --name chainsentinel-es -p 9200:9200 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.12.0
```
**终端 2 — Ollama:**
```
ollama serve
# 在另一个标签页或服务启动后:
ollama pull gemma3:1b
```
**终端 3 — Anvil(本地 EVM 节点):**
```
anvil --chain-id 31337
```
**终端 4 — 后端(FastAPI):**
```
cd chainsentinel
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn server:app --host 0.0.0.0 --port 8000 --reload
```
**终端 5 — 前端(React):**
```
cd chainsentinel/frontend
npm install
npm run dev
```
打开 **http://localhost:5173**
## 运行演示
### 第一步:部署模拟
在 Anvil 运行后,部署以下 4 种攻击场景之一:
```
cd simulations
# 重入漏洞排水(测试 AP-005)
forge script scenarios/reentrancy-drain/script/RunAll.s.sol \
--rpc-url http://127.0.0.1:8545 --broadcast
# 闪电贷预言机操纵(测试 AP-001)
forge script scenarios/flash-loan-oracle/script/RunAll.s.sol \
--rpc-url http://127.0.0.1:8545 --broadcast
# 管理员密钥滥用(测试 AP-008)
forge script scenarios/admin-key-abuse/script/RunAll.s.sol \
--rpc-url http://127.0.0.1:8545 --broadcast
# MEV 三明治攻击(测试 AP-014)
forge script scenarios/mev-sandwich/script/RunAll.s.sol \
--rpc-url http://127.0.0.1:8545 --broadcast
```
每个脚本会打印交易哈希 — 复制一个攻击交易哈希。
### 第二步:在 UI 中分析
1. 打开 http://localhost:5173
2. 验证所有 3 个连接点(RPC、Elasticsearch、Ollama)为绿色
3. 选择 **Tx Analysis** 模式
4. 粘贴攻击交易哈希
5. 点击 **Run Analysis**
6. 观察流水线流式输出:
- Collector 获取原始交易数据
- Normalizer 标准化类型
- Decoder 匹配 ABI 签名
- Derived builder 生成安全事件
- Signal engine 触发 ES|QL 启发式
- Pattern engine 匹配攻击序列
7. 自动切换到 **Investigation View**,展示:
- 按严重性着色的攻击时间线
- 已触发信号及其分数
- 实体图谱(攻击者红色、协议蓝色)
- 元栏显示攻击者地址、受害合约、 drained 资金
### 第三步:使用协办
分析完成后,使用右侧面板:
- 点击 **“What signals fired”** 获取信号解释
- 点击 **“Generate Report”** 生成 7 部分取证报告
- 询问关于调查的自由格式问题
### 第四步:尝试范围分析
```
# 运行模拟后,扫描所有区块:
# 在 UI 中:选择范围模式,from_block: 0,to_block: 20
# 点击运行分析
```
## 架构
```
RPC (Anvil/Testnet/Mainnet)
|
v
Collector --> raw txs, receipts, logs, traces
|
v --> ES: forensics-raw
Normalizer --> hex->int, addresses lowercase, timestamps ISO 8601
|
v
Decoder --> ABI decode (case ABIs -> standards -> protocols -> selector cache)
|
v --> ES: forensics (layer: decoded)
Derived Event Builder --> 9 security event types
|
v --> ES: forensics (layer: derived)
Signal Engine --> runs 20 .esql queries
|
v --> ES: forensics (layer: signal)
Pattern Engine --> runs 4 .eql sequence queries
|
v --> ES: forensics (layer: alert)
Correlation --> fund tracing + wallet clustering
|
v --> ES: forensics (layer: attacker)
```
### 关键设计原则
- **Python 是数据管道** — 将数据从链传输到 ES
- **ES 是大脑** — 信号检测和模式匹配使用 ES|QL 与 EQL 查询
- **新增信号** = 在 `detection/signals/` 中添加 `.esql` 文件
- **新增模式** = 在 `detection/patterns/` 中添加 `.eql` 文件
- **证据完整性** — 原始链数据永不修改,单独索引
- **可重现** — 重新运行分析不会产生重复数据
## 项目结构
```
Project_Hail_Mary/
├── chainsentinel/ # The forensic tool
│ ├── config.json # Single source of truth
│ ├── server.py # FastAPI + SSE streaming
│ ├── start.sh # One-command startup
│ ├── requirements.txt
│ │
│ ├── pipeline/ # Data pipeline (Plan 1)
│ │ ├── collector.py # RPC data fetching
│ │ ├── normalizer.py # Type normalization
│ │ ├── decoder.py # ABI decoding
│ │ ├── derived.py # Security event builder
│ │ ├── ingest.py # ES bulk ingest
│ │ ├── runner.py # Pipeline orchestrator
│ │ └── abi_registry/ # ERC20, protocols, case ABIs
│ │
│ ├── detection/ # Detection engine (Plan 2)
│ │ ├── signal_engine.py # Runs .esql files
│ │ ├── pattern_engine.py # Runs .eql files
│ │ ├── signals/ # 20 ES|QL signal queries
│ │ └── patterns/ # 4 EQL attack patterns
│ │
│ ├── correlation/ # Correlation engine (Plan 3)
│ │ ├── fund_trace.py # BFS 5-hop fund tracing
│ │ ├── clustering.py # Wallet clustering
│ │ ├── mixer_detect.py # Tornado Cash/bridge/CEX
│ │ └── label_db.py # OFAC/known exploiter labels
│ │
│ ├── ollama/ # LLM integration (Plan 6)
│ │ ├── copilot.py # Context-aware chat
│ │ ├── report_template.py # Builds JSON context
│ │ └── report_sections.py # 7-section report
│ │
│ ├── es/ # Elasticsearch
│ │ ├── setup.py # Index creation
│ │ └── mappings/ # Strict JSON mappings
│ │
│ ├── frontend/ # React UI (Plan 4)
│ │ └── src/
│ │ ├── components/ # 6 components
│ │ ├── hooks/ # 4 custom hooks
│ │ └── api/ # 3 API modules
│ │
│ └── tests/ # 130 Python tests
│
└── simulations/ # Foundry simulations (Plan 5)
├── shared/contracts/ # MockERC20, MockWETH
└── scenarios/ # 4 attack scenarios
├── reentrancy-drain/
├── flash-loan-oracle/
├── admin-key-abuse/
└── mev-sandwich/
```
## 运行测试
```
# Python 测试(130 个测试)
cd chainsentinel
source .venv/bin/activate
python -m pytest tests/ -v
# 前端测试(28 个测试)
cd chainsentinel/frontend
npx vitest run
# Solidity 编译
cd simulations
forge build
```
## 分析模式
| 模式 | 输入 | 用途 |
|------|-------|------|
| **Tx Analysis** | 交易哈希 | 深入调查单个可疑交易 |
| **Range Analysis** | 起始/结束区块号 | 扫描已知漏洞利用窗口 |
| **Wallet Hunt** | 钱包地址 | 追踪攻击者资金流向 |
| **Watch Mode** | 无(持续运行) | 实时监控 |
## 检测覆盖
### 20 种信号(第 1 阶段)
| 类别 | 信号 |
|------|------|
| 价值 | large_outflow, large_token_transfer, max_approval, value_spike |
| 闪电贷 | flash_loan_detected, flash_loan_with_drain |
| 访问控制 | ownership_transferred, role_granted, proxy_upgraded |
| 结构 | reentrancy_pattern, call_depth_anomaly, repeated_external_call, internal_eth_drain |
| 部署 | new_contract_deployed, failed_high_gas |
| 流动性 | large_liquidity_removal |
| DeFi | vault_first_deposit_tiny, liquidation_event |
| 行为 | new_wallet_high_value, burst_transactions |
### 4 种攻击模式
| ID | 模式 | 置信度 |
|----|------|--------|
| AP-001 | 闪电贷预言机操纵 | 0.90 |
| AP-005 | 重入漏洞 draining | 0.90 |
| AP-008 | 访问控制滥用 | 0.85 |
| AP-014 | MEV 夹击 | 0.80 |
## 配置
编辑 `chainsentinel/config.json`:
```
{
"rpc_url": "http://127.0.0.1:8545",
"es_url": "http://localhost:9200",
"ollama_url": "http://localhost:11434",
"ollama_model": "gemma3:1b",
"chain_id": 31337,
"mode": "simulation"
}
```
切换到主网:将 `rpc_url` 改为你的 Alchemy/Infura 端点,并将 `chain_id` 改为 `1`。无需代码更改。
## 技术栈
| 组件 | 技术 |
|------|------|
| 流水线 | Python 3.11+, web3.py |
| 后端 | FastAPI, SSE |
| 检测 | Elasticsearch 8.x(ES|QL + EQL) |
| 前端 | React 18, Vite, D3.js |
| 样式 | 纯 CSS(Wise 设计系统) |
| LLM | Ollama + Gemma 3 1B |
| 模拟 | Foundry, Solidity 0.8.24+ |
## 在新机器上设置
```
# 1. 克隆仓库
git clone https://github.com/aswathas/Project-Hail-Mary.git
cd Project-Hail-Mary
# 2. 安装 Python 依赖
cd chainsentinel
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 3. 安装前端依赖
cd frontend
npm install
cd ..
# 4. 安装 Foundry(用于模拟)
curl -L https://foundry.paradigm.xyz | bash
foundryup
cd ../simulations
forge install
cd ..
# 5. 拉取 Ollama 模型
ollama pull gemma3:1b
# 6. 启动所有服务
cd chainsentinel
./start.sh
```
由 Aswath 为 SISA 构建。
标签:AI 辅助分析, AI风险缓解, Anvil, AV绕过, Docker, Elasticsearch, EQL, ES|QL, EVM, FastAPI, Foundry, GNU通用公共许可证, LLM评估, Node.js, Ollama, Python 3.11, React, SISA, Syscalls, 事件调查, 交易追踪, 以太坊, 前端可视化, 区块链取证, 区块链安全, 启发式检测, 复合攻击模式, 安全防御评估, 本地部署, 法医报告, 离线取证, 请求拦截, 资金流向分析, 逆向工具, 钱包聚类