本文深入分析了 Abracadabra Money 遭受的 650 万美元攻击事件,重点剖析了 Cauldron V4 合约的漏洞利用原理。
欢迎来到“区块取证”,这是我们的新系列,我们将分析区块链中一些最有趣的黑客事件。我们的开篇专题深入探讨了 650 万美元的 Abracadabra Money 黑客事件,详细分析了 Cauldron V4 漏洞及其对 DeFi 安全的影响。
Abracadabra Money 是一个开创性的 DeFi 借贷协议,它使用户能够使用各种类型的抵押品来借用其全稳定币 MIM 代币。最近,该协议面临着一个重大挑战,一次攻击利用了其 V3 和 V4 Cauldron,导致未经授权借用 MIM 代币。这次攻击不仅导致了高达 650 万美元的损失,还导致 MIM 稳定币脱锚。
对于那些热衷于深入研究技术细节的人,你可以在此处探索 CauldronV4 vault 合约。让我们分解一下这个漏洞的核心组成部分。
Cauldron 是 Abracadabra 的 vault,通过两种方式跟踪借入的资金:
Elastic(弹性):表示借款人需要偿还的代币总额,由于利率的变化,这个值可能会波动。
Base(基数):表示所有借款人持有的债务总份额,为内部计算提供更稳定的债务表示。
攻击者通过重复调用 V4 Cauldron 中的 userBorrowPart()
和 repay()
来利用精度损失。
在下面的代码段中,part
表示用户在总债务中所借份额的数量,例如 totalBorrow.base
。

在我们继续之前,让我们看一下 Rebase Library 的 add
和 sub
函数:

攻击者从 Abracadabra.Money: Degenbox
提取了 MIM 代币的闪电贷,并将代币捐赠给了 BentoBox
合约。
然后,攻击者调用了 CauldronV4
中的 repayForAll()
函数,该函数偿还了所有借款的债务,并将 elastic 设置为 0。

当 totalBorrow.elastic
设置为 0 时,totalBorrow.base
也应该降至 0。但是,将 base 降至 0 的逻辑未包含在内,导致 base 保持在 6。
Rebase library没有考虑到 totalBorrow.elastic
和 totalBorrow.base
值之间的这种差异。因此,攻击者能够重复借入和偿还单个代币,这意味着 part
的值呈指数级增长。这是因为在第 3 步中基数保持为 6。

totalBorrow.base
没有按预期更新,因此协议实施的最终债务或偿付能力检查是多余的。 与使用 _totalBorrow.base
提供的总债务份额相比,借入的 part
值非常小,这使攻击者能够耗尽池中的所有流动性。
add
和 sub
函数受到影响,这些函数在借款和还款函数中被调用。
该 library 没有在 CauldronV4 中存储新的 base 值。因此,我们可以有一个函数来更新 CauldronV4 中的 Rebase
结构。
应在 repayForAll()
和任何其他 elastic 值发生变化的函数中调用此函数。

我们希望你对 650 万美元的 Abracadabra Money 黑客事件的复杂性以及对 DeFi 安全性的更广泛影响有所了解。请继续关注更多“区块取证”文章,我们将继续剖析区块链中最有趣和最具影响力的漏洞背后的机制。 让我们共同从这些事件中学习,以开发更强大、更具弹性的系统。
- 原文链接: extropy-io.medium.com/br...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!