合约漏洞&合约审计工具

漏洞

重入攻击 Reentrancy

利用外部合约在 fallback 中重新调用原函数。历史上最著名的 The DAO 事件便因重入漏洞导致约 6000 万美元 ETH 被盗,最终造成以太坊社区分裂(形成 ETH/ETC 链)。

防护方法:先更新状态,再转账。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

// ❌ 有漏洞
function withdraw() public {
    //检查用户余额
    require(balance[msg.sender] > 0);
    //msg.sender向用户转账,call会移交控制权,在它的 fallback() 函数里再次调用 withdraw(),此时 balance[msg.sender] 还没变,依然 > 0,于是递归再次转账,直到掏空池子!
    (bool sent,) = msg.sender.call{value: balance[msg.sender]}("");
    //确认转账是否成功
    require(sent);
    //最后才清零余额
    balance[msg.sender] = 0;
}

// ✅ 修复后
function withdraw() public {
    //将余额提取到内存变量中
    uint256 amount = balance[msg.sender];
    //余额清零
    balance[msg.sender] = 0;
    //转账
    (bool sent,) = msg.sender.call{value: amount}("");
    //确认转账结果
    require(sent);
}

预言机操纵 Oracle Manipulation

依赖外部价格源的不可信更新。

解决方法:

  • 使用 Chainlink 等权威价格源。

  • 增加时序约束和多源验证。

  • 使用 TWAP 等加权算法。

整数溢出/下溢

使用 unchecked {} 时需确保逻辑安全。

推荐使用 Solidity 0.8+ 的内建溢出检查或 SafeMath。

权限控制缺失

所有管理函数应使用 onlyOwner 或 AccessControl 修饰符保护。

未初始化代理

基于代理模式的合约若未正确执行初始化函数,可能被任意人初始化并接管合约。

著名的例子包括 Harvest Finance 其在使用 Uniswap V3 做市策略的 Vault 合约中存在未初始化漏洞,如果被利用攻击者可销毁实现合约。该团队曾为此漏洞支付高额赏金修复。

前置交易/三明治攻击

攻击者在交易执行前后分别发送交易,以不利滑点或套利为目的。

合约审计工具

  • Slither:以 Python 编写的静态分析工具,可检测安全漏洞和代码规范问题。常用命令为 slither MyContract.sol(也可指定合约地址)来扫描合约代码

    Slither 官方文档

  • MythX:基于云平台的安全分析服务,支持命令行和 API 调用。使用 CLI 时,可执行类似 mythx analyze MyContract.sol 进行安全扫描

    使用方式

  • Foundry:高效的 Solidity 开发测试框架,支持属性测试(模糊测试)。可使用 forge test 运行所有测试

    Foundry 模糊测试文档,或通过 forge test –match-path <test 文件路径> 定向运行特定测试文件。

审计流程

  • 静态分析(Static Analysis):使用工具如 Slither、Mythril 扫描代码缺陷。

  • 动态测试(Fuzzing/Property Testing):模拟攻击行为和极限条件。

  • 人工审查(Manual Review):由资深审计员检查业务逻辑漏洞。

  • 审计报告生成(Audit Report):明确发现的问题及修复建议。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计