TreasureDAO 攻击分析

该博客揭示了一个智能合约的安全漏洞,具体位于TreasureMarketplaceBuyer合约的buyItem函数。攻击者可以利用721token(ERC721)在价格验证不当时,以0成本购买NFT,无论指定的购买数量是多少。合约代码和攻击交易链接已提供,显示了当买入数量设为0时,攻击者能够不受限制地获取NFT。

合约代码:
https://arbiscan.io/address/0x812cda2181ed7c45a35a691e0c85e231d218e273#code
攻击交易:
https://arbiscan.io/tx/0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b
在合约TreasureMarketplaceBuyer中
函数

function buyItem(
        address _nftAddress,
        uint256 _tokenId,
        address _owner,
        uint256 _quantity,
        uint256 _pricePerItem
    ) external {
        (, uint256 pricePerItem,) = marketplace.listings(_nftAddress, _tokenId, _owner);

        require(pricePerItem == _pricePerItem, "pricePerItem changed!");

        uint256 totalPrice = _pricePerItem * _quantity;
        IERC20(marketplace.paymentToken()).safeTransferFrom(msg.sender, address(this), totalPrice);
        IERC20(marketplace.paymentToken()).safeApprove(address(marketplace), totalPrice);

        marketplace.buyItem(_nftAddress, _tokenId, _owner, _quantity);

        if (IERC165(_nftAddress).supportsInterface(INTERFACE_ID_ERC721)) {
            IERC721(_nftAddress).safeTransferFrom(address(this), msg.sender, _tokenId);
        } else {
            IERC1155(_nftAddress).safeTransferFrom(address(this), msg.sender, _tokenId, _quantity, bytes(""));
        }
    }

在判断为721token默认代币数量为1,不管买入数量_quantity的设置。都会发送tokenid.如果买入数量为设置为0就会0成本买入Nft

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值