了解智能合约审计和最佳实践请点击查看文档
https://twitter.com/BlockSecTeam/status/1628319536117153794 https://twitter.com/BeosinAlert/status/1628301635834486784
攻击交易 1: https://bscscan.com/tx/0x7fa89d869fd1b89ee07c206c3c89d6169317b7de8b020edd42402d9895f0819e 攻击交易 2: https://bscscan.com/tx/0xc09678fec49c643a30fc8e4dec36d0507dae7e9123c270e1f073d335deab6cf0 攻击合约:0xd360b416ce273ab2358419b1015acf476a3b30d9 攻击账号:0x0c925a25fdaac4460cab0cc7abc90ff71f410094 被攻击合约:StakingDYNA 0xa7b5eabc3ee82c585f5f4ccc26b81c3bd62ff3a9
整个攻击过程分为两部分:
- 准备阶段: 0x7fa89d869fd1b89ee07c206c3c89d6169317b7de8b020edd42402d9895f0819e 攻击者准备大量账号,调用 StakingDYNA. deposit 存入少量 DYNA 代币。
在 deposit 函数中,初次 deposit 的账号将会记录下当前 block.timestamp,存储在 stakeDetail.lastProcessAt 中: 2) 攻击阶段: 0xc09678fec49c643a30fc8e4dec36d0507dae7e9123c270e1f073d335deab6cf0 攻击者通过闪电贷获取大量 dyna 代币,先通过上一步的合约调用 StakingDYNA. deposit 将代币存储在 StakingDYNA 合约中,再直接调用 StakingDYNA. redeem 取回利息。 在攻击者第二次 deposit 时,StakingDYNA 合约并未更新时间戳,计算利息的时间差错误计算为 redeem – deposit1,而实际上应该为 redeem – deposit2。因为攻击时 deposit2 与 redeem 在同一 tx 中,interest 应该为 0: 攻击准备 tx 时间: 实际攻击 tx 时间: