热钱包出事,很少是因为合约写得多巧妙。多数时候,是因为某个本该守住的私钥,签了一笔不该签的东西。
币安这次就是这样。10 月 29 日到 30 日之间,链上资金像开了闸,外界估算从 25 亿美元一路喊到 58 亿美元。数字每小时都在变,因为大家统计的链、钱包、口径都不一样。下面这些,是我们自己在以太坊主网上核对过的部分,交易哈希都能直接打开。
先看那四分钟
北京时间 10 月 30 日 04:20:59,也就是 UTC 时间 10 月 29 日 20:20:59,一笔交易从地址 0x7c8601d4645b93cea45f71e118a729332e6b5ca0 发出。这笔交易里打包了 50 个 EIP-7702 授权,全部把同一个账户,也就是区块浏览器标注的 Binance 14(0x28C6c06298d514Db089934071355E5743bf21d60),委托给同一个合约 0x63e842b054bd624a465454d533c33f573e9c6fae。
我们把 50 个授权签名逐个做了恢复,签名者全部是 Binance 14。50 个签名互不相同,nonce 从 18,914,775 连续排到 18,914,824。也就是说,失守的私钥不是只签了一次委托,而是一口气烧掉 50 个 nonce。副作用很实际,任何用更低 nonce 预先签好的交易,从此作废。
4 分钟后,04:24:23,攻击者直接调用 Binance 14。交易 0x53bd38b816c23e74134786c29a8c18d792777998a3b9326047b583100e88e2f3 在委托代码下执行,把钱包里的东西一次搬空:
- 167,464.24785655882 枚 ETH,转到
0x5227f603c1ee34ce3c06efe6477003bdfccb2f8c - 1,615,409,498.97 枚 USDT
- 共 64 条代币转账记录,覆盖 60 多种资产,包括 29,934 枚 wBETH、11,372 枚 XAUt、6,259 万 RLUSD、2,776 万 USD1、1.98 亿 ENA、7.17 万亿 PEPE、226 万 LINK、127,853 枚 AAVE、619 万 UNI、82.5 枚 WBTC、1,898 枚 PAXG
紧接着,另一个被标注为 Binance 16 的钱包(0xdfd5293d8e347dfe59e90efd55b2956a1343963d)在交易 0x51f263fa50966df6bbd7f8c6e6e99e3791c94444f7c4343b2fef1ee2d62fd39f 里转出 28,005.6 枚 ETH,收款地址相同。之后这批 ETH 被归集成 195,460 枚,转入新地址 0x8532fa14acaf483729c449b8458aeddb900543d4,到现在没动。
后面的事情和凌晨流传的时间线对得上:04:32 起链上研究员开始预警,04:39 资金二次转移,05:04 起 Circle 冻结 USDC,05:05 起 Tether 冻结 USDT。
这个操作地址不是凭空来的。它在动手前大约 37 小时开始,从 Tornado Cash 的 0.1 ETH 池子分三笔各收到约 0.098 ETH,合计约 0.294 ETH。这说明操作是提前备好、按计划执行的,不是临时起意。需要说明的是,Tornado Cash 本身是隐私工具,这笔资金来源只能说明准备过程,不能直接指向具体的人。
为什么 EIP-7702 让后果更重
EIP-7702 是 Pectra 升级带来的功能,允许普通账户(EOA)把一段合约代码挂到自己地址上。实现方式写在 EIP 里:授权元组会把账户代码设成 0xef0100 || 合约地址。从那一刻起,调用这个钱包,执行的就是被委托合约的逻辑,用的是钱包自己的权限。
我们直接查了代码指针。在区块 26,300,753,Binance 14 的代码是 0xef010063e842b054bd624a465454d533c33f573e9c6fae。现在再查,已经是 0x,说明委托后来被清除了。但那段时间足够完成转移。
这件事有两个容易被忽略的点。
第一,它不是代币授权。ERC-20 的 approve 只是让某个合约最多动某一种代币的某个额度。7702 委托是让合约代码以账户身份行动,账户能碰的东西它都能碰。所以一笔调用能产生 64 条转账记录,中间不需要任何 approve 弹窗。
第二,授权必须由被委托账户自己签名。EIP 规定授权绑定链 ID 和 nonce,但签名主体就是那个账户的私钥。陌生网站没法替你签名,攻击者也没法凭空伪造 Binance 14 的授权,除非手里有能替它签名的东西。
结论不好听,但范围很清楚:无论入口是什么,攻击者当时能以一个正在运行的交易所热钱包的身份签名。是私钥泄露、签名服务被入侵,还是内部权限被滥用,目前没有任何公开说法。币安也没说。
冻结线在哪里停下
稳定币发行方反应很快。Circle 冻结了 823,000,000 枚 USDC。这个数字我们两头核对过:接收地址的余额是 8.23 亿,合约里该地址的黑名单标记返回 true。Tether 方面,CEO Paolo Ardoino 称冻结超过 15.67 亿枚 USDT。同一个接收地址上,我们查到仍留着 1,175,464,712.78 枚 USDT。
这里有个普通用户经常误解的地方:冻结不等于追回。冻结只是让代币不能动,不代表它回到了交易所金库。而且冻结只对发行方能控制的资产有效。停在二级地址上的 195,460 枚 ETH 是原生资产,没有任何公司能把它拉黑。
所以现在的局面是僵住:约 24 亿美元稳定币动不了,195,460 枚 ETH 静静躺在一个陌生地址,追回要看执法协作、交易所谈判,或者持钥方自己犯错。
币安说了什么,没说什么
币安对外口径很统一:用户资金安全。公司对 TechCrunch 表示已知悉「潜在安全问题」,正在调查,「用户资金完全安全」,发言人也确认多个网络暂停提现是预防措施。仍是最大股东的 CZ 在 X 上说这看起来像黑客攻击,预计用户资金会「完全覆盖」。联合创始人何一表示团队正在调查,强调用户资金安全。
这些表态里没有根因,没有损失数字,也没有「流出多少、冻结多少」的核对表。SAFU 基金就是为这种事准备的,但会不会动、动多少,没有确认。
外部估算之所以差这么多,是因为统计对象不同。一个以太坊钱包被搬空,和所有币安标签地址在以太坊、BNB Chain、Tron、比特币上的全部流出,不是一回事。有些统计还把可能不属于被盗的内部划转算了进去。币安公布地址清单和核对结果之前,所有总数都是上限,误差很大。
如果你在交易所还有钱
能做的事不复杂,只是大多数人不愿意做。
- 对手方风险不是理论。 热钱包必须联网,因为它要签名提现。这个便利就是攻击面。交易所只留周转资金,其余放自托管。
- 小心第二波。 大事件之后几个小时内,会出现一批「追回」「退款」「验证资产」的假网站。没有哪家交易所会让你连钱包、签 7702 授权,或者先付一笔解冻费。
- 看懂委托提示。 钱包或 DApp 让你「授权账户代码」「升级账户」,那不是登录,也不是领空投,是把账户的执行权交出去。
- 分清冻结对你是谁。 你持的是 USDT、USDC,发行方冻结可能帮交易所保住一部分资产。你持的是 ETH、BTC,追回路径更慢,也更不确定。
写在最后
技术上看,这不是什么新型漏洞利用。是私钥管理这门老手艺又失守了一次,只是这回一次签了 50 遍。
EIP-7702 让后果来得更快、更广。一个委托把热钱包变成了攻击者能调用的合约账户,一笔交易搬走 60 多种资产。冻结线拦住了约 20 亿美元的稳定币,拦不住以太坊。
在币安拿出真正的复盘报告之前,把总数当估算,把保证当承诺,把自己在交易所的余额当成一笔对平台的债权,而不是保险箱。
常见问题
币安这次到底丢了多少钱?
没有确认数字。我们链上核实到的是一笔交易转出 167,464.24785655882 枚 ETH 与 1,615,409,498.97 枚 USDT,另有 28,005.6 枚 ETH 来自第二个钱包,还包含 60 多种代币。外部估算从约 25 亿美元到 58 亿美元不等,差别在于统计了哪些链、哪些钱包。币安尚未公布损失数字。
EIP-7702 是什么,为什么会出问题?
EIP-7702 允许普通以太坊账户通过签名,把一段智能合约代码挂到自己身上,之后调用该账户就等于执行这段代码。它不是代币授权,权限覆盖账户本身。设置委托必须用账户私钥签名,所以这次的根因指向私钥或签名系统失守,而不是合约漏洞。
被偷走的 ETH 能像 USDT 那样冻结吗?
不能。USDT、USDC 的发行方可以把地址拉黑、冻结自家代币,所以约 20 亿美元的稳定币停了下来。ETH、BTC 没有发行方,没人能冻结。归集到新地址的 195,460 枚 ETH 至今仍不在任何黑名单能触及的范围内。
放在币安的钱还安全吗?
币安称用户资金完全安全,并在多个网络暂停提现作为预防措施,但没有公布根因和损失核算。把这句话当成承诺,而不是审计结论。交易所余额本质上是对交易平台的债权,大额资产应放自托管钱包,交易所只留周转用的部分。