返回博客

损失约1130万美元:Multicall Router、Nostra | BlockSec Weekly

Code Auditing
2026年9月24日
阅读约 12 分钟
核心要点
  • 本报告涉及 2 起安全事件,涵盖 Ethereum 和 Starknet,总损失约 1130 万美元。两个数字均为事件发生时的估算值,Nostra Finance 表示其最终损失和可恢复金额仍未确定。

  • 在这两起事件中,授权或估值检查均已运行并返回成功,但其评估的输入却是错误的。一个路由器接受了由其自身嵌套调用引入的身份,而不是原始的外部调用者;而一个货币市场则接受了由过少独立来源支撑的聚合价格。

  • 这两起事件均不需要知名协议本身存在缺陷。故障出现在附加于成熟构建模块之上的自定义集成代码中,一个案例是 Safe 模块堆栈,另一个案例则是预言机适配器配置。

在过去一周(2026/09/14 - 2026/09/20),我们观察到 2 起安全事件,估计总损失约为 1130 万美元。

日期 事件 类型 估计损失
2026/09/15 Unknown Multicall Router 访问控制不当 ~$7.8M
2026/09/17 Nostra Finance 有缺陷的预言机配置 ~$3.5M

免费安全扫描

使用我们内部的自动化分析引擎进行快速安全检测。

免费扫描

本周焦点:Unknown Multicall Router

选取此事件的原因是,跨嵌套路由调用的一个细微调用者身份变化绕过了某个运行自定义模块的 Safe 钱包的授权机制,导致其发生大规模资产提取。

2026 年 9 月 15 日,一个名为 Yoink 的 MEV 机器人抢先执行了针对某 Safe 钱包的攻击尝试,该钱包通过自定义策略模块管理其资产,此次事件估计造成约 780 万美元的损失 [1]。请求通过一个 multicall 路由器到达这些模块,其中一个嵌套调用授权错误使得未受信任的指令能够传入模块链,而一个可重复使用的权限则为该未授权操作提供了额外支持。

背景

Safe 钱包可以启用 Safe 模块。一旦启用,该模块即可调用 execTransactionFromModule() 指示钱包执行操作而无需多签批准,因此启用的模块相当于对钱包资产的一项常设特权。受害的 Safe 钱包启用了两个策略组件:Gateway 模块和 LP 模块。

Gateway 模块定义了可重复使用的命令模板,每个模板描述受害 Safe 钱包被允许执行的一项操作,具体数值在执行时填入。它只接受来自其自身授权调用者列表中调用者的命令。每次执行还必须携带一个 Merkle 证明,该证明会与存储的 root 进行校验,以验证所调用的命令模板。部分模板指示钱包调用 LP 模块,该模块使用钱包资产执行 Uniswap v4 流动性操作。因此控制流会通过钱包本身返回,而不是直接从一个模块传递到下一个模块:

Authorized Caller
       |
       v
Gateway module -- verify(command, Merkle proof, root)
       |
       | execTransactionFromModule(...)
       v
Safe wallet context
       |
       v
   LP module --> mintPosition(...)

本次事件中的操作者并未直接调用 Gateway 模块。请求是通过一个 multicall 路由器到达的,该路由器代表操作者转发批量调用。由于路由器在转发合法请求时始终是直接调用者,因此 Gateway 模块的授权调用者列表中包含了该路由器本身。

通过这条路径,受害 Safe 钱包可以将 aEthrsETH(Aave 针对所供应 rsETH 发放的收据代币)存入某个 Uniswap v4 资金池,并将头寸 NFT 铸造回该钱包。任何持有 aEthrsETH 的人都可以通过 Aave 销毁该代币以提取相应的底层 rsETH

受害的 Safe 钱包还曾以该 Aave 抵押品进行借款。因此,Aave 会为其跟踪一个健康因子(即其抵押品价值与债务之比),并拒绝任何会导致该因子低于 1 的抵押品转移。

漏洞分析

位于 0x4f00...8ebC 的路由器未经过源代码验证。因此,以下分析依赖于其已部署的字节码、反编译后的逻辑、交易追踪以及一个公开的 fork 测试还原,而非权威的源码级别名称。

该路由器的调度逻辑接受一个目标地址,该地址既可以是其白名单中的地址,也可以是路由器自身的地址,然后针对当前调用的 msg.sender 检查该目标的授权调用者列表。没有任何机制在路由器对自身发起调用时保留原始外部调用者的身份。

