@@ -15,6 +15,108 @@ web3初学者,做过一些学习项目,涉及defi,zkp,web3+ai,希望
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-14
19+
20+ # Web3 审计课程总结:重要漏洞发现
21+
22+ 以下是对Web3审计课程中讨论的三个关键漏洞(Incorrect Fee Structure、DoS Dividends、Swap Margin)的总结,基于讲者的思路,梳理问题本质、攻击路径、影响及解决方案。全程用中文,确保清晰易懂。
23+
24+ ## 1. Incorrect Fee Structure(不正确的费用结构)
25+
26+ ### 问题描述
27+
28+ 在Key Finance协议中,奖励复合(reward compounding)机制存在漏洞,允许攻击者通过三明治攻击(sandwich attack)窃取质押奖励。核心问题是:
29+
30+ - ** 无费用或锁定期** :质押和取消质押无需成本或时间限制。
31+ - ** 奖励分配基于瞬时快照** :奖励通过` updateAllRewards ` 函数更新,分配按调用时的质押比例计算,不考虑质押时间。
32+
33+ ### 攻击路径
34+
35+ 攻击者(如Bob)监控mempool,在奖励更新前一刻质押大额资金(例如10000 GMX Key),获取奖励后立即取消质押并卖出。例如:
36+
37+ - Alice质押100(持续一周),Bob质押10000(仅1秒)。
38+ - 总质押10100,产生1%利润(101单位奖励)。
39+ - Alice得:101 \* (100/10100) ≈ 1单位;Bob得:101 \* (10000/10100) ≈ 100单位。
40+
41+ Bob贡献极少(仅1秒),却拿走99%奖励,严重稀释长期质押者(如Alice)的收益。
42+
43+ ### 影响
44+
45+ - ** 奖励稀释** :长期质押者的收益被短期投机者抢夺,破坏激励机制。
46+ - ** 无风险套利** :攻击者无需承担资产价格风险,成本极低。
47+ - ** 协议吸引力下降** :用户因收益低而失去质押动力,可能导致流动性不足。
48+
49+ ### 解决方案
50+
51+ - ** 锁定期** :要求质押持续一定时间(如7天)。
52+ - ** 收取费用** :对质押/取消质押加费用,增加攻击成本。
53+ - ** 时间加权奖励** :奖励按质押时间\* 金额分配,类似“points per share”模型。
54+ - ** 平滑奖励更新** :奖励随时间累积(如GMX的P&L计算),避免阶梯式更新。
55+
56+ ## 2. DoS Dividends(分红机制的DoS攻击)
57+
58+ ### 问题描述
59+
60+ 协议的` distributeDividends ` 函数使用无界for循环遍历` users ` 数组,为每个用户分配分红。攻击者可通过创建大量地址(每个mint 1 wei)无限膨胀` users ` 数组,导致分红函数gas超限,交易失败。
61+
62+ ### 攻击路径
63+
64+ - ** 添加用户** :` mint ` 函数在余额为0时将地址push到` users ` 数组。
65+ - ** 膨胀数组** :攻击者创建数千地址,分别mint 1 wei,使数组巨大。
66+ - ** 触发DoS** :调用` distributeDividends ` 时,循环遍历所有用户,耗尽block gas limit。
67+
68+ ### 影响
69+
70+ - ** 协议瘫痪** :分红无法分发,影响正常用户。
71+ - ** 用户信任下降** :协议功能受阻,可能导致用户流失。
72+
73+ ### 解决方案
74+
75+ - ** Points per Share模型** :不逐个计算用户分红,用全局` dividendPerToken ` 记录每token分红。
76+ - 计算公式:` dividendPerToken = totalDividends / totalSupply ` 。
77+ - 用户领取:` balance * (currentDividendPerToken - userLastDividendPerToken) ` 。
78+ - ** 优势** :只需更新单一存储变量,适用于所有持有者,避免循环。
79+
80+ ## 3. Swap Margin(交换保证金操纵AMM)
81+
82+ ### 问题描述
83+
84+ 在IVX期权协议中,` swapMargin ` 函数允许用户在portfolio中将保证金(如USDC)换成另一支持token(如DAI),但未验证交换后position是否可清算(liquidatable)。攻击者可通过Uniswap交换,指定极低amountOut并三明治自己,抽取portfolio几乎所有价值。
85+
86+ ### 攻击路径
87+
88+ - 用户卖期权给AMM,收取premium。
89+ - 调用` swapMargin ` ,在Uniswap交换保证金,指定amountOut=0,前跑/后跑自己,抽取价值。
90+ - 重复操作,提取99%保证金,留下破产position,协议清算时承担损失。
91+
92+ ### 影响
93+
94+ - ** 资金流失** :攻击者拿走保证金+premium,协议损失资金。
95+ - ** 不公平机制** :攻击者在亏损时撤回保证金,盈利时正常关闭,形同“无风险”操作。
96+ - ** 协议风险** :清算破产position导致流动性池受损。
97+
98+ ### 解决方案
99+
100+ - ** 后置验证** :交换后检查position是否可清算,若是则revert。
101+ - ** 限制amountOut** :确保交换输出足够维持position健康。
102+ - ** 类比perpetuals** :类似GMX,需确保用户不能主动使position破产。
103+
104+ ## 总结
105+
106+ 这三个漏洞反映了DeFi协议设计中的常见问题:
107+
108+ - ** Incorrect Fee Structure** :缺少费用或锁定期,导致奖励分配不公。
109+ - ** DoS Dividends** :无界循环使协议易受gas攻击。
110+ - ** Swap Margin** :缺少后置验证,允许用户操纵保证金提取。
111+
112+ 审计时需关注:
113+
114+ - 奖励机制是否考虑时间权重。
115+ - 循环是否可被膨胀。
116+ - 用户操作是否可能导致协议损失。
117+
118+ 通过引入锁定期、费用、时间加权模型、单一存储变量或后置验证,可有效防范这些漏洞。
119+
18120# 2025-08-13
19121
20122# Web3 升级模式与 Eternal Storage 学习笔记
0 commit comments