Prisma Finance 漏洞利用事件分析 - 2024年3月28日

Prisma Finance 的 MigrateTroveZap 合约存在漏洞,允许攻击者操纵 Trove 所有者的抵押品,导致损失约 3479.24 ETH。攻击者通过直接调用闪贷并绕过输入验证,关闭并重新打开 Trove 所有者的 Trove,从而提取部分抵押品。Prisma 团队已暂停协议并建议用户撤销对 MigrateTroveZap 的授权。

Prisma Finance 事件 - 2024 年 3 月 28 日 - 事后分析

incident

概要

  • Prisma Finance 的 MigrateTroveZap 合约(mkUSDULTRA)两个版本中都存在一个漏洞,导致 3,479.24 ETH 的损失,约合 1200 万美元。
  • 作为回应,Prisma Finance 紧急多重签名暂停了协议的运行。
  • 存在漏洞的合约是一种特殊用途的合约,旨在将用户持仓从一个 TroveManager 迁移到另一个。
  • 此漏洞影响了 Prisma Trove 的所有者,他们批准了此合约通过 BorrowerOperations 合约上的 setDelegateApproval(MigrateTroveZap, True) 来管理其 Trove 的仓位。
  • 当攻击者进行一笔交易时,由于 onFlashloan 函数中缺少输入验证,导致了这个问题,这使得攻击者能够操纵合约的行为并拿走一部分 Trove 所有者的抵押品。
  • 因此,攻击者能够关闭 Trove 所有者的 Trove,提取抵押品 (wstETH),并以相同的债务 (mkUSD) 但更少的抵押品重新打开 Trove,从而拿走差额。
  • 正在进行彻底的调查,以查明根本原因并实施必要的修复。
  • 最开始是一名主要的攻击者(攻击者 1),随后出现了模仿攻击者。
  • Trove 所有者应验证他们是否已撤销对 MigrateTroveZap 的任何有效授权。

背景

Prisma Finance 部署了一个名为 MigrateTroveZap 的合约,以方便 Trove 所有者将其 Trove(抵押债务头寸)迁移到新的 TroveManager 合约。 这是 2024 年 3 月 宣布 的更广泛的系统升级的一部分。

作为这些更新的一部分,Prisma 弃用了最初的 4 个利率上限为 4% 的 LST (Liquid Staking Token) 金库,并用允许更高利率的新 LST 金库取而代之。 同时,3 个 LRT (Liquid Restaking Token) 金库也被弃用,并被替换为针对更高效赎回进行了优化的新版本。

Prisma 构建了 MigrateTroveZap 助手合约以确保平稳过渡,使 Trove 所有者能够无缝地将其 Trove 头寸从旧的 TroveManager 合约转移到新的合约,而无需关闭头寸、移除流动性或产生额外成本。该合约使用闪电贷来关闭用户的旧 Trove,并立即在新的 TroveManager 中以相同的抵押品和债务打开一个新的 Trove,所有这些都在一个原子交易中完成。

这些更改遵循了 Prisma 的标准 DAO 治理流程,迁移从 2024 年 3 月 20 日部署 MigrateTroveZap 合约开始,第一个 Trove 所有者从 3 月 23 日开始使用助手合约迁移 Trove。

事件详情

