查看原文
其他

怪事?盗了又归还?TreasureDAO安全事件分析

成都链安技术团队 成都链安 2022-04-14


3月3日,成都链安链必应-区块链安全态势感知平台舆情监测显示基于 Arbitrum 的 TreasureDAO NFT 交易市场被曝发现漏洞,导致100多个NFT被盗,令人意外的是,在事件发生几小时后,攻击者却开始归还被盗NFT(猜不透攻击者的心思)。关于本次事件,成都链安技术团队第一时间进行了分析。


#1 总述

交易发起地址利用TreasureMarketplaceBuyer合约中存在的逻辑缺陷,通过该合约的buyItem函数的_quantity参数能够置零且不影响ERC-721代币交易的漏洞,将totalPrice置零从而无代价获取ERC-721代币。

 

交易发起地址:

Arbitrum:0x9b1acd4336ebf7656f49224d14a892566fd48e68

被攻击的合约:

Arbitrum:0x812cda2181ed7c45a35a691e0c85e231d218e273

攻击交易:

Arbitrum:0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b

在Arbitrum上,交易发起者通过TreasureMarketplaceBuyer合约的buyItem函数传入了数值为0的_quantity参数,从而无偿购买了TokenID为5490的ERC-721代币。(仅以此次交易为例)


 交易详情


从代码上来看,TreasureMarketplaceBuyer合约的buyItem函数在传入_quantity参数后,并没有做代币类型判断,直接将_quantity与_pricePerItem相乘计算出了totalPrice,因此safeTransferFrom函数可以在ERC-20代币支付数额只有0的情况下,调用TreasureMarketplace合约的buyItem函数来进行代币购买。

 

TreasureMarketplaceBuyer 合约的 buyItem函数代码

 

但是在调用TreasureMarketplace合约的buyItem函数时,函数只对购买代币类型进行了判断,并没有对代币数量进行非0判断,导致ERC-721类型的代币可以在无视_quantity数值的情况下直接购买,从而实现了漏洞攻击。

 

TreasureMarketplace的buyItem函数代码


涉及的代币资产:




#2 总结建议


本次安全事件主要原因是ERC-1155代币和ERC-721代币混用导致的逻辑混乱,ERC-721代币并没有数量的概念,但是合约却使用了数量来计算代币购买价格,最后在代币转账时也没有进行分类讨论。

 

建议开发者在开发多种代币的销售贩卖合约时,需要根据不同代币的特性来进行不同情况的业务逻辑设计。






媒体矩阵

新浪微博

weibo.com/u/6566884467

B站

https://space.bilibili.com/2093257939

Twitter

twitter.com/Beosin_com

Medium

medium.com/@Beosin

知乎

https://www.zhihu.com/org/cheng-du-lian-an-ke-ji-28

Facebook

https://www.facebook.com/profile.php?id=100026616589335



↙点击阅读全文

立刻直达官网

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存