一次退款如何变成武器:NEAR Intents 380 万美元被盗,真正的代码问题在哪

发布时间:2026/10/16 6:41:34

一次退款如何变成武器:NEAR Intents 380 万美元被盗,真正的代码问题在哪 退款如何变成提款机NEAR Intents 380 万美元漏洞的代码级复盘9月30日NEAR Intents 在 BNB Chain 上的金库被分五笔提走约 387 万美元。官方把原因指向 Omni 充提基础设施与 Intents 合约的交互缺陷。多家审计机构没有发现这个问题。AlexAuroraDev 也确认标准审计没有识别出攻击者使用的特定操作模式和动作序列。这不是一个“随便扫一眼就能看出来”的漏洞。它藏在退款逻辑、日志大小限制、跨链 backing 和内部账本之间。下面从代码开始拆。事件轮廓损失约 387 万美元发生在 BNB Chain 金库。五笔提款持续约六小时。资金跨六条链转移大部分换成 BTC进入四个钱包。其中约 80.2 万美元流向 KuCoin 充值地址。攻击者后来归还全部 380 万美元NEAR Intents 给了 48 小时期限。但真正要看的是退款函数怎么变成武器。漏洞代码在哪里问题出在contracts/defuse/src/contract/tokens/mod.rs183 到 199 行附近。这个函数负责处理 Omni Bridge 的存款事件把存款记到intents.near内部账本。核心缺陷是退款金额被available_balance限制而不是当前这笔deposit_amount。当存款后续失败合约会按攻击者已有余额退款不是按实际存入金额退款。漏洞逻辑等价代码如下// 漏洞版退款边界用了 available_balance而不是 deposit_amountfnresolve_deposit_refund(account:AccountId,available_balance:Balance,deposit_amount:Balance,memo:str,)-ResultRefundEvent,Error{letrefund_amountavailable_balance;// 攻击者已有余额letrefund_eventRefundEvent{account_id:account.clone(),amount:refund_amount,memo:memo.to_string(),};Ok(refund_event)}问题很直接deposit_amount传进来了但没被用。正确做法应该把退款上限压到这笔存款// 修复版退款不能超过触发退款的这笔存款fnresolve_deposit_refund(account:AccountId,available_balance:Balance,deposit_amount:Balance,memo:str,)-ResultRefundEvent,Error{letrefund_amountstd::cmp::min(available_balance,deposit_amount);ifrefund_amountdeposit_amount{returnErr(Error::RefundExceedsDeposit);}letrefund_eventRefundEvent{account_id:account.clone(),amount:refund_amount,memo:memo.to_string(),};Ok(refund_event)}效果退款事件在结构上被这笔存款约束。攻击者就算账上有大额历史余额也不能通过退款路径把它放大成提款能力。攻击为什么成立一步一步拆第 1 步提前积累大额辅助代币余额。攻击者用的是一种自定义辅助代币。他在 NEAR 侧积累了相当规模的余额。这笔余额在 Intents 内部账本里是一笔 credit后面可以被动用。第 2 步在 BNB Chain 做小额存款。一个新钱包往金库打 10 USDT然后另一个钱包提 10 USDT再提 11 USDT整个过程约一小时。这些动作看起来像普通用户不会立刻触发监控。第 3 步触发退款事件引用那笔大额已有余额。因为 resolver 用available_balance限制退款攻击者可以构造一笔下游失败的存款事件让合约发出远大于实际存入额的退款。退款用高精度代币计价。第 4 步退款事件超过 NEAR 日志大小限制 11 字节。NEAR 的日志上限是 16,384 字节。大十进制金额把退款事件撑爆超出 11 字节Intents deposit resolver 失败。这个失败是关键转折。Omni Bridge 已经把存款 backing 退回给攻击者但之前成功入账的 Intents credit 还在。第 5 步用幸存的内部 credit 从 BNB 金库提真实资产。此时内部余额大于剩余 backing。攻击者走正常提款路径五次从 BNB Chain 的 HOT Bridge 金库抽走约 386.5 万美元 USDT。第 6 步跨六条链转移资金。约五分之一通过 NEAR Intents 自己 swap其中还包括 750 BNB 还回被盗金库。大部分赃款最终变成 BTC进入四个钱包约 80.2 万美元到 KuCoin 充值地址。缺少回滚为什么状态没被撤销BlockSec 把事件归类为 “Improper Refund Validation and Missing Rollback”。这个分类抓到了后半段问题。只有退款校验缺陷不一定灾难前提是退款失败时内部 credit 会回滚。原来的设计是deposit resolver 先给用户内部余额记账再调用接收账户的通知回调。当退款事件超过日志限制、resolver 失败时之前成功入账的 credit 没有被回滚。系统里没有一条状态反转路径说如果退款解析失败内部 credit 必须恢复到存款前状态。回滚机制大致应该长这样// 给内部账本记账后尝试通知和退款解析letcredit_resultintents_ledger.credit(account,amount);ifletErr(e)resolve_refund_event(...){// 回滚下游解析失败就撤销这次 creditintents_ledger.debit(account,amount)?;returnErr(Error::RefundResolutionFailed(e));}没有这段回滚攻击者的内部余额就保持虚增。即使 BNB Chain 上的真实 backing 已经被 Omni Bridge 退回账本里仍然显示他有可提款余额。审计为什么没发现审计漏掉它不是因为审计太粗心而是因为看错了抽象层。审计通常盯智能合约内部逻辑权限控制、算术安全、重入保护、标准代币流程。它们没有建模三层系统之间的交互BNB Chain 上的真实资产、NEAR 上的 HOT 代币表示、intents.near里的用户内部余额。漏洞住在层与层之间的缝隙。合约代码单独看没有明显错误。它要同时满足几个条件才会爆日志大小限制、大十进制退款金额、缺少回滚、Omni Bridge 独立的 backing 退回逻辑。没有哪家审计被要求在所有对抗条件下追踪完整路径。NEAR 创始人 Illia Polosukhin 随后宣布生态会在发布流程里加入形式化验证目标是数学证明代码在所有可能输入下都正确。形式化验证能抓这类 bug因为“退款金额不得超过存款金额”可以写成形式化不变量。人工审计很难可靠抓跨层运营 bug。真正的修复需要什么NEAR 后来打了补丁。intents.near在暂停前后代码哈希一致说明修复落在 resolver 层不需要整份合约升级。但工程教训比一行代码更深。第一退款校验必须由存款额约束而不是可用余额。这是立刻生效的代码级修复直接消掉攻击面。第二存款解析流程必须有回滚路径。退款事件失败内部 credit 必须回滚。否则系统会进入内部余额超过真实 backing 的不一致状态。第三跨系统会计不变量要持续验证。三层模型必须保持一个不变量总内部余额永远不超过总真实 backing。独立验证流程应该在任何提款签名前检查这一点。BlockSec 说得很准下游签名和执行不能基于错误的上游信息签名前和放款前都要独立检查。代码之外开发者该检查什么所有退款和补偿路径金额边界是什么是不是只看用户已有余额失败路径会不会留下已记账但没有 backing 的 credit跨链入账和出账是否共享同一状态机有没有补偿事务日志、事件、序列化有没有大小上限大数和高精度代币会不会触发边界审计范围有没有覆盖跨合约、跨链、跨账本交互有没有包含对抗序列上线前有没有验证全局不变量内部负债 真实资产关键不变量有没有形式化验证或运行时断言监控有没有关注“小额存提之后出现大额退款或提款”的模式总结攻击者归还了全部 380 万美元。但真正的教训不是追回。一个退款函数任何 bridge 或 vault 系统里最普通的代码因为信任了错误的数字又没有能力撤销自己的错误最后变成了多链盗窃入口。代码中最危险的部分往往并非复杂的密码学或花哨的跨链消息格式而是看似无害的 min 校验错误以及失败分支后缺失的 debit。NEAR Intents 此次 380 万美元事件正是这一点的注脚。
延伸阅读

