3、经典案例:bZx攻击(2020年2月):攻击流程详解、漏洞分析(Uniswap + Kyber 价格差异)、教训与反思
3.1 背景:DeFi 世界的第一次“核爆”
2020年2月,bZx 协议被攻击。这是 DeFi 历史上第一次大规模闪电贷攻击。
说实话,当时整个圈子都懵了。大家第一次意识到:原来不用本金,也能撬动百万美元级别的攻击。
bZx 是一个去中心化保证金交易平台。用户可以通过它做多或做空资产。攻击者利用了 Uniswap 和 Kyber 之间的价格差异,配合闪电贷,完成了一次教科书级的套利攻击。
核心数据:
- 攻击获利:约 35 万美元(当时价值)
- 攻击成本:几乎为零(仅支付 Gas 费)
- 影响范围:bZx 协议暂停,用户资金被冻结数日
3.2 攻击流程详解:四步走
我当年复盘这个案例时,画了一张流程图。现在我把核心逻辑拆解给你看。
嗯,这张图应该能帮你理清脉络。下面我详细拆解每一步。
第一步:借入闪电贷
攻击者从 dYdX 闪电贷借出 10,000 ETH。注意,这里没有抵押物,全靠“借了马上还”的机制。
第二步:在 bZx 做空
攻击者将 5,500 ETH 存入 bZx 作为抵押,然后做空 1 WBTC。bZx 的做空机制是:协议从 Kyber 借入 WBTC 并卖出,获得 ETH。
这里有个细节:bZx 当时使用的是 Kyber 的价格作为参考。但攻击者知道,Kyber 的价格是聚合的,不容易被单笔交易影响。
第三步:操纵 Uniswap 价格
攻击者将剩余的 4,500 ETH 在 Uniswap 上大量卖出,换取 WBTC。这一操作直接把 Uniswap 的 WBTC/ETH 价格打了下来。
说白了,就是让 Uniswap 上的 WBTC 变得“便宜”了。
第四步:套利平仓
攻击者回到 bZx,用低价从 Uniswap 买来的 WBTC 平仓。bZx 按照 Kyber 的高价结算,攻击者赚取了差价。
最后,攻击者归还闪电贷,净赚约 35 万美元。
我的经验: 这个攻击最精妙的地方在于,攻击者没有用自己的钱。所有资金都是借来的,攻击完成后全部归还。这就是闪电贷的威力——也是它的危险所在。
3.3 漏洞分析:Uniswap + Kyber 价格差异
为什么这个攻击能成功?核心原因只有一个:价格预言机被操纵了。
bZx 在做空时,使用了 Kyber 的价格作为参考。但攻击者通过 Uniswap 操纵了 WBTC 的市场价格。两个价格出现了巨大偏差:
| 价格来源 | WBTC/ETH 价格 | 说明 |
|---|---|---|
| Uniswap(被操纵后) | 约 1 WBTC = 4,500 ETH | 攻击者大量卖出 ETH 压低价格 |
| Kyber(正常) | 约 1 WBTC = 5,500 ETH | 聚合价格,未被影响 |
| 差价 | 约 1,000 ETH | 攻击者赚取的就是这个差价 |
你想想看,bZx 在做空时,从 Kyber 借入 WBTC 并卖出,获得了 5,500 ETH。但攻击者平仓时,只需要从 Uniswap 花 4,500 ETH 就能买回 1 WBTC。一来一回,净赚 1,000 ETH。
注意: 这不是 Kyber 或 Uniswap 的漏洞。这是 bZx 协议设计的问题——它不应该依赖单一价格来源,尤其是在做空这种高杠杆场景下。
3.4 教训与反思
这个案例给我最大的触动是:DeFi 协议的安全,不能只靠“看起来没问题”。
bZx 的代码在攻击前已经经过审计。但审计公司没有发现这个价格操纵的风险。为什么?因为审计师通常只检查代码逻辑,不测试“组合攻击”场景。
我总结了几条核心教训:
- 价格预言机必须去中心化: 使用单一价格来源(哪怕是聚合器)在高杠杆场景下是危险的。建议使用 TWAP(时间加权平均价格)或 Chainlink 等去中心化预言机。
- 闪电贷是双刃剑: 闪电贷本身不是漏洞,但它放大了价格操纵的风险。协议必须假设攻击者可以借到无限资金。
- 组合攻击测试不可少: 我建议在审计时,专门测试“如果攻击者同时操作多个协议,会发生什么”。
- 暂停机制很重要: bZx 在攻击发生后及时暂停了协议,避免了更大损失。这是他们做得对的地方。
避坑指南: 我曾经审计过一个类似的项目,他们用了 Uniswap 的即时价格作为清算依据。我直接告诉他们:如果攻击者用闪电贷操纵价格,你的清算机制会变成提款机。后来他们改用了 Chainlink 的喂价。
3.5 后续影响
bZx 攻击之后,整个 DeFi 行业开始重视闪电贷攻击。很多协议都加上了“闪电贷保护”机制。
但说实话,这只是一个开始。2020 年 2 月之后,闪电贷攻击变得越来越频繁,手法也越来越复杂。
嗯,这个案例告诉我们:在 DeFi 世界里,没有“绝对安全”。只有不断学习、不断改进,才能跟上攻击者的步伐。
我的建议: 如果你在开发 DeFi 协议,一定要把“闪电贷攻击”作为默认威胁模型。假设攻击者可以借到无限资金,然后问自己:我的协议还能撑住吗?