当路由器调用自身时,内层调用会将路由器视为 msg.sender。授权辅助函数在自我目标(self-target)的情况下会接受路由器,否则则检查当前 msg.sender 是否出现在下一个目标的授权调用者列表中。因此,一个指向 Gateway 模块的内层调用会被评估为来自已获授权的路由器,而不是来自外部调用者。这使得来自不受信任来源的指令能够通过这条嵌套路径满足 Gateway 的调用者授权。

第二个缺陷存在于证明校验本身。该证明验证了命令模板,但没有任何检查将随之提供的运行时参数进行绑定。因此,一个为早期合法命令发出的有效证明,在其具体执行数值被更改后依然可用。被重复使用的证明提供了一个可用的权限,但正是这个嵌套授权绕过让未受信任的调用者得以首先到达 Gateway 模块。

攻击分析

一个此前针对同一命令模板发出的 Merkle 证明,在使用不同运行时数值的情况下依然可用。这一特性本身并不能独立绕过 Gateway 的调用者授权,但在嵌套路由路径满足该授权检查之后,它提供了一个可用的权限。

以下分析基于交易 0x0e7680...a8705

在成功交易之前,最初的攻击者部署了一个攻击合约、一个由攻击者控制的 PAT 代币,以及一个稍后将用于执行 PAT 兑换的第二个合约。

在下一个区块中,攻击者调用 prepare() 创建并初始化了一个 PAT/aEthrsETH Uniswap v4 资金池。

Yoink MEV 机器人检测到了这个即将发生的攻击,并通过调用已准备好的攻击合约抢先执行,从而领先于最初的攻击者。产生的调用进入路由器,导致路由器调用自身,然后以路由器作为 msg.sender 到达 Gateway 模块。由于 Gateway 是一个已启用的模块,因此可以让受害 Safe 钱包在无需多签批准的情况下执行所提供的操作。

该指令导致受害 Safe 钱包在价格区间 [10, 20] 内,将大约 2,900 个 aEthrsETH 作为流动性提供给由攻击者控制的 PAT/aEthrsETH 资金池。该交易还将相应的 Uniswap v4 头寸 NFT 铸造给了该钱包,使得该操作看起来处于预期的流动性流程之内。这并未取走钱包的全部 aEthrsETH 余额:该数额被设定了上限,以确保 Aave 的健康因子检查仍能通过,使钱包的健康因子保持在 1.001182484056805114

随后,攻击合约通过第二个合约,将攻击者控制的 PAT 兑换为几乎全部已存入的 aEthrsETH。它通过 Aave 销毁了获得的收据代币,并提取了相应数量的 rsETH。在到达 Yoink 机器人的约 2,900 个 rsETH 中,约 2,882.37 个 rsETH 转到了其利润接收地址,而约 17.63 个 rsETH 被兑换为 ETH,产生的 ETH 几乎全部支付给了区块构建者(block builder)。

结论

根本原因在于附加于单个 Safe 钱包的自定义基础设施中的一个授权缺陷,并因一个未绑定全部执行参数的权限而加剧。此问题不应归咎于 Safe、Aave、Uniswap v4 或 Kelp 的核心合约。

代表他人转发调用的组件应根据原始外部调用者来判定授权,而不是根据调用链在传递过程中所获取的身份,并且该组件不应能够作为自身的目标被调用。同样,权限也应绑定该操作将执行时所使用的具体数值,而不仅仅是该操作所属的模板。

开始使用 Phalcon Explorer

深入了解交易,做出明智决策

免费试用

本周其他事件

Nostra Finance

2026 年 9 月 17 日,Nostra 在 Starknet 上的货币市场遭到攻击,攻击者通过操纵 NSTR 预言机价格使其虚高,从而利用被高估的抵押品借出约 350 万美元的资产。根本原因在于其预言机集成配置接受的定价来源数量过少,使得一个被操纵的薄流动性资金池报价能够对聚合价格产生实质性影响。Nostra 暂停了其市场 [2],而 Pragma 报告称攻击者的地址已被冻结,恢复工作正在进行中 [3]。最终损失金额及潜在的资金追回情况尚不明确。

背景

Nostra 在 Starknet 上运营着一个货币市场,用户可以在其中提供受支持的抵押品,并根据抵押品的预言机估值借出其他资产。

