欢迎来到夏洛克的漏洞聚焦!每周,我们都会重点介绍我们的研究人员在 Sherlock 审计期间发现的一个有影响力的漏洞。 本周我们因配置错误而出现了过度提款。 它是由 @bin2chen、@TheCHADuke、iglyx、@tapired、@xiaoming9090 和 @0xleastwood 在 @NotionalFinance V3 竞赛中发现的。
如果当前余额为 999,900 USDC,而 withdrawAmountExternal 为 1,000,000 USDC,那么合约中的余额不足,需要从货币市场(例如,Compound)提取额外资金。
由于合同已经拥有999,900 USDC,因此只需从货币市场额外提取100 USDC,以满足1,000,000 USDC的提款请求。
然而,Notional并没有从货币市场提取100 USDC,而是根据oracle.getRedemptionCalldata(withdrawAmountExternal)函数从市场提取了1,000,000 USDC。因此,从货币市场提取了多余的999,900 USDC。
这有什么影响? 这导致了大量资产在 Notional 中闲置,未能在货币市场中产生任何回报或利息,这导致用户的收益显著下降,因为他们获得的利率低于预期,并且遭受了机会损失。
攻击者可能会利用这一点提取Notional在货币市场中投资的资金,从而导致协议的损失和巨大的收益/利息损失。
修复: 基本上,在修复之前,代码对预言机说的是:"准备从货币市场提取用户想要的所有资金。" 而它应该说的是:"只提取我们在货币市场上缺少的部分。"
修复后,对于之前的例子,合约已经持有的999,900 USDC保持不变,继续赚取收益,提高效率,并为所有用户保留回报。
这个漏洞源于在计算和传递提款金额时的一个微妙逻辑缺陷。由于忽视了合约的现有余额,系统不必要地从货币市场提取了过多的资金,导致资本效率低下和收益损失。 我们为通过这一发现帮助确保Notional的安全而感到自豪。当绝对需要安全时,Sherlock是正确的选择。
2.85K