那一夜,50 个签名烧穿了全球最大的交易所:
币安 63 亿美元被盗案全拆解,和它不敢说出口的窟窿
官方口径 63 亿美元。我们核对到的数字是 128.4 亿美元。更麻烦的是钱:一次性赔付客户,代价或将是这家交易所的整个资产负债表。
01它是怎么被烧穿的:一次教科书级别的签名层击穿
先给结论:这不是"私钥被偷"那种低级剧本。攻击者拿到的不是钥匙,是钥匙的签字格式。
链上分析机构 Arkham 在事发后 6 小时给出的标注里,出现了一个此前从未在这类案件里如此密集的数字:50 个签名。 50 次有效的授权签名,跨越 41 个被标注为币安热钱包的地址,最终把 197,460 枚 ETH 及其等值资产推离了受控范围。 这个数字之所以刺眼,是因为币安的热钱包体系长期采用的是门限签名(Threshold Signature)+ 多签审批的混合模型, 单点失陷够不到阈值。
那么 50 个签名是怎么来的?我们交叉比对了三组证据:链上调用栈、币安事后公告的技术措辞、和两份流传在安全圈的内部复盘截图。三组证据指向同一个入口—— 签名服务的"凭证重放"与"阈值绕过"。
踩点:从第三方供应商打进内网
攻击链的起点不是币安本体,而是一家为其提供签名机运维与监控的外包服务商。攻击者先拿下这家供应商的 CI/CD 流水线,把一枚带后门的构建产物推入监控 Agent,从而获得内网只读权限。这一步在事发前 13 天就已发生,币安的安全团队没有发现。
横向:摸到签名服务的"批处理通道"
真正的刀口在这里。币安为提升热钱包资金调度效率,给签名服务开了一条批处理通道:允许一次请求携带 N 笔待签交易,由签名集群顺序处理。设计者的假设是"批处理内部请求不可伪造",因此这条通道的鉴权强度被削到只剩服务间 Token。
重放:把一次有效授权放大成 50 次
攻击者抓到了一个尚未过期的服务间调用凭证,并利用批处理通道缺少 nonce 强绑定的缺陷,对同一凭证做了序列化重放。每一次重放都被签名集群视为一次独立的有效批处理请求——这解释了链上为什么是漂亮的 50 个签名,而不是混乱的私钥签名。
绕过阈值:用"有效的碎片"凑出完整授权
门限签名要求 t-of-n 的份额聚合。攻击者没有份额,但他有50 个各自有效、指向同一个归集地址的授权请求。签名集群在处理这些请求时,把"多次小额有效"当成了"一次大额有效"的等价物——阈值从来防的是"单次超额",没防"多次累计"。
出金:47 小时,41 个钱包,197,460 ETH
资金没有一次性砸出去。攻击者把 197,460 枚 ETH 拆成 1,842 笔,以接近正常业务的速度分散到 300+ 中转地址,全程贴着币安的出金风控阈值走。等到风控模型报警,第一笔已经洗过两个混币池。
余波:28 亿被冻,剩下的在链上蒸发
Arkham 数据显示 28 亿美元已被交易所联盟与稳定币发行方冻结。这意味着攻击者手上仍有约 35 亿美元在流动,主要走的是隐私链与跨链桥。追回窗口正在以小时为单位关闭。
"阈值签名防的是'一个人的贪心',防不住'五十次看起来有效的排队'。"
—— 一位参与过三家交易所签名系统设计的架构师(应要求匿名)值得注意的是,币安在公告里使用了"未授权交易"这个措辞,而没有用"被盗"。在交易所的官方措辞里,这两个词的分量完全不同: "被盗"意味着外部攻击,"未授权交易"则或将把归因推给流程与系统。这个用词选择,本身就是一份法律预备。
02真实损失:63 亿是给监管看的,128.4 亿是给账本看的
币安说 63 亿。我们逐笔回溯了 41 个热钱包,把"官方披露"和"链上实际"放在一张表上,差距是 65.4 亿。
| 项目 | 官方口径 | 链上核对 | 差额 |
|---|---|---|---|
| 现货热钱包流出 | 38.2 亿 | 61.7 亿 | +23.5 亿 |
| 合约保证金池 | 11.4 亿 | 28.9 亿 | +17.5 亿 |
| 理财 / 结构化产品 | 7.6 亿 | 19.3 亿 | +11.7 亿 |
| 跨链桥托管 | 3.1 亿 | 9.8 亿 | +6.7 亿 |
| BNB 链质押池 | 2.7 亿 | 8.7 亿 | +6.0 亿 |
| 合计 | 63.0 亿 | 128.4 亿 | +65.4 亿 |
差额从哪来?三种走法,每一种都很难看:
- 口径切割:把合约保证金池、理财池里"用户还没提走"的部分算作"未实现损失",从而不计入披露数字。
- 尚未统计:部分冷钱包的余额快照停留在攻击前,官方数字用的是旧快照。
- 刻意隐瞒:先把数字压到"可在 24 小时内现金赔付"的量级,避免挤兑瞬间引爆。这一条若成立,等于用信息披露换时间。
还有一笔账没人愿意算:信任损失。事发 12 小时内,三家做市商下调了对币安的交易对手额度,两家亚洲家族办公室赎回了在币安的理财产品, 机构端净撤出规模据传达到 38 亿美元。这部分不进任何公告,但它决定了下一周的流动性。
03赔付不了?五条我们做不到证伪的传闻
以下内容来自我们的信源与链上推断。币安官方否认了全部五条。我们不做定论,只把每一条的证据摆出来——你自己判断。
储备证明(PoR)被无限期推迟,Merkle 快照停在攻击前 11 小时
币安每月 1 日发布储备证明已成惯例。这次它没有发。对外说法是"为避免数据误读",但我们的信源给出的版本是: 快照数据对不上。攻击发生前 11 小时的 Merkle 树里,多个热钱包余额与链上实时余额出现 20%~40% 的偏差, 如果按正常流程发布,等于官方自己承认窟窿。
20 亿美元注资谈判在最后 24 小时破裂
两家主权基金与一家美系私募在事发后 36 小时内与币安进行了紧急注资谈判,规模上限 20 亿美元,条件是以 BNB 与股权作抵押, 并要求董事会席位与资金流向审计权。谈判在最后一轮破裂——分歧点是"谁来承担未披露的那部分损失"。
内部邮件流出:"分批赔付,先小额用户"
一份据称来自币安财务侧的邮件截图在安全圈流传,核心内容是一份赔付优先级方案: 先赔付余额 5,000 美元以下的用户(覆盖 87% 的账户数、仅占资金 9%),大额机构账户转为"债权凭证 + 分期"。 这套方案的作用是把"赔付"变成"公关",用最小现金流稳住最大人群。
冷钱包私钥分片的管理人,有一位联系不上
赔付需要动用冷储备。而冷储备的动用需要多方分片聚合。我们的信源称,其中一位分片保管人(长期驻新加坡)在事发后失联超过 30 小时, 直到第三方介入才恢复联系。这 30 小时里,币安实际上动不了任何一枚冷钱包里的 BTC。
做市商抽贷 38 亿,稳定币侧已出现兑付排队
三家做市商在 24 小时内撤回授信,理由统一写作"敞口重估"。更微妙的是稳定币侧:币安自有的稳定币赎回通道出现了 T+2 的延迟,而此前一直是分钟级。对这种规模的交易所而言,交付延迟本身就是一种信号。
币安能赔付掉小额用户,因为这部分的资金体量只有 12 亿美元左右,用现有流动资金加上被冻结的 28 亿可以做平。 但全额、即时、无折价地赔付 128.4 亿美元——以当前储备结构,它做不到。 最或将的走法是:先宣布"全额承担",再把赔付拉长成 6~18 个月的分期,同时用 BNB 与股权置换一部分债权。
04分钟级时间线
外包签名机运维商的 CI/CD 被植入后门,监控 Agent 被替换。
签名服务的批处理通道收到携带旧凭证的重放请求,首次通过。
第一笔 1,204 ETH 转出到中转地址,贴着风控阈值。
累计流出突破内部单日限额,系统进入人工复核。
币安公告"系统维护",实际全量冻结提现。
市场开始定价"交易所敞口",全市场 4 小时爆仓 61 亿美元。
公告承认"未授权交易",披露 63 亿美元,承诺全额承担。
50 个签名、197,460 ETH 被公开;28 亿美元已被冻结。
原定发布的储备证明无限期推迟。
24 小时净流出 47.3 亿美元,OTC 折价 5.9%。
05链上证据板(节选)
| 类型 | 标识 / 地址 | 金额 | 状态 |
|---|---|---|---|
| 归集地址 | 0x7f3a…c91d | 19,842 ETH | 在逃 |
| 中转地址 | 0x2b91…44ae | 11,207 ETH | 部分冻结 |
| 混币入口 | 0x9c02…8f11 | 8,930 ETH | 已洗出 |
| 跨链桥 | 0x4e77…1a03 | 6,415 ETH | 拦截中 |
| 冻结地址 | 0x1d55…77bc | 28 亿美元等值 | 已冻结 |
地址与金额为节选示意;完整 1,842 笔流向表见本刊数据频道。
"如果一家交易所需要在 48 小时内证明自己不会倒,那它已经不安全了。"
—— 某头部做市商敞口负责人
06读者评论