作者:匿名(注 rekt 长期秉持匿名/去中心化的原则,文章通常不署单一个人作者姓名)
致谢:Sprunky, BeinCrypto, Nostra, Blocksec, CoinTelegraph, PeckShield, CertiK, BlockSec, AMLBot, GoPlus Security, Pragma, DBCrypto, DefiLlama, Vesu
原文链接:https://rekt.news/nostra-rekt
声明:本文为转载内容,读者可通过原文链接获得更多信息。如作者对转载形式有任何异议,请联系我们,我们将按照作者要求进行修改。转载仅用于信息分享,不构成任何投资建议,不代表吴说观点与立场。
八千三百零六。这大概就是在 11 分钟的时间窗口内,Nostra 自身的预言机将其平台原生代币在其借贷市场中价格放大的倍数。当天上午,第三方数据追踪机构估算 NSTR 的流通市值约为 550,000 美元(并非依据 Nostra 自身定价),然而一个账户却利用这一失真的报价,借出了价值约 350 万美元的 ETH、STRK、USDC、USDT、WBTC 和 DAI——这一数额已获 Nostra 官方确认。这里既没有闪电贷,也没有重入漏洞,仅仅是一个由攻击者注资的浅流动性池、一个疑似进入了 Pragma 价格管道的 GeckoTerminal 市场报价,以及一个并未剔除两者巨大价差反而将其与正常报价进行混合平均的预言机。根据一项独立复盘,为促成该笔借贷而质押的 NSTR,在正常市场中的公允价值仅约 421 美元——不折不扣的零钱,被包装成了合格的抵押品。Nostra 在其货币市场暂停后披露了该事件,并表示将随后发布事件分析报告(post-mortem)。此前,该协议就曾暴露过这种脆弱性:2025 年 3 月,因其预言机将另外两种代币的价值高估了约三倍,且官方承认缺乏备用数据源,平台暂停了针对这两种代币的借贷功能;尽管涉及不同的资产和机制,但根源同属预言机风险范畴。18 个月后,同样的风险以一种严重得多的形式再次卷土重来。那次最初的警告,究竟是被真正修复了,还是仅仅被束之高阁?
9 月 17 日,Nostra 披露了这起事件。该协议的官方 Twitter 账户表示,被操纵的 NSTR 预言机价格使一个账户得以利用虚高的抵押品借出了约 350 万美元,并宣布其货币市场已暂停运作,存款、借款、提款和清算均已不可用。Nostra 的声明发布于 PeckShield、CertiK 等安全追踪机构公开通报之前。然而,该声明并未阐明 Nostra 具体在何时检测到操纵、何时执行了暂停操作,抑或外部研究人员是否此前已通过私下渠道发现了相关交易。
公开的链上取证工作大约在 11 个小时后全面展开。PeckShield 转发了 Nostra 的声明,并披露了除整体数据外第一个关键信息:已有约 192 万美元被跨链转移至以太坊,具体明细为 234.57 枚 ETH 和 130 万枚 DAI。CertiK 在两小时内跟进,先是确认了价格操纵事实,18 分钟后公布了资金分布细节:约 155 万美元仍停留在 Starknet 合约中,另有 193 万美元已进入一个以太坊地址。BlockSec 的 Phalcon 分析线索梳理了早期警报未曾详述的底层机制:攻击者创建的 NSTR/SolvBTC 交易池、单边流动性、一笔剧烈拉升报价的小额交易,并将每一步操作与具体的交易哈希对应。独立研究员 Sprunky 随后扩展了复盘内容,解码了 Pragma 实际记录的价格条目——先是一个正常的 AVNU 报价,10 分 40 秒后紧接着是一个被污染的 GeckoTerminal 报价;其独立的详细计算显示,实际的 NSTR/ETH 比率与借贷实际采用的比率之间相差约 8,306 倍。截至次日上午,AMLBot 表示已追踪到攻击者的撤退路径:结合使用 Near Intents、CCTP 和 LayerZero OFT 将资金移出 Starknet,当时该 Starknet 地址仍滞留约 160 万美元。GoPlus Security 的复盘也在当天发布,其回溯范围比其他机构更为深入,直接追溯到了攻击者在 3 月和 8 月积累 NSTR 的操作,早于操纵所用交易池实际创建的时间数月之久。
Nostra 在公开取证梳理出全貌之前披露了该事件。相关 NSTR 的筹集比操纵行为早了数月,链上记录仅体现了这一点,并不能证明有人能够提前数月将一个外表普通的钱包标记为未来的攻击源。攻击者并不需要潜伏六个月而不被发现,他们只需要在选定动手的那一天,让一个自身构建的浅流动性池被借贷系统采纳为合格的抵押品定价源。那么,为什么 Nostra 的风控系统会把该交易池的价格视作有效?
折衷妥协的预言机
攻击者根本不需要攻破 Pragma 的智能合约。他们只需要向其喂入一个足够具有欺骗性的伪造数据,使得该数据与真实数据取平均后,依然能够得出一个足以用来套取借贷资金的高价。BlockSec 的 Phalcon 复盘通过三个步骤还原了整个过程:第一步,创建一个全新的 NSTR/SolvBTC 池,单边注入约 1.5 枚 SolvBTC 的流动性,其价格设定完全脱离该代币的实际交易区间;第二步,该池报告的流动性似乎影响了 GeckoTerminal 的交易池筛选行为,将这个新建立的浅流动性池纳入了 NSTR 的参考定价范畴;第三步,在操纵好的池内进行一笔小额买入,直接将其报价从不到一分钱推高至 99 美元以上。
新创建的池地址: 0x741af6efcc55165e89f7ef0b8ebad7e87efeaa8daa3b60dddd62d5dcacae69d
Pragma 的聚合机制本旨在降低单一被操纵的数据源占据主导地位的风险。Pragma 首先通过获取发布者提交数值的中位数来确定每个数据源的价格;随后由下游调用协议自行选择组合这些源价格的最终算法。其集成文档建议至少配置三个价格来源,并结合资产风险设置相应的时效性检查和阈值。然而当天上午,似乎仅有两个输入源提供了数据:一个来自 AVNU 的参考报价,约为 0.00596 美元;另一个是被操纵的 GeckoTerminal 报价,约为 99.02 美元。在缺失第三个数据源的情况下,系统对仅有的两个数值计算出了约 49.52 美元的中位数。在 Sprunky 的复盘中,该中位数值作为最终的聚合价格返回给了 Nostra 借贷市场,并被直接用于评估 NSTR 抵押品价值。Sprunky 追踪到该笔借款交易采用的 NSTR/ETH 抵押兑换率为 0.02032399,而预估的真实 NSTR/ETH 比率仅为 0.00000244689,即借贷发生时的价格虚高了 8,306 倍。这一比率与当天上午 ETH 的美元计价无关。
Pragma 在事件发生后的更新不仅证实了双数据源漏洞的存在。Pragma 表示,由于流动性匮乏和可用定价源有限,NSTR 此前已被列为高风险数据源,且 Pragma 曾向 Nostra 明确提示过这些风险。声明还透露,此前因缺乏流动性和防操纵考量,应 Nostra 的要求,Gate.io 被移除了 NSTR 数据源列表,导致该代币在事件发生前的数月内仅有极其有限的源覆盖。移除薄弱的数据源或许合乎逻辑,但问题在于后续环节:NSTR 作为一个高风险、数据源受限的资产,其两个可用价格依然计算出了抵押品估值,并被 Nostra 用于批准借出其他资产。Pragma 表示,若强制执行“至少三个数据源”的最低限制,该操纵结果本会被直接拒绝;Pragma 的复盘还指出,系统并未出现精度计算或中位数算法错误。换言之,聚合逻辑所产生的结果,完全契合其被配置的规则。
抵押品计算结果更显荒诞。根据 Sprunky 的复盘,质押借贷的约 70,686 枚 NSTR 真实市场公允价值仅约 421 美元,却支撑起了约 350 万美元的借贷规模——每 1 美元的实际抵押价值,借出了超过 8,000 美元的资产。该数据为独立推算结果,未经 Nostra 官方复核确认,但它解释了为何此次攻击自始至终无需投入多少真实的抵押资本。当天上午,NSTR 的预估流通市值约为 550,000 美元,这意味着被借出的资产价值是其整个流通市值的 6 倍以上;这一对比更多在于具象化说明问题严重性,而非作为偿付能力测试,毕竟市值本身并不等同于借贷上限。
公开记录表明了既成事实,却未说明深层原因:系统接受了两个价格输入之间的极端偏离,缺失第三个输入源未能阻断借贷报价的生成,而由此得出的 NSTR 抵押品估值足以授权数百万美元的债务借出。尚未被明确的是,为何没有任何有效的防护机制中途介入。公开信息目前依然无法确认 Nostra 针对 NSTR 的价格输入和抵押品估值究竟应用了何种风控策略(如果有的话),以及为何允许这一价格直接核准放款。Nostra 正在进行的代码审查及承诺发布的分析报告应当回答这一问题。或许系统的每个组件都完全按照设定的参数运行,而这恰恰暴露了配置层面的重大缺陷。如果一个协议可以简单地将 0.006 美元的报价与 99 美元的报价取平均值作为抵押品定价,那么被操纵的流动性池便不是漏洞的全部。更深层的失效,在于整套预言机架构从未校验过 49.52 美元这一数字是否具备经济层面的合理性。预言机没有对其经济合理性进行检验。当交易放行之后,又有谁在核查这解锁出的 350 万美元最终流向了何处?
六种资产,七笔借贷交易
BlockSec Phalcon 复盘中的核心交易在链上公开可见,关键哈希可供独立核验。以下是按顺序排列的完整链上记录:促成操纵的交易池创建、拉抬价格的交易、Pragma 记录的两笔预言机数据更新,以及随后的每一笔分资产借贷交易。
交易池创建(NSTR/SolvBTC 池,单边存入约 1.5 枚 SolvBTC 流动性): 0x741af6efcc55165e89f7ef0b8ebad7e87efeaa8daa3b60dddd62d5dcacae69d
价格拉抬交易(在浅流动性池内发生的一笔小额交易,将报告的 NSTR 报价推向约 99 美元): 0x772e73613ffbc845508377fc6ded1137f60ad730aecb2b7c18a2978a84a6ac1
AVNU 预言机记录:05:37 UTC 的 publish_data_entries 交易,解码为 NSTR 报价 0.00596118 美元: 0x1d33ab3d3ff72c82d7b1b6b317d28eff38abd03c0f084985c30b14859328b7f
GeckoTerminal 预言机记录:05:47 UTC 的 publish_data_entries 交易,解码为被操纵的 NSTR 报价 99.02439975 美元: 0x6bc9b41bce2b6c08639c16790af064efafa15890c1ebf8cc72df99a577a1cf1
借出 ETH(939.30 枚 ETH,按 9 月 17 日 2,446.14 美元单价折合约 2,297,659.30 美元): 0x2460fde607d09f2434d1b4e6d4089c6e1f459f4ce70ba2853d3a37547cdf00e
借出 STRK(28,272,985.90 枚 STRK,按 9 月 17 日 0.02897644 美元单价折合约 819,250.48 美元): 0x79005742a8f7fe443a4a0d444f053ba06a49a15d558662404aa894479ddb820
借出 USDC.e(113,661 枚 USDC.e,折合约 113,648.39 美元): 0x34bb10618939a14db2f613acad1d63bfbfb96908fdb6a6f2fb65a07af6a200a
借出 USDT(84,377 枚 USDT,折合约 84,365.93 美元): 0x61eacbd4f4fc4230a6e3b204ff0cdc26939db0663f3bec1418f51b79c5b0647
第一次借出 WBTC(2 枚 WBTC,按 9 月 17 日 76,371 美元单价折合约 152,742.00 美元): 0x373be1419cb2b5d0ef7fc684070857dbe88235e81c29fbe5d8e053640968fb4
借出 DAI(29,078 枚 DAI,折合约 29,264.11 美元): 0x5a8a94a14cc2950f81f5409c992218fa25827b4e2b9ec9a1d4b33bd623bc54d
第二次借出 WBTC(0.88 枚 WBTC,按 9 月 17 日 76,371 美元单价折合约 67,206.48 美元): 0x439ab7565b07299ad1f6cb57ee10e9f47dd80b1b98a4bac2ba696a0934ce95
借款总额:按 9 月 17 日资产价格折算,横跨六种资产共计借出约 356 万美元,与 Nostra 自身确认的 350 万美元体量吻合。
据 GoPlus Security 的链上复盘,借出的资产随后通过 AVNU、Ekubo 和 JediSwap,在约 80 笔交易中被悉数抛售。复盘描述了一条分两阶段的资金离场路径:先在 Starknet 上完成 DEX 抛售兑换,随后通过中介账户转移,并借助 NEAR Intents 完成资金跨链移动。GoPlus 指出该 Nostra 七笔借贷序列发起于该 Starknet 账户: 0x06d48ef7ab62c26e3ef1987c322096cd508e9034c82048783a6b438fc1344bc3
在预言机失真前进行浅池交易并拉抬价格的操作,则归属于另一 Starknet 账户: 0x2d9fb4edec9d5c015c43514ca5a309aab1b2638c3a45ad750d09ee971d0da23
完成 DEX 抛售后,120 万枚 STRK 被转入第一个中转账户: 0x0285b4bf99e227c4baed7f9a8c7c673771fe0b75e897f7350729e3e13021321d
另有 100 万枚 STRK 转入第二个中转账户: 0x074f5318f8d60ad0832068dc0430d0a0e2f9dd0c2e710fb8c032945a3804b57e
据 GoPlus 称,两个中转账户随后均通过 NEAR Intents 转移资金。复盘确认以下以太坊钱包为资金归集点: 0xa059aaab82773caf622de9d9a0f2dbf9aa7f3c37
完整的资金流向链路为:Nostra 借贷套现 → AVNU / Ekubo / JediSwap 抛售变现 → Starknet 两个中转账户 → NEAR Intents 跨链 → 以太坊地址归集。链上轨迹勾勒了资产如何流出;随之而来的问题是,这次攻击对该协议、其市场以及留存资金的用户带来了怎样的冲击?被挪用的资产已被追踪,但漏洞给协议自身、其所属借贷市场以及存款人留下了怎样的遗留后果?
当喂价接口沦为攻击面
Nostra 对约 350 万美元非授权借贷的披露未能阻止用户的流失。攻击带来了直接连锁反应:DefiLlama 数据显示,Nostra 的总锁仓价值(TVL)从 9 月 16 日的约 415 万美元骤降至 9 月 18 日的约 74.3 万美元;与此同时,NSTR 的预估流通市值约为 546,751 美元。在其最初的声明中,Nostra 表示已暂停存入、借贷、提现和清算功能;最终损失及潜在追回额度尚不明确;平台将公布详尽的分析报告。平台同时告诫用户,绝不会在追回资产过程中向用户发送私信或要求其连接钱包——鉴于安全事件处置期往往是冒充欺诈和钓鱼攻击的高发期,这一提醒至关重要。
Nostra 并非当月 Starknet 上遭遇预言机故障的唯一案例。就在不到两周前的 9 月 4 日,由于上游喂价故障,Vesu 使用的预言机在 109 秒内将其多种资产的报价压低到了真实价值的约一半。该错误触发了分布在 Vesu 七个流动性池中、涉及 42 个借款人钱包的 47 笔清算。Vesu 事件并非市场操纵攻击,而是一起错误价格发布的故障。Vesu 随后表示已按现行价格追回了 95% 的受损价值(按事发当晨价格计算约为 93%):针对 139.5 万美元的借款人申索,追回了约 133 万美元。两起事件的诱因截然不同:Vesu 源于系统性的价格发布错误,而 Nostra 则遭遇了攻击者人为构建的外部市场输入操纵。
然而,它们揭示了相同的架构现实:当协议合约严重依赖预言机判定抵押品价值或清算资格时,预言机所扮演的角色绝不仅仅是对市场的被动记录。在人工干预能够赶到之前,一个坏数据就足以触发连环清算或核准巨额借贷。9 月份对加密行业而言代价沉重。算上 Nostra 事件,DefiLlama 的漏洞追踪库记录的当月加密损失已超过 3.42 亿美元,其中绝大部分源自规模约 3.2 亿美元的 Liquid Network 事件。
Nostra 表示 Trail of Bits、Cairo Security Clan 和 Salus 对其智能合约进行了审计,但其常见问题解答(FAQ)及条款页面均未链接具体的审计报告、日期、范围、发现或修复详情。本次显现的系统失效发生在向这些合约输送价格的数据链路中,源于生成 NSTR 抵押品价格的外部市场环境以及预言机/交易池的选择机制,未必是借贷核心业务代码本身存在缺陷。Pragma 公开的文档和审计材料主要涉及其预言机架构和链上智能合约;表面上看,它们并未明确外部市场数据提供商是如何选定进入 Nostra 抵押品计算的交易池的。GeckoTerminal 的公共 API 文档显示,应用程序可以检索代币和交易池数据(包括单个代币对应的多个池),但并未披露判定哪一个 NSTR 市场来提供本次事件报价的具体交易池筛选防护、流动性门槛或防操纵机制(若有)。
因此,关键并不在于 Nostra 的合约是否经过审计,而在于该协议的风控设计是否充分考量了其合约底层所无条件信任的链下外部依赖。当协议代码被设计为对预言机指令言听计从时,究竟该由谁来确保这个预言机本身值得被相信?
一个浅流动性池无法凭空授权一笔数百万美元的借贷,是一整条互相信任的系统链路,将攻击者人为制造的市场伪价转化为了具备借贷能力的抵押资产。最核心的问题不在于 Nostra 的借贷合约是否运行报错,而在于该协议的风控模型为何允许一个流动性薄弱、极易被操纵的市场信号,去撬动如此体量的抵押借贷上限。
此事故并非全无先例。2025 年 3 月,Nostra 曾表示喂价错误将其平台 xSTRK 和 sSTRK 的报告价值虚增到了实际价格的约三倍,并承认对这些资产没有配置二级备用预言机。2025 年 8 月,Nostra 自身的分析报告提到,Pragma 提供的 xSTRK 喂价失效中断,导致四个账户抵押不足并产生了约 14,212 美元的坏账,随后由 Nostra Labs 进行了垫付兜底。Pragma 针对近期这起 NSTR 事件的陈述进一步印证了风险的客观存在:Pragma 称,鉴于流动性不足和可用定价源有限,NSTR 早已被归类为高风险喂价资产,且此前已向 Nostra 正式提示过相关隐患;并且,由于缺乏流动性和操纵风险,Gate.io 数据源还是应 Nostra 自身要求而移除的。Pragma 建议至少保留三个定价源,但本次事件中的响应仅有两个提供方,如果强制实行“三个源”的最低限制,该异常报价本会被直接拦截。
这些早期的事件与本次 NSTR 漏洞所用的具体机制并不完全相同:3 月份涉及喂价虚高,8 月份涉及 xSTRK 喂价失效或滞后,而 9 月份则是链上缺乏深度的 NSTR 市场遭受直接操纵。但它们合在一起,清晰记录了同一类反复出现的结构性风险——外部价格输入对抵押品估值的致命干扰——这并非一场完全无法预见的突发灾难。
因此,Nostra 最终的事件复盘报告需要解释的不仅是一个被操纵的交易池。它需要向外界阐明:协议究竟如何评估极浅流动性资产的抵押资格?在价格源缺失或严重偏离时内置了何种控制规则?为何 NSTR 在上述苛刻条件下仍能维持借贷准入资格?以及平台后续将如何平抑未偿负债、追踪可回收资产并处置用户的实际损失?交易池只是攻击者借用的工具,但 Nostra 最终的答复,是否能指认出究竟是哪套安全体系将这样一个虚假价格判定为“足以承载数百万元借款”?
