83 闪电贷攻击事件分析

这篇文章“75 Uniswap的主要功能及闪电贷原理”中提到了闪电贷及简单的套利应用:同一区块中把多个步骤打包完成,如果不同的池子中有差价,则可以套利。


从流动资金池中获得的一笔快速贷款,在一次交易中使用并偿还

闪电贷是DeFi上一个创新性的发明,它允许你在完全没有抵押物的情况下,在一个区块内完成一笔借款,使用后立马归还。由于所有的操作都是在一个区块内完成,所以不需要抵押物,借款费用也非常低。

闪电贷除了套利之外,更让人熟知的是利用闪电贷进行攻击,尤其是DeFi领域,据 PeckShield「派盾」统计数据显示,2021 年 5 月共计发生 23 起与 DeFi 相关的安全事件,损失金额约 2.8 亿美元,其中,闪电贷攻击约 11 起,在 BSC 币安智能链上发生的与 DeFi 相关的安全事件 15 起,在以太坊链上的 3 起,在 EOS 上的 1 起。

攻击一般有两种:哄抬套利攻击和操纵预言机攻击,都是从价格着手,比如对于去中心化交易AMM,拉高价格。

对于借贷平台,因为它需要有地方提供价格参考,也就是预言机,这个时间操控预言机的价格,来实现攻击。

以下根据币安智能链BSC上首次闪电贷攻击——斯巴达事件分析,来说明攻击的步骤。这是一种哄抬套利攻击的例子。

闪电贷攻击的流程如下:

(1)攻击者首先通过闪电贷从PancakeSwap(币安智能链上最大的去中心化交易平台)借出10000 WBNB,交易及详情如下:

(2)攻击者在出现漏洞的 Spartan兑换池WBNB-SPT1中,分五次将 WBNB兑换成 SPARTAN,从而导致兑换池中产生巨大滑点。

交易及详情如下:

此时攻击者有

2536613.206101067206978364 SPARTA和 11853.332738790033677468 WBNB。

(3)攻击者将这些Token(持有的WBNB与SPARTA)注入WBNB-SPT1交易池中添加流动性,获得LP(流动性)凭证,由于滑点修正机制,获得的LP数量并不是正常值。

(4)进行多次Swap操作,将WBNB兑换成SPARTA,池中WBNB增多,SPARTA减少。

(5)Swap后将持有的WBNB和SPARTA转移给WBNB-SPT1池,进行移除流动性操作。

移除流动性时会通过池中实时的代币数量来计算用户的LP可获得多少对应的代币,由于步骤5,此时会获得比添加流动性时更多的代币。

(6)在移除流动性后会更新流动性池中的baseAmount与tokenAmount,由于移除流动性时没有和添加流动性一样存在滑点修正机制,移除流动性后两种代币的数量和合约记录的代币数量会存在一定差值。在与实际有差值的情况下,攻击者继续添加流动性获得LP,然后攻击者再次移除流动性就获得了对应代币。

(7)最后,攻击者将SPARTA代币兑换回WBNB,获得了更多WBNB。黑客通过以上步骤,以很小的成本获得大量的WBNB,完成闪电贷攻击。

这个攻击事件中,bug在上面的第(6)步,攻击者调用了流动性份额函数 calcLiquidityShare() 查询当前余额,进而操纵余额套利,正确的操作需使用 baseAmountPooled/tokenAmountPooled 状态。

DeFi项目的业务逻辑设计复杂,利用闪电贷这种新型产品进行攻击的DeFi事件在过去的一年里层出不穷。这些安全问题的深层次原因在于,在设计业务逻辑时,未考虑到某些关键性因素,如:弹性供应机制、增发机制、清算机制设计不合理、链上价格及其他信息可被低成本操控等,导致了恶意套利、恶意增发等问题。

这就要求智能合约的代码进行过缜密的审核。一旦智能合约中存在着任何漏洞,它就可能成为黑客攻击的对象。

闪电贷仅仅是 DeFi 世界的一重工具,让用户可以在不拥有大量资金的情况下,用一种巧妙的方式在短时间内获得这种能力。而随着行业的发展,难免不会出现更多类似的工具,产生更多更大的攻击事件。

但其实闪电贷只是一种工具,就看要怎么用。

比特币当前区块高度:741,827

内容整理来源:

你真的懂闪电贷么?

斯巴达陷落—BSC首次闪电贷攻击事件分析

闪电贷其实只是一种工具


翻译、排版:恬儿

内容团队:李卫军寂寞不语杨卫祥穆逸扬

本文主理人:杨卫祥

顾问:Sylvia

统筹:志刚

技术支持:运营组

留下评论