jaypeggerz 重入漏洞
https://twitter.com/blocksecteam/status/1608372475225866240 https://twitter.com/certikalert/status/1608338952896876551
攻击交易: 0xd4fafa1261f6e4f9c8543228a67caf9d02811e4ad3058a2714323964a8db61f6 攻击合约:0xed42cb11b9d03c807ed1ba9c2ed1d3ba5bf37340 攻击账号:0x0348d20b74ddc0ac9bfc3626e06d30bb6fac213b 被攻击合约:JAY 0xf2919d1d80aff2940274014bef534f7791906ff2
分析交易过程,查看攻击方的获利点:
查看交易过程可发现攻击者先用 22 Ether购买了13584899853779845952188单位的JAY,再紧接着再卖出,合约返回 41.659433613619462107 个Ether。 注意到攻击者第2次购买时参数erc721TokenAddress传入值为 0xed42cb11b9d03c807ed1ba9c2ed1d3ba5bf37340 ,即为攻击合约。 查看代码逻辑发现若参数erc721TokenAddress不为空,即将调用代币地址的transferFrom函数,而代币地址可控,且合约的sell函数并未有防重入限制,攻击者可进行重入攻击。
再查看合约的sell函数。Sell函数调用JAYtoETH()方法计算应返回多少Ether,计算公式为: (value * address(this).balance).div(totalSupply());
注意到攻击者第2次买入时已先传给合约 50.5 Ether,而totalSupply()此时还没变,这将导致合约返给攻击者的Ether变大,攻击者重复此攻击过程。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!