Day 20
DeFi安全基础:常见攻击类型与防范策略
系统学习重入攻击、闪电贷攻击、价格操纵、治理攻击等常见漏洞,掌握安全审计思维
2025-01-29
安全重入攻击闪电贷RektWeek3
Day 20: 安全基础 - 常见攻击类型
本周学习路径
Week 3: Layer2与跨链
├── Day 15: L2原理(Rollup/Optimistic/ZK) ✅
├── Day 16: 主流L2对比 ✅
├── Day 17: 跨链桥原理与风险 ✅
├── Day 18: 预言机 Chainlink ✅
├── Day 19: MEV 三明治攻击 ✅
├── Day 20: 安全基础-攻击类型 ✅ ← 今天
└── Day 21: 多链Portfolio开发核心概念
DeFi 安全的重要性
> 类比理解:传统金融有银行保险、监管机构、法律追索。DeFi 是"代码即法律",一旦合约有漏洞,资金可能在几分钟内被掏空,而且通常无法追回。作为 PM,理解安全风险是设计可靠产品的基础。
DeFi 安全事件统计
═══════════════════════════════════════════════════════════
历史损失规模:
├── 2020年: ~$1.5 亿
├── 2021年: ~$13 亿
├── 2022年: ~$38 亿(含 Terra/FTX)
├── 2023年: ~$17 亿
└── 累计: 超过 $70 亿
主要攻击类型分布:
┌────────────────────────────────────────┐
│ 跨链桥攻击 │ ~45% │
│ 闪电贷攻击 │ ~20% │
│ 重入攻击 │ ~10% │
│ 私钥泄露 │ ~10% │
│ 其他(治理、预言机等)│ ~15% │
└────────────────────────────────────────┘
数据来源: rekt.news, DeFiLlama
═══════════════════════════════════════════════════════════攻击类型详解
1. 重入攻击(Reentrancy)
重入攻击原理
═══════════════════════════════════════════════════════════
经典案例:The DAO 攻击(2016年,损失 $6000万)
漏洞代码示例:
┌─────────────────────────────────────────────────────────┐
│ function withdraw(uint amount) public { │
│ require(balances[msg.sender] >= amount); │
│ │
│ // 危险!先转账,后更新余额 │
│ (bool success, ) = msg.sender.call{value: amount}("");│
│ require(success); │
│ │
│ balances[msg.sender] -= amount; // 太晚了! │
│ } │
└─────────────────────────────────────────────────────────┘
攻击流程:
┌─────────────────────────────────────────────────────────┐
│ 1. 攻击者存入 1 ETH │
│ 2. 攻击者调用 withdraw(1 ETH) │
│ 3. 合约发送 1 ETH 给攻击者合约 │
│ 4. 攻击者合约的 receive() 函数再次调用 withdraw() │
│ ↓ │
│ 5. 由于余额还没更新,检查通过! │
│ 6. 合约又发送 1 ETH │
│ 7. 循环重复,直到合约被掏空 │
└─────────────────────────────────────────────────────────┘
攻击者合约:
┌─────────────────────────────────────────────────────────┐
│ receive() external payable { │
│ if (address(victim).balance >= 1 ether) { │
│ victim.withdraw(1 ether); // 重入! │
│ } │
│ } │
└─────────────────────────────────────────────────────────┘
防范措施:
├── 使用 Checks-Effects-Interactions 模式
├── 使用 ReentrancyGuard(OpenZeppelin)
└── 先更新状态,再进行外部调用
═══════════════════════════════════════════════════════════2. 闪电贷攻击(Flash Loan Attack)
闪电贷攻击原理
═══════════════════════════════════════════════════════════
什么是闪电贷?
├── 无需抵押的贷款
├── 必须在同一笔交易内还款
├── 如果不还款,整个交易回滚
└── 可以借到数亿美元
闪电贷本身不是攻击,但可以放大攻击效果!
经典案例:bZx 攻击(2020年,损失 $35万)
攻击流程:
┌─────────────────────────────────────────────────────────┐
│ 1. 从 dYdX 闪电贷借出 10,000 ETH │
│ │
│ 2. 用 5,500 ETH 在 Compound 抵押,借出 112 WBTC │
│ │
│ 3. 用 1,300 ETH 在 bZx 开 5x 杠杆空 ETH │
│ → bZx 用 Uniswap 作为价格源 │
│ → 大额卖出导致 ETH 价格在 Uniswap 暴跌 │
│ │
│ 4. 用剩余 ETH 在 Uniswap 低价买入 ETH │
│ │
│ 5. 归还闪电贷,保留利润 │
└─────────────────────────────────────────────────────────┘
关键洞察:
├── 闪电贷提供了无成本的巨额资金
├── 可以在一笔交易内操纵市场价格
├── 利用不同协议之间的价格差异
└── 攻击者无需任何本金
防范措施:
├── 使用去中心化预言机(Chainlink)
├── 使用时间加权平均价格(TWAP)
├── 限制单笔交易的价格影响
└── 多源价格验证
═══════════════════════════════════════════════════════════3. 价格操纵攻击(Price Manipulation)
价格操纵攻击原理
═══════════════════════════════════════════════════════════
经典案例:Mango Markets(2022年,损失 $1.14亿)
(Day 18 预言机部分已详细分析)
常见操纵方式:
1. DEX 价格操纵
┌─────────────────────────────────────────────────────────┐
│ • 在流动性差的池子大量买入 │
│ • 价格被人为抬高 │
│ • 利用被操纵的价格在其他协议获利 │
│ • 卖出获利 │
└─────────────────────────────────────────────────────────┘
2. 预言机操纵
┌─────────────────────────────────────────────────────────┐
│ • 如果协议使用单一 DEX 作为价格源 │
│ • 攻击者可以操纵该 DEX 价格 │
│ • 协议读取错误价格,做出错误决策 │
└─────────────────────────────────────────────────────────┘
3. LP Token 价格操纵
┌─────────────────────────────────────────────────────────┐
│ • LP Token 价值 = 池子资产价值 / LP 总量 │
│ • 通过捐赠资产到池子(不铸造LP) │
│ • 抬高 LP Token 价格 │
│ • 用于借贷协议套利 │
└─────────────────────────────────────────────────────────┘
防范措施:
├── 使用 Chainlink 等去中心化预言机
├── 多源价格聚合
├── TWAP 而非瞬时价格
├── 价格偏差检查和熔断机制
└── 限制单笔交易的借贷额度
═══════════════════════════════════════════════════════════4. 治理攻击(Governance Attack)
治理攻击原理
═══════════════════════════════════════════════════════════
经典案例:Beanstalk(2022年,损失 $1.82亿)
攻击流程:
┌─────────────────────────────────────────────────────────┐
│ 1. 攻击者通过闪电贷借入大量治理代币 │
│ │
│ 2. 用借来的代币进行投票 │
│ → 提案内容:将协议资金转给攻击者 │
│ │
│ 3. 由于代币数量足够,提案立即通过 │
│ │
│ 4. 执行提案,资金被转出 │
│ │
│ 5. 归还闪电贷的代币 │
└─────────────────────────────────────────────────────────┘
问题根源:
├── 无时间锁(Timelock)
├── 投票期过短
├── 可以用闪电贷借代币投票
└── 无法律/社区制约
防范措施:
├── 强制时间锁(24-48小时延迟执行)
├── 投票快照(在提案前持有才能投票)
├── 最低持有时间要求
├── 多签 + 社区监督
└── 紧急暂停机制
═══════════════════════════════════════════════════════════5. 私钥泄露 / 内部作恶
私钥相关风险
═══════════════════════════════════════════════════════════
经典案例:
├── Ronin Bridge(2022年,$6.25亿)- 私钥被盗
├── Harmony Bridge(2022年,$1亿)- 多签私钥被盗
└── 多个 Rug Pull 项目 - 团队跑路
常见场景:
1. 私钥被黑客窃取
┌─────────────────────────────────────────────────────────┐
│ • 钓鱼攻击获取助记词 │
│ • 恶意软件/键盘记录器 │
│ • 服务器入侵 │
└─────────────────────────────────────────────────────────┘
2. 内部人员作恶
┌─────────────────────────────────────────────────────────┐
│ • 团队成员携款跑路(Rug Pull) │
│ • 滥用管理员权限 │
│ • 后门函数 │
└─────────────────────────────────────────────────────────┘
3. 多签配置不当
┌─────────────────────────────────────────────────────────┐
│ • 2/3 多签,但 2 个私钥在同一台服务器 │
│ • 多签持有者身份不透明 │
│ • 单点故障 │
└─────────────────────────────────────────────────────────┘
防范措施(协议层面):
├── 真正的去中心化多签(地理/组织分散)
├── 时间锁限制管理员操作
├── 硬件钱包存储私钥
├── 透明的多签持有者身份
└── 定期安全审计
═══════════════════════════════════════════════════════════攻击类型速查表
DeFi 攻击类型总览
═══════════════════════════════════════════════════════════
│ 攻击类型 │ 核心原因 │ 防范措施 │
├───────────────────────────────────────────────────────────┤
│ 重入攻击 │ 先转账后更新状态 │ CEI模式/重入锁 │
│ 闪电贷攻击 │ 价格源不安全 │ 去中心化预言机/TWAP │
│ 价格操纵 │ 依赖低流动性价格 │ 多源聚合/偏差检查 │
│ 治理攻击 │ 无时间锁/快照 │ 时间锁/投票快照 │
│ 私钥泄露 │ 安全管理不当 │ 多签/硬件钱包 │
│ 预言机故障 │ 单点依赖 │ 备用预言机/熔断 │
│ 跨链桥攻击 │ 验证不充分 │ 多重验证/限额 │
│ 整数溢出 │ 未检查算术 │ SafeMath/Solidity 0.8+│
└───────────────────────────────────────────────────────────┘
═══════════════════════════════════════════════════════════链上实操:阅读 Rekt 事后分析
任务:分析一个真实攻击案例
Rekt News 阅读指南
═══════════════════════════════════════════════════════════
访问:https://rekt.news/
推荐阅读案例:
1. Ronin Bridge - rekt
└── 最大的跨链桥攻击,了解私钥安全
2. Beanstalk - rekt
└── 经典治理攻击,理解 DAO 安全
3. Euler Finance - rekt
└── 复杂的闪电贷攻击,技术性强
4. Mango Markets - rekt
└── 预言机操纵,Day 18 相关
阅读时关注:
├── 攻击者如何发现漏洞?
├── 攻击的具体步骤是什么?
├── 损失金额和影响范围?
├── 协议方如何响应?
├── 有哪些可以借鉴的教训?
└── 作为 PM,如何避免类似问题?
═══════════════════════════════════════════════════════════Rekt 排行榜 Top 10(截至2024)
历史最大 DeFi 攻击
═══════════════════════════════════════════════════════════
│ 排名 │ 项目 │ 损失 │ 攻击类型 │
├───────────────────────────────────────────────────────────┤
│ 1 │ Ronin Network │ $624M │ 私钥泄露 │
│ 2 │ Poly Network │ $611M │ 跨链桥漏洞 │
│ 3 │ BNB Bridge │ $586M │ 跨链桥漏洞 │
│ 4 │ Wormhole │ $326M │ 验证绕过 │
│ 5 │ Nomad Bridge │ $190M │ 验证漏洞 │
│ 6 │ Beanstalk │ $182M │ 治理攻击 │
│ 7 │ Wintermute │ $160M │ 私钥泄露 │
│ 8 │ Mango Markets │ $114M │ 价格操纵 │
│ 9 │ Harmony Bridge │ $100M │ 私钥泄露 │
│ 10 │ Mirror Protocol │ $90M │ 预言机故障 │
└───────────────────────────────────────────────────────────┘
观察:
├── 跨链桥是最大的攻击目标
├── 私钥管理是核心安全问题
└── 治理和预言机是常见薄弱环节
═══════════════════════════════════════════════════════════产品经理的安全思维
安全设计清单
PM 安全检查清单
═══════════════════════════════════════════════════════════
功能设计阶段:
□ 是否需要外部价格数据?→ 使用可靠预言机
□ 是否有管理员权限?→ 最小化 + 时间锁
□ 是否涉及跨链?→ 评估桥的安全性
□ 是否有治理功能?→ 时间锁 + 投票快照
上线前检查:
□ 是否完成至少一次审计?
□ 是否有 Bug Bounty 计划?
□ 是否有紧急暂停机制?
□ 是否有事件响应预案?
用户体验考虑:
□ 如何向用户传达安全风险?
□ 是否显示审计状态?
□ 出事后如何通知用户?
□ 是否有保险选项?
═══════════════════════════════════════════════════════════事件响应流程
安全事件响应(PM 视角)
═══════════════════════════════════════════════════════════
1. 发现(Detection)
└── 监控异常交易、社区报告
2. 遏制(Containment)
├── 触发紧急暂停(如有)
└── 通知用户停止交互
3. 分析(Analysis)
├── 确定攻击向量
└── 评估损失范围
4. 沟通(Communication)
├── 发布官方声明
├── 更新社交媒体
└── 与安全研究者合作
5. 恢复(Recovery)
├── 修复漏洞
├── 制定赔偿方案
└── 重新部署
6. 复盘(Post-mortem)
├── 发布详细报告
└── 改进安全措施
═══════════════════════════════════════════════════════════今日思考
安全 vs 用户体验的权衡
1. 时间锁的困境
- 更长的时间锁 = 更安全
- 但也意味着更慢的响应速度
- 紧急情况下可能来不及反应
2. 权限最小化
- 去掉所有管理员权限 = 最安全?
- 但出问题时无法修复
- 需要找到平衡点
3. 用户教育
- 如何让用户理解风险而不是吓跑他们?
- 审计报告要不要放在显眼位置?
面试题准备
问题:作为 PM,如何确保 DeFi 产品的安全性?
30秒版本:
═══════════════════════════════════════════════════════════
DeFi 安全需要全流程关注:设计阶段要最小化权限、使用可靠
预言机、避免已知漏洞模式;上线前必须完成专业审计和设置
Bug Bounty;运营期间需要实时监控和准备事件响应预案。
作为 PM,还要考虑如何向用户透明传达风险,并在安全和用户
体验之间找到平衡。
═══════════════════════════════════════════════════════════
2分钟版本:
═══════════════════════════════════════════════════════════
DeFi 安全是产品成败的关键。历史上超过 70 亿美元因安全事件
损失,一次重大攻击可能导致项目直接死亡。
作为 PM 的安全职责:
1. 设计阶段(Prevention)
- 了解常见攻击类型:重入、闪电贷、价格操纵、治理攻击
- 设计时避免:使用 Chainlink 而非 DEX 价格、管理员权限
最小化、必须有时间锁、治理需要投票快照
2. 开发阶段(Verification)
- 推动至少一次专业审计(Trail of Bits、OpenZeppelin等)
- 设置 Bug Bounty 计划(Immunefi)
- 要求代码开源,接受社区审查
3. 运营阶段(Monitoring)
- 部署实时监控系统
- 准备事件响应预案
- 建立紧急联系机制
4. 用户沟通(Transparency)
- 显示审计状态和报告链接
- 清晰传达风险提示
- 出事后第一时间透明沟通
5. 权衡决策
- 安全措施可能影响用户体验(如时间锁导致慢)
- 需要根据 TVL、用户规模评估风险等级
- 高风险功能可以分阶段开放
最重要的是:安全不是一次性的,而是持续的过程。
═══════════════════════════════════════════════════════════学习资源
| 资源 | 链接 | 说明 |
|---|---|---|
| Rekt News | rekt.news | 最权威的攻击事件复盘 |
| Immunefi | immunefi.com | Bug Bounty 平台 |
| SWC Registry | swcregistry.io | 智能合约漏洞分类 |
| OpenZeppelin | docs.openzeppelin.com | 安全合约库 |
| Slowmist | slowmist.com | 安全审计和研究 |
| DeFiLlama Hacks | defillama.com/hacks | 攻击事件数据库 |
明日预告
Day 21: 多链 Portfolio 开发
├── 复习本周内容
├── 在项目中实现多链资产展示
├── 集成多条 L2 网络
└── Week 3 总结 + 代码提交