一、Prisma Finance 被攻击事件交易分析
在这次 prisma finance 安全事件中,涉及的关键地址与合约如下:
- 攻击者 1:0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202(简记为 0x7e39)
- 攻击合约 1:0xd996073019c74b2fb94ead236e32032405bc027c(简记为 0xd996)
- 攻击者 2:0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
- 攻击合约 2:0x4148310fe4544e82f176570c6c7b649290a90e17
- 被攻击目标合约:0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
本次攻击共涉及 16 笔交易。为了更清楚地理解 Prisma Finance 被攻击的执行逻辑,下面以第一笔攻击交易为例进行拆解:
交易哈希:0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
从链上行为来看,整个攻击流程大致可以分为以下几个阶段。
1、先读取目标账户的抵押物与债务数据
攻击开始前,攻击者先读取地址 0x56a201b872b50bbdee0021ed4d1bb36359d291ed(简记为 0x56a2)在目标合约中的全部抵押物和债务信息。

查询结果如下:

数据显示,地址 0x56a2 在目标合约中的抵押物为 1,745 wstETH,总债务为 1,442,100 mkUSD。
2、利用 mkUSD 的 flashLoan 触发资产迁移流程
随后,攻击者 0x7e39 通过攻击合约 0xd996 调用 mkUSD 债务合约中的 flashLoan 函数。

其中,参数 receiver 被设置为 MigrateTroveZap,amount 则对应此前查询到的全部债务规模。

在 flashLoan 执行过程中,合约会继续调用 receiver,也就是 MigrateTroveZap 中的 onFlashLoan 函数。

在这一过程中,onFlashLoan 借助闪电贷先偿还原有全部债务,提取抵押物到 receiver,之后 receiver 再将一部分抵押物重新抵押,并生成新的债务。核心涉及两个步骤:
(1)closeTrove 函数:用于偿还债务,并将全部抵押物(1745.08 swtETH)从 troverManager 提取到 receiver,也就是 MigrateTroveZap 合约。

(2)openTrove 函数:由 receiver 将 463.18 wstETH 重新抵押到 troverManager 中,同时生成 1,443,598 mkUSD 债务。

从这一结果可以看出,flashLoan 执行结束后,receiver 中仍然保留了从 troverManager 提取出的部分抵押物,而这部分资产原本属于地址 0x56a2,数量约为 1745.08 - 463.18 = 1281.90 wstETH。
3、再借入 1 wstETH,构造新的抵押与债务头寸
接下来,攻击者 0x7e39 通过攻击合约 0xd996 从 Balancer 再次以闪电贷方式借入 1 wstETH。

随后,攻击者将这 1 wstETH 作为抵押借出 2000 mkUSD,加上 fee 后,总负债达到 2200 mkUSD。

4、再次调用 flashLoan,将他人抵押物并入攻击合约路径
然后,攻击者再次调用 mkUSD 债务合约中的 flashLoan 函数。与前一轮操作类似,此时 receiver 依旧设置为 MigrateTroveZap,amount 则是上一笔 1 wstETH 抵押后形成的全部债务,即 2000 mkUSD。执行 flashLoan 后,会继续触发 receiver 中的 onFlashLoan,再进入 closeTrove 和 openTrove 的流程。


这一步与前面不同的地方在于,此次 closeTrove 和 openTrove 操作的 account,不再是前述地址 0x56a2,而是刚刚完成 1 wstETH 抵押的攻击合约 0xd996。
(1)closeTrove 函数:偿还债务后,将全部抵押物(1 swtETH)从 troverManager 提取到 receiver,也就是 MigrateTroveZap 合约。此时 receiver 中的抵押物总量变为 1281.90 + 1 = 1282.90 wstETH。

(2)openTrove 函数:由 receiver 将 1282.80 wstETH 几乎全部重新抵押到 troverManager 中,并生成 2001.8 mkUSD 债务。

需要注意的是,这笔新抵押中的 1281.80 wstETH,实际并不属于攻击合约 0xd996,而是来自前述地址 0x56a2。
5、最终提取抵押物,完成获利
最后,攻击者 0x7e39 通过攻击合约 0xd996 单独调用 closeTrove 函数,将已经抵押的 1282.80 wstETH 提取到攻击合约 0xd996 中。


在偿还闪电贷后,攻击者最终仍获得 1281.80 wstETH,按原文口径约为 2.30M USD。

二、Prisma Finance 漏洞分析:问题出在哪里
从 Prisma Finance 被攻击事件的完整路径来看,根本原因在于项目合约在逻辑设计和权限校验方面存在缺陷,进而让攻击者有机会获取其他账户地址的质押资产。
攻击者最终得到的 wstETH,本质上属于地址 0x56a2 存放在 troverManager 合约中的抵押物。其攻击方式是通过 mkUSD 合约中的 flashLoan 函数,配合自定义的 MigrateTroveZap 合约中 onFlashLoan 函数参数,利用 MigrateTroveZap 将相关资产转化为攻击合约名下的抵押物,随后再进一步提取出来。
换句话说,攻击者是借助 mkUSD 合约的 flashLoan 能力,以及 MigrateTroveZap 合约 onFlashLoan 的执行逻辑,操纵了其他账户地址的抵押、迁移和提取流程。


具体来看,这次智能合约漏洞主要体现在以下几个方面:
- flashLoan 函数对 receiver 地址缺少有效校验。由于 onFlashLoan 执行时,receiver 会接收到 account 的全部抵押物,因此 receiver 是否可信,本应受到更严格的限制和校验。
- onFlashLoan 函数对 account 地址缺少权限校验。closeTrove 与 openTrove 实际操作的是 account 对应的资产,所以 account 参数同样需要明确的权限控制。
- 数量参数与整体执行逻辑约束不足。除 receiver 和 account 这两个关键地址参数外,flashLoan 中的数量参数以及完整执行路径,也可能需要进一步增加边界检查与限制条件。
三、Prisma Finance 被攻击事件带来的安全启示
结合这次 Prisma Finance 安全事件,智能合约项目在设计、开发和上线前后,可以重点关注以下几个安全方向:
(1)强化关键业务流程的权限校验。在项目设计和开发阶段,应尽量保证业务逻辑完整且严谨,尤其是在涉及资产迁移、抵押、提取、债务处理等关键流程时,需要加强对调用者、调用函数、函数参数以及转账逻辑的权限验证,确保执行链路处于可控范围内。
(2)上线前进行独立审计与充分测试。项目正式上线前,应由专业第三方审计团队开展智能合约审计,并对关键模块进行充分的安全测试、复核与异常场景验证。
(3)持续关注协议权限边界与资产风险敞口。链上安全事件通常具有较强的复杂性和组合性,项目方与用户在关注协议功能的同时,也应持续重视合约权限边界、参数控制以及资产风险暴露问题。
需要说明的是,本文内容主要用于还原 Prisma Finance 被攻击事件的链上过程与漏洞逻辑,不构成任何投资建议。DeFi 协议、智能合约与链上资产本身存在技术与安全风险,参与前仍需充分了解相关机制。
关于 SharkTeam
SharkTeam 的愿景是保护 Web3 世界的安全。团队由来自全球的资深安全专业人士和高级研究人员组成,具备区块链与智能合约底层理论方面的经验,提供风险识别与阻断、智能合约审计、KYT/AML、链上分析等服务,并打造了链上智能风险识别与阻断平台 ChainAegis,用于应对 Web3 世界中的高级持续性威胁(Advanced Persistent Threat,APT)。据原文介绍,其已与 Web3 生态多个领域的关键参与者建立长期合作关系,包括 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、Collab.Land 等。

















