“我写了个流动性挖矿的合约,大家可以 stake 和领取奖励。”
—— 然后攻击者用一个多账户脚本,五分钟把奖励池清空。
在链上项目中,经济逻辑的漏洞往往比技术 bug 更致命。
你写的是 stake / 分红 / vote / 战斗奖励,
黑客看到的是:
“可以无限 mint?”、“奖励没 cooldown?”、“提案逻辑可打包调用?”…
本章将聚焦:
类型 | 风险场景 | 案例解析 |
---|---|---|
DeFi | 流动性挖矿 / 借贷 / 套利 | SushiSwap / Harvest / Cream |
DAO | 提案注入 / 治理权篡改 | Beanstalk / Compound |
GameFi | 奖励重复领取 / NFT 滥发 / 防 bot | Axie Infinity / StepN |
function claim() public {
uint reward = computeReward(msg.sender);
token.transfer(msg.sender, reward);
claimed[msg.sender] = block.timestamp;
}
⚠️ 问题:
computeReward() 不受时间限制
多账户 claim,甚至合约 claim,rewardPool 被反复消耗
可提前 claim、无上限
✅ 安全设计:
添加 cooldown
添加最大 claim 限制
添加 isContract(msg.sender)
检查防 bot(注意可被绕过)
Compound 早期模型中,借贷利率波动剧烈
攻击者通过短时大额操作,拉高利率
清算其他借款人或套利闪电贷
✅ 安全设计:
引入平滑利率曲线 + 速率限制
清算奖励设置上限
使用 TWAP 替代实时利率估值
调用 deposit()
时触发奖励计算与发放
可通过构造钓鱼合约在回调中再次调用 deposit → 多倍 reward
✅ 防御设计:
分离计算与发放逻辑
使用 CEI 模式 / ReentrancyGuard
奖励使用 pull
模式发放
攻击者创建提案合约,内部包含:
function executeProposal() external {
bean.transfer(attacker, allFunds);
}
再用 flashloan 借票,通过治理提案 → 执行该合约 → 所有资金归 attacker
损失:$182M+
部署恶意合约
构造提案指向恶意合约的 call
flashloan 借出大量 token → 获取投票权
快速提案 + 快速投票 + 执行(没有 Timelock)
合约资金全部转出
防御方式 | 描述 |
---|---|
引入 Timelock | 所有提案执行需延迟 2-24 小时以上 |
Snapshot 机制 | 提案创建时锁定投票权,防 flashloan |
治理限制操作范围 | 限制 call 的合约类型和函数选择 |
多签治理 + 审批流程 | 高风险函数需额外签名确认 |
提案中使用代理合约 call
由于逻辑合约升级与存储错位,导致提案可在执行中再次触发自身
出现“治理递归死锁”问题
✅ 教训:
Proxy 合约需验证 msg.sender == proxy
所有治理合约需限定 delegatecall 目标 & 嵌套调用逻辑
mapping(address => uint) public lastClaim;
function claimReward() external {
require(block.timestamp > lastClaim[msg.sender] + 1 days);
gameToken.mint(msg.sender, 100 * 1e18);
lastClaim[msg.sender] = block.timestamp;
}
⚠️ 攻击者通过多个合约地址反复 claim:
一人十合约,每日领取上限 ×10
甚至脚本自动 claim(bot farm)
策略 | 描述 |
---|---|
合约限制 | require(!isContract(msg.sender)) (可被绕过) |
签名授权(claim) | 由服务器/前端发起限量签名 → 合约验证 |
KYC / NFT Gate | 使用链上 NFT / whitelist 作为资格标识 |
claim 策略分级 | 限速、冷却、抽奖等机制混合使用 |
NFT 铸造合约未限制总量 or 未记录 mint history
攻击者直接通过脚本循环 mint → 导致稀缺性崩塌
使用 maxSupply
全局总量控制
添加用户级 hasMinted
标志位
Mint 前校验持有 token / NFT
引入 Merkle Tree whitelist 进行权限分发
项目类型 | 检查点 |
---|---|
DeFi | 奖励计算是否固定/线性?是否支持提前/多次领取? |
DeFi | 流动性变动是否影响奖励分配?是否支持低成本套利? |
DAO | 提案逻辑是否隔离?提案执行是否有延迟? |
DAO | 是否支持 flashloan 投票?是否记录 snapshot? |
GameFi | mint/claim 是否可重复?是否可被 bot 脚本滥用? |
GameFi | 是否使用 Merkle / 签名限制资格? |
你可以构建一个复现仓库:
/defi-dao-gamefi-attacks
├─ contracts/
│ ├─ BuggyReward.sol # 流动性奖励漏洞
│ ├─ FlashloanGovernance.sol # 提案注入攻击
│ ├─ NFTInfiniteMint.sol # GameFi 奖励复现
├─ test/
│ └─ attack-reproduce.t.sol
合约业务逻辑的漏洞远比技术漏洞更隐蔽
DeFi 要保护资金池 / DAO 要防治理劫持 / GameFi 要控 bot 滥用
所有“链上经济行为”都需要“链上防护机制”对冲
审计者要思考“攻击者是否能不走正门拿到奖励?”
编写一个完整的 DApp 项目(合约 × 前端 × 后端)
包含部署、授权、交互、奖励发放、安全验证
教你如何写一份“可交付、可维护、可扩展”的链上应用
想看「DAO 提案注入攻击复现完整代码 + 防御修复对比」?
想补一个《链上经济攻击路径图谱》的 PDF?评论区告诉我就安排!
下一章,我们从安全走向综合项目能力输出,全链路实战
你说写,我就写!