币非凡 - 区块链|交易所导航 www.bifeifan.com
当前位置:网站首页 > 新闻 > 正文

DeFi Saver 用户 31 万 DAI 是如何被盗的?慢雾技术拆解攻击细节

admin 2020-10-10 1106 浏览


 撰文:Kong,就职于慢雾安全团队

2020 年 10 月 8 号,去中心化钱包 imToken 发推表示,用户报告称 31 万枚 DAI 被盗,这与 DeFi Saver Exchange 漏洞有关。 DeFi Saver 对此回应称,被盗资金仍旧安全,正在联系受害用户。截至目前,资金已全部归还受害用户。早在今年 6 月份 DeFi Saver 就表示该团队发现 DeFi Saver 应用系列中自有交易平台的一个漏洞,此次 31 万枚 DAI 被盗也与此前的 SaverExchange 合约漏洞有关。慢雾安全团队在收到情报后,针对此次 31 万枚 DAI 被盗事件展开具体的分析。

DeFi Saver 用户 31 万 DAI 是如何被盗的?慢雾技术拆解攻击细节 Saver DeFi 技术 用户 细节 OptiToken行情 OptiToken OptiToken虚拟币是真是假 新闻  第1张

1、在代码第 5 行可以看到先对 orderAddresses[1] 是否为 KYBER_ETH_ADDRESS 地址做了判断,由于 orderAddresses[1] 为 DAI 合约地址,因此将直接调用 transferFrom 函数将数量为 _amount 的 DAI 转入本合约。

2、接下来在代码第 11、12 行,通过 takeFee 函数计算 fee,最终计算结果都为 0,这里不做展开。

3、由于攻击者传入的 _exchangeType 为 4,因此将走代码第 22 行 if (_exchangeType == 4) 的逻辑。在代码中我们可以看出在此逻辑中调用了 takeOrder 函数,并传入了攻击者自定的 _callData,注意这将是本次攻击的关键点,接下来切入分析 takeOrder 函数:

