zkLend Finance事件分析

本文为机器翻译
展示原文

于2025年2月12日,zkLend Finance协议遭到攻击,导致损失约950万美元。

zkLend是一个建立在Starknet区块链上的去中心化借贷协议。它允许用户借贷资产,类似于Aave或Compound等协议。

该攻击针对的是zkLend Market合约(特别是wstETH市场),这是允许用户借贷资产的主要合约。

关键信息

漏洞分析

从攻击者地址来看,在攻击期间发生了多笔交易。

要理解这次攻击,我们需要首先检查调用runwithfirstdep的交易,因为它似乎是最重要的一个。

runwithfirstdep交易中,我们可以看到对zkLend Market合约进行了多次连续的depositwithdraw调用。让我们先检查一个deposit调用的细节。

很明显,depositwithdraw调用中的金额不相同,这表明这不是一个简单的存取交易。这里我们看到,攻击者只存入了4.069个wstETH,但提取了6.103个wstETH。因此,我们需要检查depositwithdraw函数的代码,以理解这次攻击。

通过检查deposit函数的代码,我们可以看到它接受输入代币的amount,并铸造相应数量的zTokenwithdraw函数也是如此。但是,为什么攻击者能够销毁比他们应该的更多的zToken呢?这让我们不得不检查zToken合约中burn函数的实现。

burn函数的实现中,我们可以看到实际销毁的金额是scaledDownAmount。此外,通过检查safe_math::sub()函数,我们可以确定计算scaledDownAmount的公式是amount * SCALE / accumulator

所以,检查这个值最简单的方法是从攻击交易中检查这些值。我们有以下值:

  • amount: 6103946859077466029(提取调用)

  • accumulator: 4069297906051644020000000000000000000000000000

  • SCALE: 1000000000000000000000000000

从这些值中,我们可以计算出scaledDownAmount如下:

scaledDownAmount = amount * SCALE / accumulator

= 6103946859077466029 * 1000000000000000000000000000 / 4069297906051644020000000000000000000000000000

= 1

所以现在很明显,这个值是攻击者精心选择的,以绕过scaled_down_amount.is_non_zero()的检查。在runwithfirstdep交易之前的deposit交易用于操纵get_lending_accumulator()函数的结果,使这个值大得多,从而使scaled_down_amount变为1

事后分析

攻击后,被盗资金从Starknet桥接到以太坊区块链。攻击者随后试图通过将资金存入Railgun隐私池来洗钱,但被该协议的政策阻止。这次失败的洗钱尝试突出了在DeFi领域平衡隐私和透明度的重要性。

经验教训

这一事件突出了在处理复杂和敏感的金融操作时,仔细验证输入值的重要性。通过吸取这样的事件教训,DeFi社区可以构建更加稳健的系统,更好地保护用户资金。

来源
免责声明:以上内容仅为作者观点,不代表Followin的任何立场,不构成与Followin相关的任何投资建议。
喜欢
收藏
评论