一个基于Pendle协议构建的农业协议,遭受了重入攻击,导致损失约2700万美元。由于Penpie已暂停,我们现在提供详细的根本原因分析。这是一个典型的由于缺乏重入保护而导致的问题。具体来说,易受攻击的合约(0xff51c6,PendleStaking的实现合约)未能考虑到所提供的参数
一个基于 Pendle 协议构建的农业协议,遭受了重入攻击,导致损失约 2700 万美元。由于 Penpie 已暂停,我们现在提供详细的根本原因分析。这是一个典型的由于缺乏重入保护而导致的问题。具体来说,易受攻击的合约(0xff51c6,PendleStaking 的实现合约)未能考虑到所提供的参数(即市场)可能是不受信任的,这可能会被滥用来重新进入该合约。攻击准备 TX:https://app.blocksec.com/explorer/tx/et h /0x7e7f9548f301d3dd863eac94e6190cb742ab6aa9d7730549ff743bf84cbd21d1 ... 攻击者最初创建了一个伪造的 SY(标准化收益代币,即 0x4476b)。虽然SY代币本身毫无价值,但合约设置了两个高价值的PENDLE-LPT市场代币(即0x6010_PENDLE-LPT,0x038c_PENDLE-LPT)作为奖励代币。通过这样做,攻击者随后在Pendle上创建了一个市场,并将其注册到Penpie上。攻击TX:https://app.blocksec.com/explorer/tx/et h /0x42b2ec27c732100dd9037c76da415e10329ea41598de453bb0c0c9ea7ce0d8e5 … 在攻击过程中,攻击者执行了batchHarvestMarketRewards()函数来收获奖励,这些奖励是根据调用redeemRewards()函数前后balanceOf()的差额计算出来的。而redeemRewards()函数又触发了特定市场的claimRewards()函数。由于协议没有预料到市场被恶意控制的可能性,攻击者能够通过 depositMarket() 函数重新进入受害者合约。之后,攻击者存入两枚高价值的 LPT 市场代币,这些代币被错误地视为奖励。同时,攻击者获得了与这些存款相对应的铸造股份。因此,攻击者可以提取同样有价值的 LPT 市场代币以及在 depositMarket() 中铸造的相应股份,并领取奖励以实现获利。
许多人可能不知道在 Pendle 上创建新池是无需许可的。Penpie 通过将一个假池传递给其“batchHarvestMarketRewards”函数而遭到黑客攻击。
<!--StartFragment-->
如果你检查该函数,你会看到对池地址进行了有效性检查。因此,该假池必须在 Penpie 的“PendleStaking”合约中注册。但“registerPool”是一个权限函数,仅允许由“resgisterHelper”调用。 <!--StartFragment-->
<!--StartFragment-->
`registerHelper` 是另一个合约,用于验证矿池地址并将其注册到 `PendleStake`。但您可以看到它是一个无需权限的函数,检查正在调用 `pendleMarketFactoryV3.isvalidMarket ()`以确保矿池是合法的。
<!--StartFragment-->
<!--EndFragment-->
<!--EndFragment--> <!--StartFragment-->
但这种检查毫无意义,因为任何人都可以使用“PendleMarketFactoryV3”来创建一个新的市场,并通过penpie的“registerHelper”合约中的“isValidMarket”检查。
<!--EndFragment--> <!--StartFragment-->
<!--EndFragment-->
<!--StartFragment-->
因此黑客通过`PendleMarketFactory`创建了自己的 SY 代币合约和新池,并利用它来欺骗 Penpie 的`harvestBatchMarketRewards`功能并耗尽 Penpie 中的 LP 代币。
<!--EndFragment--> <!--StartFragment-->
具体步骤是在 getRewardTokens 中返回 Pendle LP 代币的地址,然后在领取过程中通过 Penpie 存入到对应的 Pendle 池中,从而增加 Penpie 质押合约中的 Pendle LP 代币。
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!