PLDT事件 漏洞分析
https://twitter.com/BeosinAlert/status/1582181583343484928
攻击交易: https://bscscan.com/tx/0x8385625e9d8011f4ad5d023d64dc7985f0315b6a4be37424c7212fe4c10dafe0 攻击合约:0x83797825f6020a443b95fa3932ab13dd61d48b49 攻击账号:0x83797825f6020a443b95fa3932ab13dd61d48b49 被攻击合约:PLTD 0x29b2525e11bc0b0e9e59f705f318601ea6756645
查看攻击交易过程,可以发现池子中的PLDT代币数量减少到1单位,这将引起价格的巨大波动:
查看步骤,可发现: 1) 在第1步中攻击者先将代币转给池子cake-lp,再调用池子的skim函数,池子会将多余的代币转给指定接收地址。查看代码发现,当发起方是池子时将会调用 _tokenTransferBuy 函数。在该函数中会将池子的代币转移到 _fundAddress、_bonusAddress、_projectAddress 等地址中。注意peojectFee的值为 tAmount.mul(Fee.sub(5)).div(100) ,而Fee的值为90,这将导致池子的PLTD代币急剧减少。
2) 攻击者在第2步中将代币转给地址0x16b9a82891338f9ba80e2d6970fdda79d1eb0dae,将调用PLDT合约的_tokenTransfer函数。查看其代码实现,只要满足 _bron > 0,即将销毁池子中的brone代币,并更新池子的reserve0、reserve1的值。
因为攻击者在调用skim前先给池子转移了116042798941631110395795单位的PLTD代币,因此满足 if(to == uniswapV2Pair) 条件,将调用池子的 _tokenTransferSell 函数,这将导致池子的变量 _bron 值大于0。
3) 至此,池子中的PLDT代币代币将大量减少,导致价格失衡,攻击者仅用少量的PLTD代币即可兑换出池子中的BSC-USD 代币。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!