更多相关文章

2026/10/16 6:41:34

九元航空 black_box

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口 等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介…

2026/10/16 6:41:34

black_box 同盾算法分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口 等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介…

2026/10/16 6:41:34

论文写作工具链:编辑器与LaTeX发行版组合实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 7:57:02

微立体PPT模板:财务数据统计分析的可视化实战指南

简介:这套微立体风格的财务数据统计分析报告演示文稿模板,专为会计、财务人员及需要制作经营数据汇报的职场人士准备,适用于从财务新手到资深分析师的各类人群。蓝色微立体设计在视觉上突出数据层级,围绕财务统计与分析场景配置多…

2026/10/16 7:57:02

nvidia-smi命令找不到?从驱动到容器彻底排查与修复指南

“nvidia-smi: command not found”大概是 Linux 装显卡驱动时最经典、也最让人摸不着头脑的报错。我第一次遇到是在一台刚装完系统的服务器上,当时还以为是显卡坏了,折腾半天才发现只是驱动没装上。后来搞多了就明白,这个报错本身不复杂&…

2026/10/16 7:57:02

大模型上下文管理实战:Token预算、记忆分层与检索召回

前几天我和一朋友调试他做的对话机器人,本来前期测试一切正常,结果聊到第 20 轮的时候,模型突然开始答非所问。他问了一句“我刚才不是说过了吗”,系统毫无反应。我打开日志看了一眼 Token 消耗,心里大概就有数了&…

2026/10/16 7:57:02

多模态Agent实战:Harness编排与MCP工具接入的工程架构解析

1. 多模态 Agent:从“能聊”到“能干”的跨越最近这半年,我几乎把所有业余时间都砸在了一个Agent开发项目上。说实话,市面上讨论Agent的声音很多,但真到了自己动手把一个大模型多模态应用和一个可编排的Harness框架、再加上MCP协议…

2026/10/16 7:52:02

AI原生超级全栈开发:从写代码到编排AI的实战指南

1. 从“写代码的人”到“编排AI的人”,这个训练营到底在教什么“AI原生超级全栈开发工程师训练营”这个名字,第一次看到的时候我愣了一下。全栈我懂,超级全栈是什么?AI原生又是什么?后来花了两周时间把市面上能找到的相…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