Nostra 通过其自有的价格喂价合约获取 NSTR 定价,该合约委托给一个主预言机合约,由后者从 Pragma(一个在 Starknet 上发布聚合价格的预言机)读取数据。发布者以命名来源(包括 AVNU 和 GECKOTERMINAL)向 Pragma 提交观测数据,其文档所述的 NSTR 配置描述了对其中三个来源取中位数 [4][5]。每个预言机响应都包含价格、小数精度、时间戳以及贡献来源数量 [6]。主预言机合约存储了 MinAggregatedSources,即一个可配置的最小贡献来源数量。

已部署的聚合实现并未被直接读取。尽管如此,两个独立的证据都指向同一个结论:Pragma 的开源代码在条目数量为偶数时,返回的是中间两个条目的平均值 [6],而本次事件中观察到的 MEDIAN 响应恰好等于其两个贡献观测值的算术平均值。

这些来源背后的数字来自市场本身。GECKOTERMINAL 的观测数据可以从链上资金池中推导得出,而 Starknet 上这样的一个场所就是 Ekubo,一个使用集中流动性的去中心化交易所,类似于 Uniswap v3。流动性提供者将资产放置在选定的价格区间内,兑换操作会使资金池价格在活跃区间内移动,而没有活跃流动性的空隙可能会将放置在明显不同价格上的头寸相互隔开。

Nostra 使用通过这条预言机路径获取的 NSTR 价格来评估已存入的抵押品,并计算该账户的借款能力。

漏洞分析

Nostra 的货币市场从 0x6838...5bf0 读取 NSTR 价格,该合约在其文档中被列为 NSTR 价格喂价源 [7]。该合约委托给其指定的主预言机 0x7b05...f0ab,而后者的 MinAggregatedSources 被配置为 1。Pragma 建议至少使用三个定价来源,并在事件发生后报告称,若强制执行三个来源的最低要求,本次接受的响应将被拒绝 [3]。

因此,一个包含两个有效观测值的响应超过了所配置的阈值。由于对两个观测值的 MEDIAN 计算最终等于其算术平均值,即使另一个观测值仍接近当时的市场价格,一个极端报价也足以对结果产生显著扭曲。

这是一个集成配置上的薄弱环节,而非小数换算或中位数计算实现方面的错误。Pragma 在两项计算中均未发现缺陷 [3]。来源数量阈值设置过低,使得一个多样性不足的输入集合所产生的、计算本身正确的输出,被用于决定抵押品价值和借款能力。

攻击分析

该攻击依赖于一个新创建、资金投入极少的集中流动性资金池所具有的可操纵性。现有证据表明,攻击者对该资金池的初始注入及其反复操作,可能影响了被用作 GECKOTERMINAL 观测数据来源的那个资金池,尽管具体的资金池选择因果关系尚未确定。

以下分析基于交易 0x2460fd...cdf00e

攻击者首先创建了一个 Ekubo 的 NSTR/SolvBTC 资金池,并在一个较低、非活跃的价格区间内以单边流动性的方式投入了 1.5 个 SolvBTC。随后,攻击者在接近正常市场价格附近添加了约 1,900 个 NSTR 和 0.0001514751 个 SolvBTC,并在该资金池中反复进行兑换操作。

接着,攻击者在一个远高于正常价格的狭窄区间内,以单边流动性的方式放置了 190 个 NSTR。在移除了接近正常市场价格的流动性之后,攻击者在该高价头寸之前留下了一个空流动性缺口。

一笔仅包含 0.00000001 个 SolvBTC 的兑换跨越了这个空缺区间,将资金池价格推至 tick -6645400,即该高价头寸的边界处。随后,该被操纵的资金池价值被作为一个 GECKOTERMINAL NSTR/USD 观测值提交,数值为 $99.02439975。

另一个贡献观测值以 AVNU 名义提交,将 NSTR 估值为 $0.00596118。该响应中未出现第三个已配置来源的观测值,因此只有这两个数值参与了聚合计算 [4]。

在只有两个数值的情况下,MEDIAN 响应即为这两者的算术平均值,约为每 NSTR $49.51518046。Nostra 接受了这一估值结果,并将攻击者的 NSTR 存款视为足以支持大额借款的抵押品。

