DeFi 挖矿:Balancer遭闪电贷攻击与金融模型漏洞

Balancer: 闪电贷+恒定积损失50万美金

2020年6月29日,Balancer遭受闪电贷攻击,Balancer是使用恒定积进行的AMM市场,池子中的Assets在遵守恒定积的前提下可按池子当时的利率进行交换,本次闪电贷攻击利用了该原理,将一种Asset掏空后,用另一种Assets以很低的价格获取,由此获利接近50万美金。


攻击hash:0x013be97768b702fe8eccef1a40544d5ecb3c1961ad5f87fee4d16fdc08c78106

DeFi 挖矿:Balancer遭闪电贷攻击与金融模型漏洞

攻击步骤:

1. 攻击者去dYdX借贷104k WETH;

2. 攻击者在Balancer的WETH-STA池子里将步骤1得来的WETH不断地换成STA代币,21次之后,池子中的STA被掏空,只剩下1weiSTA(由于通缩模型,至少会剩余1weiSTA在池子里);

3. 攻击者按照恒定积公式,使用1weiSTA不断地获取池子中的WETH,价格分别为1weiSTA:30,347WETH,1weiSTA:15,173WETH等等,进行18次兑换之后,WETH几乎被兑空;

4. 同理,攻击者也将WBTC-STA,SNX-STA,LINK-STA池子进行了同样的操作;

5. 攻击者去dYdX退回104k WETH;

6. 攻击者将获取的少量STA(<50weiSTA)放入Balancer池子里添加流动性,由于池子里目前STA数量很少,仅有1weiSTA,因此攻击者此时获取了很高的LP share,这些share可以获取池子的代币奖励,共计获取了136k STA;

7. 攻击者将136k STA 兑换成了109 WETH,由此完成整个攻击过程。


攻击完毕之后,攻击者将得到的币转入0xbf675c80540111a310b06e1482f9127ef4e7469a,该地址的所有操作都由Tornado进行,因为已无法追溯。


攻击者共计得到下列战利品:

  • 455 WETH ($100k worth)
  • 2.4m STA ($100k worth) and converted it to 109 WETH ($25k worth)
  • 11.36 WBTC ($100k worth)
  • 60.9k SNX ($100k worth)
  • 22.6k LINK ($100k worth)
DeFi 挖矿:Balancer遭闪电贷攻击与金融模型漏洞

Balancer: Compound金融模型漏洞


2020年6月29日,攻击者从dYdX闪电贷中借到代币并铸币后,通过uniswap闪贷获得cWBTC和cBAT代币,然后将借得的代币在Balancer代币池中大量交易,从而触发Compound协议的空投机制,获得空投的COMP代币,再使用Balancer有漏洞的gulp()函数更新代币池数量后,取走所有代币并归还闪电贷。攻击者相当于利用了Compound协议的金融模型、闪电贷和Balancer代码漏洞,无中生有了COMP,总获利约为11.5ETH。

攻击hash1:0x70959fef9d7cc4643a0e885f66ec21732e9243ffd3773e4a9ea9b5ab669bab4d

DeFi 挖矿:Balancer遭闪电贷攻击与金融模型漏洞

攻击过程:

1. 从dYdX处通过闪电贷形式借得WETH、DAI和USDC三种代币,数额分别是103067.20640667767WETH、5410318.972365872DAI和5737595.813492USDC。

2. 使用步骤1中得到的代币,在Compound中借贷cETH、cDAI和cUSDC,也就是对三种代币 (cETH、cDAI和cUSDC) 进行铸币操作 (mint),量为5,150,226.00337039cETH,264,123,046.64278978cDAI,272,429,456.68851376cUSDC。

3. 从Compound处通过闪电贷借得WBTC、BAT,数额分别是1380WBTC、49000000BAT,

4. 使用步骤3中得到的代币,在Compound中借贷cWBTC、cBAT,也就是铸造 (mint) cWBTC,cBAT代币。量为68,474.79460157cWBTC,2,407,985,254.35853495cBAT。

5. 携带获得的cWBTC与cBAT加入Balancer的代币池,此时攻击者拥有的cWBTC和cBAT的数目分别为4955.85562685cWBTC和55144155.96523628cBAT。

6. 分别用cWBTC和cBAT在Balancer的该代币池中进行大量的交易,从而触发COMP空投(Airdrop)操作,将这些空投的COMP分发到Balancer该代币池中。

7. 调用gulp()函数将当前的COMP数目同步到Balancer智能合约中,并将cWBTC、cBAT以及额外被加入代币池中的COMP取出。退出代币池时,攻击者拥有的cWBTC和cBAT的数目同样为4955.85562685和55144155.96523628。但是由于在代币池中通过大量交易产生的额外COMP代币。此处攻击者还可以选择直接进入其他代币池中,复用步骤1到步骤6的攻击方法,获得额外COMP代币。

8. 偿还Compound和dYdX的闪电贷,离场。

9. 攻击者仍旧可以采用同样的方法(步骤1到步骤7),对其他代币池发动攻击。攻击的机制类似,但是通过闪电贷借得和用来进行攻击的代币种类略有不同。


最终攻击者将得到的1.413164269999604596COMP放到Uniswap交易为1.466344591877333617ETH离场。


同样的攻击hash2:0xa519835c366bc77d93c9d3e433e653bfc46120688ad146b383f4dd93342cad29

DeFi 挖矿:Balancer遭闪电贷攻击与金融模型漏洞

上一篇:HDFS的Block数据balancer重分布实战


下一篇:负载均衡的原理