虫洞攻击是什么:闪电网络里两个中间节点如何合谋吞掉别人的转发费 图 1
虫洞攻击是什么:闪电网络里两个中间节点如何合谋吞掉别人的转发费 · 图 1

名字从哪来

虫洞攻击原是无线网络里的概念:两个相距遥远的恶意节点用一条带外捷径互相转发数据包,让路由协议以为它们做邻居。闪电网络借用了这个名字,因为攻击结构一模一样——在一条付款路线里安排两个恶意中间节点,再用通道之外的小动作绕过它们中间那些诚实转发者。

攻击利用的是什么

闪电的多跳付款靠哈希锁保证原子性:收款人生成预像,路线上每一跳的通道都以“公开这同一个预像”为取钱条件。这个设计有个隐含漏洞——锁是共享的。假设路线为付款人经过节点 A、B、C、D 到收款人,其中 A 和 D 是攻击者的两个节点。A 把带哈希锁的付款发给 B,D 在最后一跳也持有同一个哈希锁。正常流程里,D 拿到预像后逐跳回传,B 和 C 各自锁定、各自解锁、各挣一笔转发费。

虫洞打法是:D 不按套路走,它从收款人处拿到预像后不往回发,而是通过带外通道直接把预像交给 A。A 立刻用预像解锁自己这一跳的 HTLC。B 和 C 在毫不知情的情况下发现自己锁定的条件已经被满足,却说不清付款到底走没走完整条路线——最坏情况下,攻击者可以伪造或缩短路线,B、C 的转发费被吞,而它们还按协议认为一切正常。换句话说,共享哈希让两个“会合点”之间的一切中间环节变得可绕。

研究怎么定性

2018 年发表的论文(IACR ePrint 2018/472,后发表于 NDSS 2019)系统分析了支付通道网络的安全模型,指出虫洞攻击适用于当时所有主流通道网络,不止闪电一个。论文同时给出了对策思路,叫匿名多跳锁:每一跳的锁要互相密码学关联,必须每一跳都真实参与,整条链才能解开,任何一段缺席,付款就失败而不是被绕过。这类构造可用脚本less 的多方签名方案在比特币上实现。论文的作者团队说明,闪电网络开发者在承认该攻击后把基于 ECDSA 的多跳锁方案落进了实现。此后的量化研究估计,攻击者只需控制网络中较小比例的节点,就足以定位机会对并收集路线信息,凸显这不是纯理论威胁。

防线长什么样

第一条是协议层的多跳锁与点锁:PTLC 一类构造让每跳的锁定值各不相同,虫洞失去了“两边锁相同”的前提。第二条是路由信息最小化:盲路径等技术让节点少知道一点路线结构,也就少一点可合谋的信息。第三条是运营层:选择路线长、节点分散的通道社区,本身会降低攻击者恰好凑齐两个合谋点的概率,但这只是概率,不是保证。

一笔直觉算术

设想某网络一万条活跃路线,攻击者经营若干热门节点。虫洞要求两个恶意节点出现在同一条路线上,单条路线上这个事件的概率随路线长度和节点市场份额变化——研究给出的数量级提醒是:当攻击者的节点覆盖面到百分之几时,机会对的搜索空间已经小到值得动手。这也是为什么修复必须进协议,而不是指望运气。

常见误区

一是“洋葱加密已经保护了路线,所以无法合谋”。洋葱路由防的是看内容,虫洞利用的是锁的结构,两者不是一回事。二是“中间节点看不到金额就什么都不知道”。共享哈希本身就是泄漏点,金额只是次要面。三是把虫洞和扣块、挤占混为一谈,虫洞不锁你的资金,它偷的是转发者的钱。

快速问答

问:普通付款人会受害吗?答:直接受害者是被绕过的转发节点;付款人至多多付一点费或选不到最优路线。问:我能检测吗?答:作为节点运营者,关注多跳锁类实现与自身软件升级节奏,比自建检测更现实。

风险提示:本文只做攻击机制科普,不提供任何实施方法,也不构成投资建议。