function takeOrder(address[3] memory_addresses, bytes memory_data, uint_value, uint_amount) private returns(bool, uint, uint) { bool success; (success, ) =_addresses[0].call.value(_value)(_data); uint tokensLeft =_amount; uint tokensReturned = 0; if (success){ // check how many tokens left from_src if (_addresses[1] == KYBER_ETH_ADDRESS) { tokensLeft = address(this).balance; } else { tokensLeft = ERC20(_addresses[1]).balanceOf(address(this)); } // check how many tokens are returned if (_addresses[2] == KYBER_ETH_ADDRESS) { TokenInterface(WETH_ADDRESS).withdraw(TokenInterface(WETH_ADDRESS).balanceOf(address(this))); tokensReturned = address(this).balance; } else { tokensReturned = ERC20(_addresses[2]).balanceOf(address(this)); } } return (success, tokensReturned, tokensLeft); }

4、在 takeOrder 函数中的第 4 行,我们可以直观的看出此逻辑可对目标 _addresses[0] 的函数进行调用,此时 _addresses[0] 为 _exchangeAddress 即 DAI 合约地址,而具体的调用即攻击者自定传入的 _callData,因此如果持有 DAI 用户在 DAI 合约中对 SaverExchange 合约进行过授权,则可以通过传入的 _callData 调用 DAI 合约的 transferFrom 函数将用户的 DAI 直接转出,具体都可以在 _callData 中进行构造。

5、接下来由于返回的 tokens[0] 为 1,所以将走 swapTokenToToken 函数代码块中第 76 行以下的逻辑,可以看到都是使用 if 判断的逻辑,毫无疑问都能走通。

分析思路验证

让我们通过攻击者的操作来验证此过程是否如我们所想:

1、通过链上记录可以看到,被盗的用户历史上有对 SaverExchange 合约进行 DAI 的授权,交易哈希如下:

0xdcf73848022ec1f730d9fdb90f4e8563f0dff48d9191aab19fc51241708eacf0

2、通过链上数据可以发现传入的_callData 为:

23b872dd //SlowMist// transferFrom 函数签名 000000000000000000000000c001cd7a 370524209626e28eca6abe6cfc09b0e5 0000000000000000000000005bb456cd 09d85156e182d2c7797eb49a43840187 00000000000000000000000000000000 00000000000041a522386d9b95c00000 //SlowMist// 310000e18

其中可以看出 23b872dd 为 transferFrom 函数签名。

3、通过链上调用过程可看出攻击者直接调用 DAI 合约的 transferFrom 函数将被盗用户的 31 万枚 DAI 转走:

DeFi Saver 用户 31 万 DAI 是如何被盗的?慢雾技术拆解攻击细节 Saver DeFi 技术 用户 细节 OptiToken行情 OptiToken OptiToken虚拟币是真是假 新闻  第2张

完整的攻击流程如下

1、攻击者调用 swapTokenToToken 函数传入 _exchangeAddress 为 DAI 合约地址,选择 _exchangeType 为 4,并将攻击 Payload 放在 _callData 中传入。

2、此时将走 _exchangeType == 4 的逻辑,这将调用 takeOrder 函数并传入 _callData。

3、takeOrder 函数将对传入的 _callData 进行具体调用,因此如果持有 DAI 用户在 DAI 合约中对 SaverExchange 合约进行过授权,则可以通过传入的 _callData 调用 DAI 合约的 transferFrom 函数将用户的 DAI 直接转出,具体都可以在 _callData 中进行构造。

4、通过构造的 _callData 与此前用户对 SaverExchange 合约进行过 DAI 的授权,SaverExchange 合约可以通过调用 DAI 合约的 transferFrom 函数将用户账户中的 DAI 直接转出至攻击者指定的地址。

最后思考

此漏洞的关键在于攻击者可以通过 takeOrder 函数对目标合约 _addresses[0] 的任意函数进行任意调用,而传入 takeOrder 函数的参数都是用户可控的,且未对参数有任何检查或限制。因此,为避免出现此类问题,建议项目方使用白名单策略对用户传入的 _callData 等参数进行检查,或者结合项目方具体的业务场景寻找更好的调用方式,而不是不做任何限制的进行随意调用。

此漏洞不仅只影响到通过 DAI 合约对 SaverExchange 合约授权过的用户,如果用户历史对 SaverExchange 合约有进行过其他 Token 的授权,则都会存在账户 Token 被任意转出风险。建议此前有对 SaverExchange 合约进行过授权的用户尽快取消授权(推荐使用 这个网站 自查授权情况),避免账户资产被恶意转出。

相关参考链接如下:

https://medium.com/defi-saver/disclosing-a-recently-discovered-exchange-vulnerability-fcd0b61edffe

https://twitter.com/imTokenOfficial/status/1314126579971186688

相关推荐

央行数字货币研究所所长穆长春:数字人民币与支付宝、微信不存在竞争关系

...

数字货币远远没有到抢标准的时候,马云说的对吗?

...

行业周报 | ETH2.0将正式启动,波卡开发者大幅增长,DEX成交量跌70%

...

观点丨为什么不存在 "Ethereum杀手"?
观点丨为什么不存在 "Ethereum杀手"?

作者 | EricOlszewskiEthereum 社区一直坚持在前沿和冒险的道路上发展。事实上,我们大多数人都同意这样的观点:如果有更好的平台出现,我们会...

1小时前 admin

通过代币化推动企业DeFi采用?

...

关于数字货币标准,马云说的对吗?

文丨吴志峰(中国人民大学国际货币研究所特约研究员)马云昨天(10月24日)在外滩金融峰会上发表演讲,引发强烈反响。有一大段说到数字货币,他说,数字货币远远没有到抢标准的时候。他说的对吗?关于央行数字货...

由BTC ETF难获批看加密市场监管问题
由BTC ETF难获批看加密市场监管问题

在加密货币行业里,比特币交易所交易基金(BTCETF)一直被视为机构投资者入场的最强信号,同时这也意味着机构投资者真正意义上接受了比特币。假如比特币交易所交易...

1小时前 admin

三个比特币鲸鱼群有助于推动BTC价格上涨

BTC分析:三个比特币鲸鱼群可能有助于推动BTC价格上涨10月25日,比特币大规模投资分析师Whalemap指出,在短期交易中,有三个主要的比特币鲸鱼群。这三个水平将指向关键技术水平并作为支持和阻力位...

曾是摩根大通的资深交易员,他认为未来商业银行将被DeFi取代
曾是摩根大通的资深交易员,他认为未来商业银行将被DeFi取代

尽管bitcoiners和加密货币爱好者试图否认这一点,但在许多投资者眼中,传统金融的改观是使该行业合法化和宣传的最佳方式。CoinShares执行总裁Dani...

1小时前 admin

为何锁仓资产利用率才是DeFi最佳评估指标
为何锁仓资产利用率才是DeFi最佳评估指标

一直关注去中心化金融行业发展的朋友可能会发现,许多文章和新闻都使用“锁仓量”这个指标来评估去中心化金融(DeFi)项目。“锁仓量”其实是一个源自传统金融领域的资...

1小时前 admin

区块链真会导致传统商业银行消亡吗?
区块链真会导致传统商业银行消亡吗?

摩根大通资深交易员、CoinShares执行主席丹尼尔·马斯特斯(DanielMasters)近日接受《福布斯》采访时表示区块链技术有可能导致商业银行消亡,尤...

1小时前 admin

互金协会李东荣:随着数字货币出现,各国都加快推进这方面的研究

...

观点丨为什么不存在 "Ethereum杀手"?
观点丨为什么不存在 "Ethereum杀手"?

作者 | EricOlszewskiEthereum 社区一直坚持在前沿和冒险的道路上发展。事实上,我们大多数人都同意这样的观点:如果有更好的平台出现,我们会...

3小时前 admin

观点:2021年或将成为企业DeFi之年

2021年,企业DeFi采用可能会增加,但前提是代币化标准要跟上主流。为什么说去中心化金融已经迅速崛起了呢,从数据上看,这是因为该行业的锁定总价值已经超过了110亿美元。DeFi,这个以“收益耕种”和...

纵览波卡9大热门DeFi 谁更有潜力?
  • 纵览波卡9大热门DeFi 谁更有潜力?
  • 纵览波卡9大热门DeFi 谁更有潜力?
  • 纵览波卡9大热门DeFi 谁更有潜力?
  • 纵览波卡9大热门DeFi 谁更有潜力?