在首次识别到的资金提取操作中,攻击者使用另一个持有 NSTR 抵押品的账户,按照被虚高的估值借出了约 939.386010 个 ETH [4]。Nostra 报告称,完整的借款流程还涉及 STRKUSDCUSDTWBTCDAIv1,借出资产的总价值约为 350 万美元 [2]。

结论

此次事件的根本原因在于 Nostra 集成中预言机来源阈值设置不足,而非 Pragma 在小数处理或聚合计算方面存在错误。一个仅有两个来源的响应依然被视为有效,即便其中一个观测值来自一个极易被操纵的资金池。

Nostra 应强制要求至少三个贡献定价来源作为最低标准,并在使用价格进行抵押品估值或借款计算之前,拒绝任何来源数量低于该阈值的预言机响应。抵押品资格及风险敞口限额也应反映出可用的市场流动性,以及操纵每种资产底层价格来源所需的深度。

开始使用 Phalcon Security

发现每一个威胁,提示重要信息,并拦截攻击。

免费试用

参考资料

[1] https://x.com/Phalcon_xyz/status/2099741447776096270

[2] https://x.com/nostrafinance/status/2100577538053493076

[3] https://www.pragma.build/updates/nostra-nstr-incident

[4] https://x.com/Phalcon_xyz/status/2100818035082952751

[5] https://www.pragma.build/asset/NSTR-USD?network=mainnet

[6] https://github.com/Astraly-Labs/pragma-oracle

[7] https://docs.nostra.finance/lend-and-borrow/deployed-contracts/money-market-mainnet

关于 BlockSec

BlockSec 是一家全栈区块链安全与加密合规服务提供商。我们打造的产品和服务能够帮助客户进行代码审计(涵盖智能合约、区块链及钱包)、实时拦截攻击、分析安全事件、追踪非法资金,并履行反洗钱/反恐融资(AML/CFT)义务,覆盖协议与平台的整个生命周期。

BlockSec 已在多个顶级会议上发表过区块链安全相关论文,披露过多个 DeFi 应用的零日攻击,成功拦截了多次黑客攻击并挽回超过 2000 万美元的损失,并为数十亿美元的加密资产提供了安全保障。

Web3 领域最佳安全审计机构

在上线前验证设计、代码与业务逻辑

订阅最新动态
~3.2亿美元损失:Liquid Network、Symbiosis 遭利用攻击 | BlockSec
Security Insights

~3.2亿美元损失:Liquid Network、Symbiosis 遭利用攻击 | BlockSec

本报告覆盖2026/09/07-09/13,分析两起共损失约3.2亿美元的安全事件,含此前未覆盖的Liquid Network于09/06遭利用事件。较大事件中,Elements的rangeproof验证缓存因字段拼接无分隔符导致验证结果错配,攻击者伪造4000枚无支撑L-BTC并几乎全部兑出。Symbiosis跨链桥比特币路线因手续费未做负值校验,330聪存款铸造出46,116,860,184.27388234 syBTC,流动性池仅存11.26 syBTC,致约970万美元损失(约9.97 BTC)。

约940万美元损失:Injective、Aquifer遭利用攻击 | BlockSec Weekly
Security Insights

约940万美元损失:Injective、Aquifer遭利用攻击 | BlockSec Weekly

过去一周(2026/08/31-2026/09/06),Injective、Solana、Ethereum和Flow EVM上发生四起安全事件,损失约940万美元。最大的是Injective漏洞,保险基金标识符与二元期权市场标识符冲突,结算路径未比较其面额,损失约480万美元;Solana上的Aquifer因交换路径调用未验证的调用者提供的Token Program,损失约247万美元;Ethereum上的Notional Finance V1因未检查的uint128转换将债务估值为零,损失约173万美元。Flow EVM上的Ankr FLOW因质押入口跳过暂停保护并按过时比率铸币,损失约41万美元。

超越智能合约:Web3中的域名与DNS运营安全
Security Insights

超越智能合约:Web3中的域名与DNS运营安全

合约审计只审合约本身。我们对DefiLlama TVL前100协议背后的100个域名进行了8项基于SEAL的DNS和注册商检查,共800项检查,只有一个域名全部通过。以下是大多数项目缺失的四项关键控制措施,以及它们在用户入口处为何至关重要。

Web3 最佳安全审计方

在上线之前验证设计、代码与业务逻辑,对标业内最高安全标准。

BlockSec 审计