Web3 安全警示丨Restaking 大热背后的风险:Prisma Finance 攻击事件分析

2024 年 3 月 28 日,Prisma Finance 遭遇攻击,目前累计亏损约 1100 万美元。攻击发生后,Prisma Finance 紧急暂停了项目,并告知用户赶紧取消委托授权(https://twitter.com/PrismaFi/status/1773371030129524957)。

1711807819540-3332bbaf-4c41-4e0e-8154-1acb7cc79234.png

攻击简述

Prisma Finance 是一个非托管、去中心化的,以抵押以太坊 LST(流动性质押代币)铸造稳定币的项目。比如用户可以通过抵押 wstETH 来铸造 mkUSD,这个过程可以创建一个 trove,trove 可以理解为是一个记录指定 borrower 的抵押借贷情况的宝库,这个宝库有一个 trove manager,用来管理宝库的抵押物以及借贷币(铸造的稳定币)。

本次的漏洞合约是 MigrateTroveZap 合约,该合约的主要功能是将用户的抵押物从一个 trove manager 迁移到另一个 trove manager。因此创建 trove 的 borrower 就可能会授权 MigrateTroveZap 合约对其 trove 进行操作。然而 MigrateTroveZap 合约中的「 onFlashloan 」函数缺乏输入验证,从而允许攻击者通过 MigrateTroveZap 合约操作其他 borrower 的 trove,将其他 borrower 的 trove 中的抵押品数量变少,但是债务不变,从而盗取其他 borrower 的抵押品。

攻击中涉及的关键地址

本次攻击涉及到多笔交易,我们仅以下面这比交易为例来对攻击进行分析。

攻击交易:https://etherscan.io/tx/0xe15fa959627871845f2f5bbfbd7529e6d2aff20ab14ece743f11641700bd7188

攻击 EOA:

0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202

攻击者(合约):

0xd996073019c74b2fb94ead236e32032405bc027c

受害者(Prisma Finance TroveManager):

0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6

漏洞合约(Prisma Finance MigrateTroveZap):

0xcc7218100da61441905e0c327749972e3cbee9ee

一个被利用的 borrower,简称 BorrowerA:

0xcbfdffd7a2819a47fcd07dfa8bcb8a5deacc9ea8

稳定币 mkUSD:

0x4591dbff62656e7859afe5e45f6f47d3669fbb28

质押物 wstETH:

0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0

BorrowerOperations 合约:

0x72c590349535ad52e6953744cb2a36b409542719

攻击流程分析

1. 攻击准备

攻击者观测 borrower 借贷情况,寻找抵押率较高的 borrower,在这比攻击交易中,找到的 borrower 为 BorrowerA。

攻击者获取 BorrowerA 在 TroveManager 中的 collateralToken(wstETH)和 debtToken(mkUSD)的数量,分别为「 824,599,953,913,164,625,273 」、「 598,174,188,906,400,741,697,930 」,在攻击者发起攻击时,wstETH 的价格大概为 $4155,大概估计一下抵押率为 570%,远远超过了最小抵押率 MCR 110%。这给后续攻击创造了条件。

2. 攻击实施

攻击实施阶段主要是攻击者通过 mkUSD 的闪电贷服务,调用到漏洞合约 MigrateTroveZap 的「 onFlashLoan 」函数,「 onFlashLoan 」函数可以对攻击者指定的 borrower 的 trove 进行置换,所谓置换即是先关闭这个 trove,再给 borrower 开启一个新的 trove。这个功能本来是用来将抵押物迁移到不同的 trove manager。然而这个功能存在漏洞,一是它没有校验新开的 trove 是否和之前的 trove 具有同样数量的抵押物,二是通过 mkUSD 的闪电贷服务,攻击者可以操控别人的 trove。具体的攻击步骤如下:

1、利用 mkUSD 的闪电贷服务调用到漏洞合约 MigrateTroveZap 的「 onFlashLoan 」函数,并在此时传入上述观测好的受害者 BorrowerA 的地址以及准备新开的 trove 的抵押品数量。攻击者调用 mkUSD 的「 flashLoan 」函数进行闪电贷,借出 mkUSD 给 MigrateTroveZap(MigrateTroveZap 合约用来自动将同样的抵押物迁移到不同的 trove manager),并在「 data 」参数中指定了后续操作需要用到的 BorrowerA 的地址、TroveManager 的地址、创建 trove 时抵押的 wstETH 的数量,具体传入的参数如下所示:

scale70

mkUSD.flashLoan:

scale70

在「 flashLoan 」函数中,首先会给 MigrateTroveZap 铸造「 598,174,188,906,400,741,697,930 」这么多 mkUSD,然后调用 MigrateTroveZap 的回调函数「 onFlashLoan 」,问题就出在了这个回调函数中。

2、在 MigrateTroveZap 的「 onFlashLoan 」函数中对 BorrowerA 的 trove 进行更换,之所以 MigrateTroveZap 能操作 BorrowerA 的 trove,是因为 BorrowerA 对 MigrateTroveZap 进行了委托授权。原本 BorrowerA 的 trove 抵押率比较高,但是抵押率比较高的 trove 被关闭掉,取而代之的是一个债务一样,但是抵押率更低的 trove,这个操作能够成功是因为更换 trove 时并没有校验新旧 trove 的抵押物数量是否一致,最终多余的抵押品数量会被留在 MigrateTroveZap 中。

详细过程如下:

在 MigrateTroveZap 的「 onFlashLoan 」函数中,会将指定 account 的抵押物从 troveManagerFrom 迁移到 troveManagerTo,在本次调用中,从攻击者传入的「 data 」参数中解析出来,这两个参数均指定为了 TroveManager 的地址。

MigrateTroveZap.onFlashLoan:

scale70

攻击者指定的 account 是 BorrowerA,因此首先会调用 BorrowerOperations 的「 closeTrove 」函数将 BorrowerA 的 trove 关闭掉,关闭之前会通过 modifier「 callerOrDelegated 」检查 BorrowerA 是否授权调用发起者(在这里是 MigrateTroveZap)代理它进行关闭 trove 的操作。由于 BorrowerA 确实授权了 MigrateTroveZap,因此判断通过,并且此时并不处于 recovery mode,因此 BorrowerOperations 最终调用 TroveManager 的「 closeTrove 」函数关闭 trove,在这个过程中,将 BorrowerA 的抵押品 wstETH(数量为「 824,599,953,913,164,625,273 」)转给 MigrateTroveZap。随后 burn 掉 MigrateTroveZap 的 mkUSD,数量为「 597,974,188,906,400,741,697,930 」。

BorrowerOperations.closeTrove:

scale70

紧接着 BorrowerOperations 的「 openTrove 」函数被调用,此时传入的参数「 _collateralAmount 」为攻击者在「 data 」参数中指定的「 192,125,967,324,963,177,654 」,而「 _debtAmount 」为攻击者向 mkUSD 合约闪电贷的数量加上闪电贷的手续费,数值为「 598,712,545,676,416,502,365,458 」。经过计算,现在并不处于 recovery mode,因此最终用来计算抵押率的 debt 的数量「 compositeDebt 」为「 _debtAmount 」+ debt borrowing 费 + debt gas 补偿,具体数值为「 598,912,545,682,977,901,520,496 」,根据「 _collateralAmount 」、「 _debtAmount 」和价格计算出来的 ICR(Individual Collateral Rate) 约为 133%,大于 MCR( 最小抵押率 )110%,符合创建 trove 的条件。随后 MigrateTroveZap 给 TroveManager 转移「 _collateralAmount 」数量的 wstETH,MigrateTroveZap 拿到给其铸造的「 _debtAmount 」数量的 mkUSD。这番操作相当于攻击者利用 MigrateTroveZap 合约,将 BorrowerA 本来有很多抵押品的 trove,换成了抵押品较少的 trove,而攻击者想要盗取的,正是这一部分抵押品差额。

BorrowerOperations.openTrove:

scale70

3、回调结束以后,回到 mkUSD 的 flashLoan 函数。此时 MigrateTroveZap 持有的 mkUSD 的数量正好比需要偿还的 mkUSD 的数量多一些,通过 burn 掉 MigrateTroveZap 的 mkUSD 成功偿还了闪电贷的债务。至此,MigrateTroveZap 相当于额外获得了约 632 个 wstETH。接下来攻击者就开始想办法把这 632 个 wstETH 给套到自己手上了。

3. 收割赃款

收割赃款的步骤主要是攻击者将#攻击实施#步骤中盗取的留在 MigrateTroveZap 合约中的 wstETH 提取出来。攻击者依然是利用 MigrateTroveZap 合约的漏洞。这一次攻击者先自己开了一个抵押率较低的 trove,然后通过 mkUSD 的闪电贷服务进入到漏洞合约 MigrateTroveZap 的「 onFlashLoan 」函数,对自己的 trove 进行更换。

相较于#攻击实施#阶段对 BorrowerA 的 trove 的更换,不同之处在于,攻击者对自己 trove 的更换,是要从低抵押率的 trove 更换为高抵押率的 trove,而用到的抵押物正是 MigrateTroveZap 中多出来的 wstETH。之所以能用到 MigrateTroveZap 的 wstETH,是因为攻击者也授权 MigrateTroveZap 对其 trove 进行管理,那么在更换 trove 时,抵押物都是在 TroveManager 和 MigrateTroveZap 之间流转。所以在开一个新的 trove 时,如果用到的抵押物数量增多,就会直接扣除 MigrateTroveZap 中的抵押品数量。

最终攻击者的 trove 在更换之后拥有了更多的抵押物,攻击者就可以自己发起关闭 trove 的调用,将抵押物提取出来,从而将盗取的抵押物收入囊中。

详细过程如下:

1、攻击者从 Balancer 中闪电贷出 1 个 wstETH,从而调用到攻击者的「 receiveFlashLoan 」函数。

2、在「 receiveFlashLoan 」函数中,攻击者首先授权 BorrowerOperations 使用其 wstETH,然后再授予 MigrateTroveZap 代理权。

3、接着攻击者调用 BorrowerOperations 的「 openTrove 」函数给自己创建一个 trove,使用闪电贷出的 1 个 wstETH 进行抵押,借 2000 个 mkUSD,此时的抵押率大约为 188%。这是攻击者为了后续操作做的一个准备。传入的参数详细信息如下:

scale70

4、攻击者再次调用 mkUSD 合约的 flashLoan 函数进行闪电贷,这一次是借 2000 个 mkUSD 给 MigrateTroveZap,跟#攻击实施#阶段类似,给 MigrateTroveZap 铸造了 2000 个 mkUSD,并触发了 MigrateTroveZap 的回调函数「 onFlashLoan 」。这一次攻击者传入的「 data 」参数如下,攻击者指定的想要迁移的 trove 是攻击者上一步创建的 trove。

scale70

5、在函数「 onFlashLoan 」里,同样先执行「 closeTrove 」函数,TroveManager 将 1 个 wstETH 转给 MigrateTroveZap,然后 burn 掉 MigrateTroveZap 约 2000 个 mkUSD。随后执行「 openTrove 」函数,这一次攻击者指定的「 _collateralAmount 」值为「 633,473,986,588,201,447,619 」,几乎是 MigrateTroveZap 中所有的 wstETH,当然其中包括了在#攻击实施#阶段套取的约 632 个 wstETH。此时「 _debtAmount 」具体值为「 2,001,800,000,000,000,000,000 」。抵押率大概为 1195%。trove 创建成功,MigrateTroveZap 将约 633 个 wstETH 转给 TroveManager,并给 MigrateTroveZap 铸造了约 2001 个 mkUSD。

6、回调结束以后,回到 mkUSD 的 flashLoan 函数。MigrateTroveZap 偿还闪电贷债务,持有的 mkUSD 被 burn 掉。

7、到这一步,攻击者自己创建的 trove 依然存在,不同的是,经过前面几步在 mkUSD 中的闪电贷,攻击者将自己的 trove 中抵押品的数量提升到了约 633 个 wstETH。

8、攻击者调用 BorrowerOperations 的「 closeTrove 」函数,关闭 trove,从 TroveManager 处拿到约 633 个 wstETH,并 burn 掉相应的 mkUSD 债务。

9、攻击者偿还在 Balancer 中借出的 1 个 wstETH。

至此,收割赃款结束,攻击者获利约 632 个 wstETH。

资金流追踪

本次攻击共涉及到三个 EOA,如下:

  • Exploiter 1: 0x7E39E3B3ff7ADef2613d5Cc49558EAB74B9a4202

  • Exploiter 2: 0x7Fe83f45e0f53651b3ED9650d2a2C67D8855e385

  • Exploiter 3: 0x7C9FC6E2B908e858F30c5c71a20273315Efd5cf8

Exploiter 2 和 Exploiter 3 共获利约 200 个 ETH,而另外的约 3200 个 ETH 则是被声称是白帽的 Exploiter 1 获取 (https://etherscan.io/tx/0xc2825fd6dd05e8ec9f271d63efdebd06e78296afc0813c65788790567916d209)。目前 Prisma Finance 项目方仍在与声称是白帽的 Exploiter 1 沟通资金退还事宜。

Exploiter 1 向项目方开出了以下条件:

  1. Prisma 团队需要进行一次在线新闻发布会;

  2. 团队所有成员都必须现场露面和出示身份证明;

  3. 向 Prisma 的所有用户、投资方和 Exploiter 1 表示道歉和感谢;

  4. 具体介绍本次事故里面的问题所在:智能合约审计方是谁,以及 Prisma 将来提高安全性的计划;

  5. Prisma 需要承认 Exploiter 1 在这起事件中没有任何责任,Exploiter 1 纯粹是在帮助 Prisma 修复问题;

  6. Prisma 需要在 12 小时内修改事后总结中所有具有指控性的措辞。

通过 ZAN 的 KYT 服务,我们可以看到,Exploiter 1 将资金转到了三个不同的地址上,最终这些资金一部分流入了 Tornado Cash 中。详细资金流转情况请查看链接:https://zan.top/kyt/controller/transaction?entity=0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202&ecosystem=ethereum

scale70

转入 Tornado Cash 资金流动情况

Exploiter 2 的资金流转情况:https://zan.top/kyt/controller/transaction?entity=0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385&ecosystem=ethereum

Exploiter 3 的资金流转情况:https://zan.top/kyt/controller/transaction/?entity=0x7C9FC6E2B908e858F30c5c71a20273315Efd5cf8&ecosystem=ethereum

安全建议

通过分析本次攻击事件,我们有如下建议:

  1. 「 委托授权要慎重 」。一是项目方需要仔细衡量项目中是否需要委托授权的逻辑,如果需要,那么一定要对相应操作进行严格的权限校验以及输入校验,防止攻击者利用该授权,传入不合法的参数,篡改项目中关键变量。二是委托授权应该有时间限制,长期的授权,容易被用户忽略,却被攻击者利用。

  2. 「 项目设置暂停机制 」。建议项目方在设计项目逻辑时,建立完善的暂停机制,以应对突发的意外事件,及时止损。

本文由 ZAN Team 的 Cara 撰写,作者个人 X 账号@Cara6289。

WEEX唯客是一家安全易用的加密货币交易所,由新加坡顶级区块链投资机构斥资1亿美元打造,注册用户超百万,日均交易额超15亿美元,已获得美国MSB、加拿大MSB、SVGFSA金融牌照。

WEEX唯客平台所有数据皆于海外数据库严格保存,服务器多地部署和备份,并采用满足银行级安全需求的亚马逊AWS及高速高稳定性的香港CDN,为全球用户提供最安全、最专业、最具隐私性的交易服务。

WEEX唯客是全球交易深度最好的合约交易所之一,位居CMC交易所流动性排名前五,订单厚度、价差领先同行,微秒级撮合,零滑点、零插针,最大程度降低交易成本及流动性风险,让用户面对极端行情也能丝滑成交。

在WEEX唯客,用户不仅能享受行业最低的交易手续费(Taker 0手续费,Maker 0.06%),还可零门槛一键跟随专业交易员操作,复制高手的交易策略,平台严格甄选数5,000多名优秀交易员供用户挑选。

为保障用户资金安全,WEEX唯客设立了1,000 BTC投资者保护基金,以在非用户自身原因的情况下有效补偿用户资金出现的意外损失,并公示资金池热钱包地址,让用户交易安心无忧。

WEEX官网:weex.com

你也可以在 CMCCoingecko非小号X (Twitter)中文 X (Twitter)YoutubeFacebookLinkedin微博 上关注我们,第一时间获取更多投资资讯和空投福利。

在线咨询

WEEX华语社群:https://t.me/weex_group

WEEX英文社群:https://t.me/Weex_Global

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情

    暂无评论内容

随即推荐
企业级容器多主机ELK部署-H5资源网

企业级容器多主机ELK部署

课程介绍 Docker企业级容器多主机ELK部署实战课程,可以快速帮助同学们进行实战演练,将Docker容器技术全面的融入到实际工作中。课程涉及的Docker技术包括了Docker的快速实现,Docker核心容器与...
2年前
04412
电脑xp激活怎么操作-H5资源网

电脑xp激活怎么操作

现在还是有很多小伙伴还在继续使用着windows xp系统.由于xp原版系统是没有经过优化处理,所以比较稳定,深受广大xp系统小伙伴的欢迎.下面来说说电脑xp激活操作教程。
1年前
01027
安装系统步骤有那些-H5资源网

安装系统步骤有那些

电脑的系统是必须要有的一个东西,如果电脑系统出现了问题,那么电脑就不能正常的运行了,所以在电脑系统出现问题的时候,需要对系统进行安装,那么安装系统步骤有那些呢?
1年前
04910
联想重装系统步骤是什么-H5资源网

联想重装系统步骤是什么

工具/原料: 系统版本:win10 品牌型号:联想yoga13 软件版本:电脑店装机工具
1年前
0299
ECshop仿顺丰优选综合购物商城平台源码旗舰版+团购+触屏版+微信支付-H5资源网

ECshop仿顺丰优选综合购物商城平台源码旗舰版+团购+触屏版+微信支付

ECshop仿顺丰优选综合购物商城平台源码旗舰版+团购+触屏版+微信支付 一款时尚简洁的综合通用类模板,整站宽屏,头部含多个下拉菜单、购物车及搜索功能,底部可添加二维码,方便扫描;首页商品楼...
2年前
04711
《消逝的光芒2:人与仁之战》中文版-H5资源网

《消逝的光芒2:人与仁之战》中文版

游戏介绍  病毒获胜了,文明退回了黑暗时代。作为人类最后的堡垒之一,“都市”正处在崩溃的边缘。运用你的敏捷和战斗技巧活下去,并重塑这个世界。你的选择意义重大。 
1年前
03015
emlog pro获取文章第一张图片为封面方法-H5资源网

emlog pro获取文章第一张图片为封面方法

很多emlog模板开发者在制作主题的时候多少都需要在首页展示文章图片或图文形式
2年前
0378

法国 StarTowerChain 团队的 RIP 技术:颠覆传统互联网

在科技发展日新月异的当今时代,每一项创新技术的诞生都有可能引发行业的变革。2024 年,法国 StarTower 技术团队公布的一项名为“RIP 资源交互证明(Resource Interaction Proof)”的技术,正...
2个月前
0347
《酷极轮滑》v1.23.00中文版-H5资源网

《酷极轮滑》v1.23.00中文版

游戏介绍 酷极轮滑是一款集热血战斗、流畅动作和精妙机制于一体的第三人称动作射击游戏,通过相辅相成的多元游戏元素,打造极富挑战、独一无二、令人心潮澎湃的射击游戏体验。
2年前
0448
解谜闯关游戏 动物园冒险-H5资源网

解谜闯关游戏 动物园冒险

游戏介绍  动物园冒险一款脑洞大开的解谜闯关游戏。简单魔性的素描画风,脑洞逐渐大开的关卡,各种奇葩的解谜方式,让你防不胜防,免广告得提示。 
2年前
02612