智能合约漏洞入门指南:新手必懂的十类常见安全风险
智能合约的世界没有 ctrl+z。一行错误的代码就可能让上百万用户的资产蒸发。对新手而言,第一件事不是急着写复杂协议,而是熟悉常见漏洞类型,建立结构化的安全认知。本文带你走过十类必懂的漏洞。
一、重入攻击:经典中的经典
重入是最古老但至今仍频繁发生的漏洞。当合约 A 调用合约 B 转账,B 在 receive 函数中再次调用 A 的 withdraw,而 A 的余额还没扣减,于是同一笔资金被反复提走。
防护手段是 Check-Effects-Interactions 模式与 ReentrancyGuard。在 Binance Smart Chain 上历史多起千万级事件都源于此模式。
二、整数溢出与下溢
0.8 之前的 Solidity 不会自动检查溢出,一笔 uint256 减法可能让余额从 0 变成 2^256-1。SafeMath 是当年标配,0.8 之后默认 checked 算术让多数风险消失,但 unchecked block 仍需谨慎。
三、未初始化变量
合约中未初始化的 storage 指针可能默认指向 slot 0,覆盖关键变量。Slither 等工具能自动检测这类问题,写代码时尽量给所有变量显式初始化。
四、tx.origin 误用
用 tx.origin 做授权判断是经典陷阱。任何合约都可以让用户在不知情下「代为发起」调用,让授权检查失效。授权永远只用 msg.sender。
五、随机数可预测
用 blockhash、block.timestamp 作为随机源,矿工或验证者可以在某种程度上操纵结果。涉及奖励、抽奖、罕见品的合约必须使用 Chainlink VRF 等可信随机数源。
六、价格预言机操纵
直接读取 DEX 现价做清算或借贷决策,攻击者可以闪电贷操纵价格。涉及 USDT、ETH 等主流资产价格的协议必须使用 TWAP 或 Chainlink。
七、签名重放
如果协议接受 ECDSA 签名,必须做好三层防护:nonce 防同合约重放、domainSeparator 防跨合约重放、chainId 防跨链重放。EIP-712 标准把这三件事一站式解决。
八、Front-running 与 MEV
公开 mempool 让攻击者可以看到 pending 交易并抢先执行。涉及 DEX 交易、清算、铸造的协议必须考虑这一层。Commit-reveal、私有 mempool、Flashbots Protect 都是常见对策。
九、Proxy 升级 storage 冲突
升级实现合约时,新版本的 storage 布局必须与旧版本兼容,否则会出现「错位」覆盖。OpenZeppelin upgrades 工具能检测这类问题。
十、治理与权限集中
如果协议的关键参数能被单一 EOA 即时修改,私钥泄露就等于协议归零。Timelock、多签、社区紧急委员会是基本盘。涉及 BTC、ETH 跨链资产的协议尤其要重视治理安全。
结语
这十类漏洞构成入门 checklist。每写一段代码,主动对照一遍——是否触发其中某一类?如果是,是否有充分防护?这种「主动审视」的习惯,会让你在新手阶段就建立起远超平均水平的安全直觉。