🍀 Spring Appointment, Lucky Draw Gifts! Growth Value Issue 1️⃣7️⃣ Spring Lucky Draw Carnival Begins!
Seize Spring Luck! 👉 https://www.gate.com/activities/pointprize?now_period=17
🌟 How to Participate?
1️⃣ Enter [Plaza] personal homepage, click the points icon next to your avatar to enter [Community Center]
2️⃣ Complete plaza or hot chat tasks like posting, commenting, liking, and speaking to earn growth value
🎁 Every 300 points can draw once, 10g gold bars, Gate Red Bull gift boxes, VIP experience cards and more great prizes await you!
Details 👉 https://www.gate.com/announcements/article/
深度解剖:USR脱锚后的Morpho金库闪电贷NAV操纵攻击
2026 年 3 月 22 日,Resolv 协议遭遇私钥泄露,攻击者凭空铸造了 8000 万枚无抵押 USR,导致 USR 从 $1 暴跌至 $0.025。
这场灾难的余波不仅仅停留在 USR 持有者身上,一群更聪明的人,在 Morpho 上执行了一场精密的金库 NAV 操纵攻击。
本文将一步步拆解这个攻击的底层逻辑。
一、先理解Morpho的两层架构
在聊攻击之前,你必须先理解 Morpho 的架构设计,否则后面完全看不懂。
Morpho 的世界分为两层:
底层:
Morpho Blue(也叫 Morpho Core)。 这是一个极简的、不可升级的借贷协议。它的设计哲学是"无许可"——任何人都可以创建借贷市场,任何人都可以存入、借出、清算。
每个市场由五个参数唯一确定:贷款资产、抵押品资产、清算线(LLTV)、预言机地址、利率模型。
市场之间完全隔离,一个市场出事不会波及其他市场。
上层:
MetaMorpho Vault(金库)。 这是一个 ERC-4626 标准的金库,相当于一个"基金产品"。
用户把 USDC 存进金库,金库管理员(Curator)负责把这些钱分配到不同的 Morpho Blue 市场里去放贷赚利息。
用户持有的是金库份额(shares),份额的价值随着利息累积而增长。
核心公式——每股净值(NAV / Price Per Share):每股净值 = totalAssets / totalSupply
totalAssets 是金库在所有市场里的供应头寸总和(包括已借出的部分,因为那些是"应收账款")。totalSupply 是金库发行的总份额数。利息累积时,totalAssets 增长但 totalSupply 不变,所以每股净值上升——这就是你赚到钱的原理。
二、supply(onBehalf) —— 任何人都能替金库存钱
这是整个攻击的第一个关键点。
在 Morpho Blue 里,supply() 函数有一个 onBehalf 参数。这个设计的本意是方便第三方代付——比如自动化策略合约可以替用户存钱。
但它是完全无许可的:任何人都可以指定任何地址作为 onBehalf,包括金库地址。
Morpho 官方文档明确警告:“Warning: Anyone can supply on behalf of the vault so the call to updateWithdrawQueue that expects a market to be empty can be griefed by a front-run.”
当你替金库 supply 了 1 万 USDC,金库在这个市场的 supply position 就增加了 1 万,totalAssets 也就增加了 1 万。但金库的总份额(totalSupply)没有变——因为没有人通过金库的 deposit() 函数存入新资金。
结果:每股净值被抬高了。
正常情况下,这等于给金库"捐钱"——你自掏腰包替所有股东增加了收益,傻子才这么做。但在特定条件下,这可以被利用。
三、Supply Cap = 0 ≠ 安全
USR 脱锚后,一些金库管理员紧急将 USR/USDC 市场的 Supply Cap 设为 0,意味着管理员不能再往这个市场投钱了。听起来问题解决了?
问题在于:Supply Cap 是金库层面的限制,不是 Morpho Blue 层面的限制。
金库管理员能控制的是金库自己的 _supplyMorpho() 内部函数。
但 supply(onBehalf=vault) 是直接跟 Morpho Blue Core 合约交互的,完全绕过了金库层面的一切逻辑:supply queue、supply cap、allocator 权限检查,通通不经过。
用一个比喻:金库管理员关了前门(Cap=0),但攻击者从 Morpho Core 的后门把钱直接塞了进来。
四、写死的预言机——坏账的隐身衣
这是第二个关键条件。
USR/USDC 市场的预言机被设置为固定 1:1。也就是说,无论 USR 在外部市场跌到多少,在 Morpho 的世界里,1 USR 永远等于 1 USDC。
为什么金库管理员会用固定预言机?因为 USR 是"稳定币",正常情况下价格波动很小。固定预言机可以避免短期流动性不足导致的"假清算"。
但当 USR 真的脱锚了,固定预言机就成了灾难——借款人用不值钱的 USR 做抵押借走了足额 USDC,协议却浑然不知。
Morpho 的坏账处理机制在这里完全失效了——V1.0 的实时反映和 V1.1 的均摊机制,前提都是协议能识别到坏账。
预言机写死了,就什么都识别不到。
五、攻击全流程——五步闭环
现在所有条件齐了。以下是在单笔交易内完成的原子操作:
六、为什么一定需要闪电贷?
这是最容易被忽略的问题。攻击的利润来源是"虚增 totalAssets 后按份额比例分配增值"。如果攻击者不存闪电贷,他持有 0% 的份额——就算把 totalAssets 抬高了天,增值全归其他股东,他自己一分钱拿不到。
七、谁亏了钱?
攻击者多拿走的 12,300 USDC 不是凭空出现的。这笔钱来自金库在其他健康市场的真实流动性。
金库赎回时,会按照 withdraw queue 的顺序从各个市场提取 USDC。USR 市场里的 USDC 已经被借光了,提不出钱。所以赎回的资金来自其他市场——比如 wETH/USDC、cbBTC/USDC 等正常运作的市场。
八、三层漏洞的叠加效应
这次攻击不是单一漏洞,而是三个设计问题的叠加:
结语
Morpho 的极简设计哲学——无许可、不可升级、最小治理——在大多数时候是优势。但这次事件表明,极简设计的代价是将更大的责任推给了上层参与者。
协议不做预言机验证,管理员就必须自己做好。协议不限制 supply(onBehalf),金库层面就需要额外的防护。
对于存款人而言,"选择正确的 Curator"比"选择 Morpho"本身更重要。协议是工具,工具是否安全取决于使用它的人。