flowchart TD A[确认事件与交易哈希] --> B[收集合约源码和链上状态] B --> C[还原调用树与资产流] C --> D[定位首个异常状态变化] D --> E[提出漏洞假设] E --> F[构建最小复现] F --> G{复现是否符合链上结果} G -- 否 --> C G -- 是 --> H[评估影响与受影响版本] H --> I[提出修复并编写回归测试]
sequenceDiagram participant A as 攻击合约 participant L as 闪电贷池 participant V as 受害合约 participant M as 外部市场 A->>L: 借入临时资金 A->>M: 改变可被引用的市场状态 A->>V: 调用存在缺陷的函数 V-->>A: 错误转出资产 A->>L: 归还本金与费用
常见漏洞分类
重入:外部调用发生在关键状态更新之前,攻击者能够重复进入同一路径。
权限错误:管理函数缺少访问控制,或授权判断使用了错误主体。
价格操纵:协议直接依赖可在单笔交易内显著改变的现货价格。
会计错误:份额、资产、债务或手续费之间的换算不满足预期不变量。
签名缺陷:缺少 nonce、截止时间、链 ID 或合约域隔离,导致重放。
代理问题:初始化、升级授权或存储布局存在错误。
拒绝服务:循环、外部依赖或异常处理使关键功能长期不可用。
最小重入示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20;
contract VulnerableVault { mapping(address => uint256) public balanceOf;
function deposit() external payable { balanceOf[msg.sender] += msg.value; }