5月29日 22:35

Solidity 智能合约有哪些常见安全漏洞?如何防止?

最致命的 5 类漏洞:重入攻击(Reentrancy)——用 Checks-Effects-Interactions 模式或 ReentrancyGuard;整数溢出——Solidity 0.8+ 内置检查,0.7 及以下用 SafeMath;权限控制缺失——关键函数加 onlyOwner / onlyRole,用 OpenZeppelin 的 AccessControl;闪电贷操纵价格——用 TWAP 而非现货价格,加交易延迟;前端运行(MEV)——用 commit-reveal 方案或私有内存池。核心原则:所有外部调用都是不安全的,所有用户输入都是恶意的。

追问

重入攻击为什么最难防?

因为 transfer / call 会把控制权交给对方合约,对方可以回调你的函数,而你的状态还没更新。Checks-Effects-Interactions 模式强制先改状态再转账,ReentrancyGuard 用锁变量硬性阻止递归进入。两者都用最稳。

0.8 之后真的不需要 SafeMath 了吗?

算术运算溢出会自动 revert,是的。但类型转换溢出不检查——uint256 i = type(uint256).max; uint8 j = uint8(i) 会静默截断。unchecked 块内的运算也不检查,只在 gas 优化场景使用且确保不会溢出。

如何防止闪电贷攻击?

闪电贷让攻击者在单笔交易内借到巨量资金操纵价格后归还。防御:用 Uniswap V3 TWAP(时间加权平均价格)取代现货价格;限制单笔交易的滑点范围;加 block.timestamp 延迟阻止同区块操作。

delegatecall 有什么安全隐患?

delegatecall 在调用者上下文执行被调用者的代码——意味着被调用合约可以修改调用者的存储布局。如果 slot 对不上(存储碰撞),可能覆盖 owner 地址。代理合约模式必须严格对齐存储布局,用 OpenZeppelin 的透明代理或 UUPS 避免手动管理。

审计工具能替代人工审计吗?

不能。Slither / Mythril / Foundry Fuzz 能找到已知的模式型漏洞,但业务逻辑漏洞(如价格计算公式错误、奖励分配不公平)只能人工审查。工具 + 人工审计 + 测试网演练三者缺一不可。

标签:Solidity