# Summary
8 月 26 日,在 Linea 上构建的借贷协议 Mendi Finance 的质押合约宣布遭到了漏洞利用,损失了约 93 万枚 Mendi 代币(约 2.5 万美元)。ScaleBit 安全团队在注意到事件后,迅速与 Mendi Finance 团队进行了沟通,并立刻启动安全响应。经过调查,ScaleBit 安全团队确认此次被攻击的根本原因是参数设置不一致和提款延迟时间配置不正确。
# Abstract
Mendi Finance 的质押合约,遭到用户 0x69cd77 的攻击。该用户在接近一天的时间内,持续通过多个新地址质押来获取奖励,共获利约 93 万枚 Mendi 代币;随后该用户将所有获利的代币进行出售,得到 21,657 枚 USDC, 导致 Mendi 代币的价格从 0.03 跌到了 0.018。
# 漏洞分析
此次攻击的漏洞原因为:StakedDistributor 合约中错误地设置了延迟提取时间和 _editRecipientInternal 方法未正确更新对应的奖励参数导致的。
在质押合约 StakedDistributor 中,_setWithdrawalPendingTime 方法是用于修改用户提取的延迟时间 withdrawalPendingTime,由于具有 onlyOwner 修饰,所以只允许管理来更改延迟时间。
但经过查询,在此次攻击之前,该延迟时间被错误设置为 0,这意味着用户可以立刻提取其质押的 Mendi 代币,绕过任何旨在添加安全性或提供其他功能的预期时间锁定或等待期。
此外在 StakedDistributor 合约当中,mint 函数允许用户向合约存入资产,作为回报,用户会收到 sMendi 代币。代币转移完成之后,协议会调用 _editRecipientInternal 函数来处理用户的份额并更新奖励。
但是 _editRecipientInternal 函数在循环当中存在问题,该循环目的是更新每个 token 最新的奖励索引,但是循环的 token 数组的索引是从 1 开始循环的。由于 underlying 代币存储在 tokens[0] 中,这意味着记录 underlying 代币的 credit 更新将被跳过。
因此,当调用 updateCredit 函数时,它会将 recipient.lastShareIndex 更新为 _shareIndex。这可能会导致数据上的差异,因为更新后的值可能与用户存入的代币对应的实际份额不匹配。这种数据上更新的不一致给用户和协议的完整性带来了问题。
在用户调用 claim 函数时,协议会调用 updateCredit 函数来更新用户 credit。但是,由于上一个循环从索引 1 开始,因此跳过了对 token[0] 上用户 lastShareIndex 的更新。因此,当通过 Recipient storagerecipient =recipients[token][account]; 在第 144 行检索用户的 Recipient 结构体时,recipient.credit 和 recipient.lastShareIndex 都为 0。
最终计算结果是 credit = _shareIndex * Shares / 2**160,也就是跳过了减去 lastShareIndex,最终导致用户可以获得不当利润。
# 攻击流程
以下是攻击中的信息:
· 攻击交易
https://lineascan.build/tx/0xd5b41c3d9cb766448697cce1af26e03dee557a46d8f149f107c2e2d00b49a656
· 攻击者地址
0x69cd776d8b37ee991362cad27fac2fbab2d0dce4
· 被攻击合约
0xe4e5E5cD071F8A202b2aaFb3f7EEaD93dd618deE
整个事件攻击者利用步骤大致如下:
1. 用户 0x69cd776d8b37ee991362cad27fac2fbab2d0dce4 首先使用 603 USDC 购买了 19,793 枚 Mendi 代币。
2. 该用户将 10000 枚 Mendi 代币质押到 StakedDistributor 合约上。
3. 由于参数设置不一致,用户立即调用了 claim 方法,并收到了 223 枚 Mendi 代币作为奖励。
4. 随后,用户立即提取了所有质押的代币(因为错误的设置了提取延迟时间为 0),并将其转移到一个新地址 0xb533c4da86afb2fa8fc5bf4ec2a854875c09c848。
5. 该用户使用新地址重复第 2 至第 4 步,总共积累了约 930K Mendi 代币作为奖励。最后通过 Velocore LP 套现 930,899.1927 MENDI,获得 21,657.3077 USDC,并使得 MENDI 的价格从 0.03 降至 0.018。
# Conclusion
针对本次事件,ScaleBit 安全团队建议如下:
确保智能合约的安全性不仅需要经过详细的合约代码测试和审计,还需要项目团队在整个运行过程中保持高度警惕;项目团队应确保所有参数被正确设置,并持续关注项目的运行状态,及时发现运行中的风险并采取适当措施,以避免损失的进一步扩大。
关于 SCALEBIT
ScaleBit 是一个为 Web3 Mass Adoption 提供安全解决方案的区块链安全团队。凭借在区块链跨链和零知识证明等扩展技术方面的专业能力,我们主要为 ZKP、Layer 2 和跨链应用提供细致和尖端的安全审计。
ScaleBit 团队由在学术界和企业界都有丰富经验的安全专家组成,致力于为可扩展的区块链生态系统的大规模应用提供安全保障。
https://www.scalebit.xyz/
https://twitter.com/scalebit
END
点击卡片,关注 ScaleBit ~
原文始发于微信公众号(ScaleBit):借贷协议 Mendi Finance 遭遇攻击,谁来守护 Linea 生态安全?