项目合约的 buyItem 函数代码 从代码上来看,合约的buyItem函数在传入_quantity参数后,并没有做代币类型判断,直接将_quantity与_pricePerItem相乘计算出了totalPrice,因此safeTransferFrom函数可以在ERC-20代币支付数额只有0的情况下,调用合约的buyItem函数来进行代币购买。 然而在调用buyItem函数时,函数只对购买代币类型进行了判断,并没有对代币数量进行非0判断,导致ERC-721类型的代币可以在无视_quantity数值的情况下直接购买,从而实现了漏洞攻击。 建议: 本次安全事件主要原因是ERC-1155代币和ERC-721代币混用导致的逻辑混乱,ERC-721代币并没有数量的概念,但是合约却使用了数量来计算代币购买价格,最后在代币转账时也没有进行分类讨论。 建议开发者在开发多种代币的销售贩卖合约时,需要根据不同代币的特性来进行不同情况的业务逻辑设计。 案例二:Build Finance项目遭遇治理攻击 背景: 2 月 15 日,DAO 组织 Build Finance 表示遭遇恶意治理攻击,攻击者通过获得足够多的投票成功了控制其 Token 合约。 详情: 在2020年9月4日的一笔交易中,Build Finance合约创建者通过setGovernance函数将治理权限转移。通过查找内部的Storage,发现权限转移给了0x38bce4b地址。继续跟进0x38bce4b地址,发现是一个Timelock合约,而合约中可以调用setGovernance函数的只有executeTransaction函数。 Build Finance被攻击流程 继续跟进发现,在2021年1月25日,0x38bce4b地址调用executeTransaction函数将权限转移到了0x5a6ebe地址。2022年2月11日,由于投票设置的阈值较低导致提案通过,0x5a6ebe地址的治理权限变更为了0xdcc8A38A地址。在获取到治理权限后,攻击者恶意铸币并耗尽了交易池的流动性。 建议: DAO合约应该设置合适的投票阈值,实现真正的去中心化治理,避免很少的投票数量就使得提案通过并成功执行,建议可以参考openzeppelin官方提供的治理合约的实现。 案例三:Ronin6亿美元盗币案 背景: 3 月 23 日,Sky Mavis 的 Ronin 验证器节点和 Axie DAO 验证器节点遭到破坏,攻击者使用被黑的私钥来伪造假提款,获利约6.25亿美元。而Ronin Network直到3月29日才发现自己遭受到了攻击。 详情: Sky Mavis 的 Ronin 链目前由 9 个验证节点组成。为了识别存款事件或取款事件,需要九个验证者签名中的五个。攻击者设法控制了 Sky Mavis 的四个 Ronin 验证器和一个由 Axie DAO 运行的第三方验证器。此后 Ronin 官方表示,所有证据都表明这次攻击或与社会工程学相关。 (责任编辑:admin) |