返回知识库
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 Newsrekt.news最权威的攻击事件复盘
Immunefiimmunefi.comBug Bounty 平台
SWC Registryswcregistry.io智能合约漏洞分类
OpenZeppelindocs.openzeppelin.com安全合约库
Slowmistslowmist.com安全审计和研究
DeFiLlama Hacksdefillama.com/hacks攻击事件数据库

明日预告

Day 21: 多链 Portfolio 开发
├── 复习本周内容
├── 在项目中实现多链资产展示
├── 集成多条 L2 网络
└── Week 3 总结 + 代码提交