2024 年 3 月 28 日 11:25 UTC,一名攻击者(攻击者 1]( https://etherscan.io/address/0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202)) 在 MigrateTroveZap 合约中进行了一笔交易,导致约 3,257 ETH(约合 1100 万美元)从一些 Prisma Finance Trove 所有者处转移。 紧随其后的是另外两名攻击者(攻击者 2攻击者 3),他们设法转移了较小数量的 ~121 和 ~52 wstETH。 该事件的发生是由于 onFlashloan() 函数中的输入验证不足,这使得用户可以操纵输入数据并执行意外的合约行为。

受影响的 Trove 所有者之前已使用迁移合约从 TroveManager v1 迁移到 v2。 这涉及在 BorrowerOperations 合约中设置委托批准,并将 MigrateTroveZap 作为参数。 尽管该漏洞影响了 mkUSD 和 ULTRA 的 MigrateTroveZap 合约以及所有 TroveManagers,但只有 mkUSD 的 wstETH Trove 成为攻击目标。

Prisma 团队已建议 Trove 所有者撤销委托批准,并宣布了一个方便的流程,可以在 Prisma 应用程序上执行此操作。 该团队还暂停了协议,不允许添加新的抵押品并阻止进一步的损害。 一旦取消暂停,任何未完成的 zap 批准仍然会存在这个问题。

详细时间线(3 月 28 日)

  • 11:15 UTC:攻击者 1 的钱包通过 FixedFloat 交易所获得资金
  • 11:22 UTC:部署攻击者 1 的攻击合约
  • 11:25 UTC:攻击者 1 调用函数 0x82be0b96,发起交易。
  • 11:29 UTC:Prisma 团队收到 Discord 上社区成员的警报。
  • 11:51 UTC Prisma 在 Twitter 上宣布了一起潜在事件。
  • 12:11 UTC:Prisma 建议用户撤销 LST 和 LRT BorrowerOperations 上的委托批准
  • 12:41 UTC:攻击者 2 执行其第一笔交易。
  • 12:49 UTC:攻击者 3 执行其第一笔交易。
  • 12:51 UTC:紧急多重签名调用 Paused()

一般逻辑

攻击者通过以下步骤利用了该漏洞:

  1. 攻击者绕过了 migrate 函数,并使用精心设计的输入数据直接调用了闪电贷。
  2. 调用了闪电贷的回调函数 onFlashloan()
  3. 由于缺乏适当的检查,攻击者能够关闭 Trove 所有者的 Trove,并立即在同一 TroveManager 中重新打开它。 该交易导致所有者的头寸被关闭并重新打开,导致 Trove 所有者拥有一个具有相同债务但更少抵押品的新头寸,并且抵押品的差额位于 zap 合约中。
  4. 攻击者随后打开了一个新的 Trove,并使用 MigrateTroveZap 合约对其进行迁移,从而有效地将剩余的抵押品用于他们自己的 Trove。
  5. 最后,攻击者关闭了他们的 Trove 并获得了利润。

示例交易

该事件是通过一系列针对各个易受攻击的 Trove 的交易进行的。 下图是第一笔交易的简化资金流,其中 wstEthTroveManagerV2 ( 0x1cc) 将受害者的抵押品发送给 MigrateTroveZap,然后将其发回给 wstEthTroveManagerV2,最后将金额发送给合约 ( 0xd99)。

upload_f00cca34a138a127f96d580fb8d944cc

来源: Phalcon

攻击者关闭了 TroveOwner 的有效 Trove,该 Trove 以 1745.08 wstETH 抵押品和 1,442,100 mkUSD 债务开放。 Trove 所有者的 Trove 立即以 463.18 wstETH 抵押品和 1,443,398 mkUSD 债务重新打开。 这将抵押品比率从大约 498% 降低到 132%,使其面临清算风险。

upload_1f77f72d852a93df3513b5b6f0d5ad54

来源: Phalcon

攻击者继续开设了一个小型 Trove,其中包含一个 wstETH 抵押品和 2,000 个 mkUSD 债务。 他们使用 MigrateTroveZap 迁移了该头寸,并重新打开了一个 Trove,该 Trove 继承了合约中的剩余 wstETH。 重新打开的 Trove 拥有 1,282.79 wstETH 抵押品和 2,001.8 mkUSD 债务。

upload_d451f06266a34e31026dc4d385991f82 (1)

来源: Phalcon

最后,攻击者关闭了 Trove,收到 1,282.79 wstETH,并偿还了所有必要的闪电贷给 Balancer 和 Prisma。

upload_bad908e25c61ad34d3410ec79d025eae

来源: Phalcon

该漏洞的根本原因有两个:

  1. 通过直接调用 flashloan() 函数,攻击者可以操纵其他 Trove Manager 的头寸。
  2. 合约允许初始头寸中的抵押品与新头寸中的抵押品之间存在不匹配,并且差额容易被拿走。

upload_5d6cf09f0deb57c7a61add1e31ba3805

MigrateTroveZap 的闪电贷函数 - 来源: ContractReader.io

暂停协议的后果

Prisma 中的暂停是一种安全机制,可在紧急情况或不可预见的问题期间停止某些操作。 暂停后,诸如打开新金库、增加抵押品或债务以及存入稳定性池等功能将被禁用。 但是,用户仍然可以提取抵押品,以最大程度地减少资金被锁定的风险。 在该事件的背景下,暂停可能通过禁用新的 Trove 和抵押品添加来防止进一步的事件发生。

主要地址

名称 地址
攻击者 1 (EOA) 0x7E39E3B3ff7ADef2613d5Cc49558EAB74B9a4202
攻击者 2 (EOA) 0x7Fe83f45e0f53651b3ED9650d2a2C67D8855e385
攻击者 3 (EOA) 0x7C9FC6E2B908e858F30c5c71a20273315Efd5cf8
攻击者 1 合约 0xd996073019c74b2fb94ead236e32032405bc027c
攻击者 2 合约 0x4148310fe4544e82f176570C6c7B649290a90E17
攻击者 3 合约 0x1b8A9F9F5a1d9cB1C28D9120F9c2bD073ccfAC04
MigrationTroveZap (mkUSD) 0xcC7218100da61441905e0c327749972e3CBee9EE
MigrationTroveZap (ULTRA) 0xC3eAf094e2586965244aB6534f6Dc69c6C16b5D5
mkUSD 合约 0x4591dbff62656e7859afe5e45f6f47d3669fbb28
新的 wstETH TroveManager 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
Borrower Operations (LST) 0x72c590349535AD52e6953744cb2A36B409542719
Prisma Emergency msig 0x7A28A80DcE1733944Db5dC50dc2c5147eC993C5A

事件收益

攻击者1 资金接收者 金额 哈希
0x2d413803a6eC3Cb1ed1a93BF90608f63b157507a 757.69 ETH 链接
0x57f7033F84894770F876bf64772E7EBA48990D65 1,500 ETH 链接
0x5d0064f3B54C8899Ab797445551058Be460C03C6 1,000 ETH 链接
攻击者2 资金接收者 金额 哈希
0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385 138.19 ETH 链接
攻击者3 资金接收者 金额 哈希
0x7C9FC6E2B908e858F30c5c71a20273315Efd5cf8 52.32 wstETH 链接

受影响的钱包

攻击者 1 | 计数: 11
地址 事件前抵押品 事件后抵押品 事件时间戳
0x56A201b872B50bBdEe0021ed4D1bb36359D291ED 1745.08 wstETH 463.18 wstETH 上午 11:25:11 +UTC
0x774bb9306df1cd921eb842b1388c78f75e6ef79f 172.18 wstETH 149.36 wstETH 上午 11:28:11 +UTC
0xcbfdffd7a2819a47fcd07dfa8bcb8a5deacc9ea8 824.6 wstETH 192.12 wstETH 上午 11:29:11 +UTC
0xc47fae56f3702737b69ed615950c01217ec5c7c8 40 wstETH 11.69 wstETH 上午 11:36:47 +UTC
0x3b15cec2d922ab0ef74688bcc1056461049f89cb 107.18 wstETH 18.89 wstETH 上午 11:43:23 +UTC
0x1b72bac3772050fdcaf468cce7e20deb3cb02d89 166.41 wstETH 47.49 wstETH 上午 11:45:47 +UTC
0x3b15cec2d922ab0ef74688bcc1056461049f89cb 18.89 wstETH 18.97 wstETH 上午 11:48:11 +UTC
0x16f570e93fdbc3a4865b7740deb052ee94d87e15 113.6 wstETH 32.4 wstETH 上午 11:53:47 +UTC
0xf9ca66ef84c773fab422562ab41b1ee8d4397418 47.3 wstETH 15.48 wstETH 上午 11:54:47 +UTC
0xc487370895f6e8f5b62d99bf1472c95a94073379 377.2 wstETH 95.6 wstETH 下午 12:07:47 +UTC
0x9fceded3a0c838d1e73e88dde466f197df379f70 356.28 wstETH 102.12 wstETH 下午 12:12:47 +UTC
攻击者 2 | 计数: 11
地址 事件前抵押品 事件后抵押品 事件时间戳
0x14b30b46ec4fa1a993806bd5dda4195c5a82353e 4.22 wstETH 1.21 wstETH 下午 12:42:11 +UTC
0x19562df3e7fd2ae7af4e6bd288b04c2c90405212 31.22 wstETH 9.15 wstETH 下午 12:46:35 +UTC
0x1b004189e64d5b2f71d5be554470e6c49e10123b 21.74 wstETH 5.98 wstETH 下午 12:46:59 +UTC
0x3b82ee6c15b212ed69d5795bcd957e136eaa4bff 13.02 wstETH 3.45 wstETH 下午 12:47:11 +UTC
0x409c6c5ec5c479673f4c09fb80d0f182fcff643e 3.8 wstETH 0.93 wstETH 下午 12:47:23 +UTC
0xc47fae56f3702737b69ed615950c01217ec5c7c8 11.69 wstETH 11.78 wstETH 下午 12:49:11 +UTC
0xf8d1c9ab49219f7acf7b1d84705e5aea3b8ce0aa 17.85 wstETH 17.93 wstETH [下午 12:4 地址 事件前抵押品 事件后抵押品 事件时间戳
--- --- --- ---
0xf8d1c9ab49219f7acf7b1d84705e5aea3b8ce0aa 70.3 wstETH 17.85 wstETH 12:49:35 PM +UTC
0x3b82ee6c15b212ed69d5795bcd957e136eaa4bff 3.45 wstETH 3.52 wstETH 12:50:23 PM +UTC
0x409c6c5ec5c479673f4c09fb80d0f182fcff643e 0.93 wstETH .99 wstETH 12:50:35 PM +UTC

需要采取的行动

拥有未平仓 Vault 的用户应前往撤销授权页面,并按照其中的说明进行操作。

后续步骤

Prisma 团队以及许多其他人正在继续调查并努力与攻击者沟通。

虽然 сейчас检索所有 Trove 所有者的资金是我们目前的主要重点,但在我们确定所有头寸都安全后,取消暂停协议将是下一步的一部分。

一旦制定出计划,将发布进一步的步骤。

致谢

感谢来自 HyperNative Labs 的 Dan,他是第一个直接与我们联系的人。

我们向 Llama RiskWavey 表示感谢,感谢他们在汇编信息和撰写本报告方面的宝贵帮助。他们的奉献精神和专业知识显着提高了我们分析的质量和深度。

我们非常感谢我们的朋友和贡献者加入我们的作战室,从我们响应的开始就提供他们坚定不移的支持和见解。 他们的合作和迅速行动对于应对这些挑战至关重要。

我们很高兴能依靠我们的历史安全合作伙伴 MixBytes 的支持和专业知识。

特别鸣谢 ZachXBT 的深入帮助。 事实证明,他的观察对于及时果断地解决问题是必不可少的。

感谢所有伸出援手提供帮助和协助的人。 我们感受到的来自社区的团结是一种不可思议的支持,将有助于应对下一个挑战。

资源

  • 原文链接: hackmd.io/@PrismaRisk/Po...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
PrismaRisk
PrismaRisk
江湖只有他的大名,没有他的介绍。