成都链安:DeFi项目Yearn Finance闪电贷攻击事件分析

北京时间2021年2月5日,【链必安-区块链安全态势感知平台(Beosin-OSINT)】舆情监测到,DeFi知名项目Yearn Finance发生闪电贷攻击事件。

<figure data-size="normal" style="margin: 0px 0px 1.4em; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic2.zhimg.com/80/v2-03960639cca2d3c6974316bd18594ab1_720w.jpg" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="463" class="origin_image zh-lightbox-thumb lazy" width="640" data-original="https://pic2.zhimg.com/v2-03960639cca2d3c6974316bd18594ab1_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-03960639cca2d3c6974316bd18594ab1_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

一、事件概览

北京时间2021年2月5日,【链必安-区块链安全态势感知平台(Beosin-OSINT)】舆情监测到,DeFi知名项目Yearn Finance发生闪电贷攻击事件。

简言之,本次攻击事件的具体手法为攻击者利用闪电贷借取巨额资金,而后进行循环套利。根据成都链安(Beosin)安全团队的响应和分析,本次攻击事件的合约为yValut+Curve Pool。

二、事件分析

1.攻击者在yVault合约中存入DAI,并调用earn触发yValut向流动性池使用DAI添加流动性,如下图所示:

<figure data-size="normal" style="margin: 1.4em 0px; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic1.zhimg.com/80/v2-c90ae820ceff570f0e9c928bb015ce84_720w.jpg" data-caption="" data-size="normal" data-rawwidth="991" data-rawheight="400" class="origin_image zh-lightbox-thumb lazy" width="991" data-original="https://pic1.zhimg.com/v2-c90ae820ceff570f0e9c928bb015ce84_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-c90ae820ceff570f0e9c928bb015ce84_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

上图红框显示,在进行铸币时,需要读取合约中的DAI余量,但因为策略合约中的DAI已经抵押至curve合约进行盈利,所以要计算DAI代币的量,只能通过价值换算,计算出所持有的Curve代币能够兑换的DAI的量。

2.攻击者利用借来的资金向流动性池使用USDT添加流动性,获得Curve代币,如下图所示:

<figure data-size="normal" style="margin: 1.4em 0px; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic3.zhimg.com/80/v2-856c81ba75bfe9179f429f19fe4a1706_720w.jpg" data-caption="" data-size="normal" data-rawwidth="1192" data-rawheight="182" class="origin_image zh-lightbox-thumb lazy" width="1192" data-original="https://pic3.zhimg.com/v2-856c81ba75bfe9179f429f19fe4a1706_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-856c81ba75bfe9179f429f19fe4a1706_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

这里值得注意的是,攻击者向池中注入的是单一的USDT,因为池子的特性,我们知道,当一种代币的含量上升,其相对价格也就下降。

3.攻击者取出yValut合约中存入的DAI,如下图所示:

<figure data-size="normal" style="margin: 1.4em 0px; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic3.zhimg.com/80/v2-5884c4a03e29011c05ab9ef4ca6038da_720w.jpg" data-caption="" data-size="normal" data-rawwidth="933" data-rawheight="261" class="origin_image zh-lightbox-thumb lazy" width="933" data-original="https://pic3.zhimg.com/v2-5884c4a03e29011c05ab9ef4ca6038da_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-5884c4a03e29011c05ab9ef4ca6038da_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

根据#2可知,此时的池子中因为USDT的含量增加,所以DAI的相对价格是上升的,这也就导致攻击者所持有的Curve代币兑换出的DAI相对下降,池子中将会余留少量DAI。

4.攻击者指定与添加流动性时相等的USDT数量,进行流动性移除,注意这里因为#3时将一部分DAI取走,所以USDT的相对#2时价格下降,所以这里将余下一部分Curve代币.

<figure data-size="normal" style="margin: 1.4em 0px; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic2.zhimg.com/80/v2-e965560aa7b94b6cf25c1e996a617321_720w.jpg" data-caption="" data-size="normal" data-rawwidth="1053" data-rawheight="146" class="origin_image zh-lightbox-thumb lazy" width="1053" data-original="https://pic2.zhimg.com/v2-e965560aa7b94b6cf25c1e996a617321_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-e965560aa7b94b6cf25c1e996a617321_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

不断进行上述循环,这使得攻击者消耗DAI进而获取Curve代币。

经过多次循环之后,攻击者套取了大量的Curve代币,而将DAI代币打入了Curve合约中。在整个攻击流程结束时,攻击者使用Curve代币,兑换出DAI/USDC。

这次兑换,因为不是USDT的兑换,即使此时的DAI相对攻击前含量较高,也会按照同等比例进行兑换,也就是攻击者打入Curve池子中多出的DAI代币,也会分发给攻击者。

这里,我们再来看攻击者在进行攻击时的第一步操作,如下图所示:

<figure data-size="normal" style="margin: 1.4em 0px; color: rgb(18, 18, 18); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="https://pic4.zhimg.com/80/v2-0229c7ab30aed37a4adc210db96c1a7b_720w.jpg" data-caption="" data-size="normal" data-rawwidth="1150" data-rawheight="150" class="origin_image zh-lightbox-thumb lazy" width="1150" data-original="https://pic4.zhimg.com/v2-0229c7ab30aed37a4adc210db96c1a7b_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-0229c7ab30aed37a4adc210db96c1a7b_b.jpg" data-lazy-status="ok" style="display: block; max-width: 100%; margin: 0px auto; cursor: zoom-in; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;"/></figure>

攻击者利用闪电贷向池子中添加了巨量的流动性,这就导致这些多出的DAI,最终将会大部分分给攻击者。

而除去这一部分损失,攻击者还获得了更多的Curve代币,从而获利。

三、安全建议

针对本次事件,成都链安(Beosin)安全团队认为,很大程度上源于项目方潜在的合约漏洞未得到全面的安全排查,进而导致闪电贷攻击事件的发生。

在此,成都链安需要提醒区块链各生态项目方,切不可因项目上线完成之后就掉以轻心,做好日常的安全排查和安全加固等工作,寻求第三方安全公司的力量,建立一整套的安全防护机制,防范于未然。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2021-02-05 19:59
  • 阅读 ( 228 )
  • 学分 ( 2 )
  • 分类:登链公开课

0 条评论

请先 登录 后评论
成都链安
成都链安

93 篇文章, 397 学分