10 月 24 日,Electrum 发了 4.8.3。版本号很小,更新说明也不长,但它修的是自托管钱包里最难堪的一种失手:私钥从头到尾没离开过你的设备,币还是付给了贼,因为你在钱包的引导下,签了一笔自己没看清的交易。
Electrum 官方当天发了安全公告 GHSA-6jp4-8v48-cc5v,评级 High,没有分配 CVE。受影响的是 4.8.3 之前的全部版本。公告里写得很直白:已经有两名用户私下报告,其中一人的钱被转走了。
事情是怎么发生的
Electrum 是轻钱包,不下载整条比特币区块链。余额、历史、手续费估算、内存池里有哪些未确认交易,全都问服务器。已确认的交易它自己用区块头做 SPV 验证;未确认的交易,按轻钱包的设计,只能信服务器。这条写在官方文档里,很多年了。
有人把这条公开的信任关系做成了陷阱。公告给出的顺序是:
- 你正常广播一笔付款,叫它 tx1。
- 恶意服务器把 tx1 吞掉,不往网络转发。
- 服务器给你的钱包塞进另一笔交易 tx2,输出地址是攻击者的。
- tx2 的签名是无效的。旧版 Electrum 不校验未确认交易的签名,于是把它当成一笔待确认交易显示出来。
- 你看到一笔卡住的付款,想着加手续费。Electrum 的加费功能,签的是它认为还在待确认的那笔交易,也就是 tx2。
- 钱包把 tx2 签好,手续费提高,网络接受,钱进了攻击者口袋。
签名有效,交易真实上链,只是它不是你打算签的那一笔。
尾号四位一样的地址
公告里有个细节,让这套手法从理论变成了可执行:两起报告里,攻击者的收款地址都被专门碰撞过,末四位和真实收款地址完全一致。付款本来就急,人对地址的核对通常只扫一眼首尾,这一扫就废了。
第二名受害者的那笔假交易,手续费被设成 0。这不是随手为之。零手续费的交易看起来就是卡住的样子,而卡住才会让人去点加手续费。整套陷阱是围着你的下一个动作设计的。
时间线
公告列得很清楚:
- 2026 年 10 月 11 日,第一位用户私下报告交易被替换,但没意识到加手续费这条路径。
- 2026 年 10 月 18 日,第二位用户 Raju-K12 报告,在确认加手续费之后损失了资金。
- 10 月 23 日,修复合入,4.8.3 打上 tag。
- 10 月 24 日,二进制发布,公告公开。
被盗金额没有公开。第一位用户在看到交易被换掉时收手了,第二位没有。
4.8.3 改了什么,没改什么
修复对应提交 90fe308。Electrum 现在会在把未确认交易写进本地记录之前,先验证那些花用本钱包币的输入签名。父交易已知的话,假交易会直接以 InvalidTxSignature 被拒,抢不掉原来的记录;父交易晚到的话,那笔花钱的交易会被移除。
提交里还处理了一个更细的点:txid 不承诺见证数据,这正是交易可塑性问题的来源。
这条路堵上了,但边界只是往里挪了一格。客户端现在只验 is_mine 的输入,别人转进你钱包的交易仍然不做脚本验证。公告说得很实在:要覆盖非本钱包输入,就得沿着未确认的父交易一路递归验证到已确认交易,那是全节点该干的活,不是轻钱包。
该做什么
先从 electrum.org 下载 4.8.3,验证 GPG 签名。然后改两个习惯。
第一,把每一次签名都当成独立决定。加手续费不是维护操作,它是花同一批币的新交易,值得和第一笔付款一样核对地址。打开详情,逐个输出读一遍,看完整地址,不要只看首尾四位。
第二,金额不小就自建 Electrum 服务器。这类攻击的前提是服务器会对你说谎;服务器在你自己手里,第三方就失去了这个能力。这和 Ledger 供应链那次是同一个教训:自托管最薄的一环很少是私钥存在哪,而是设备签的东西和你以为自己在要的东西之间那段路。
硬件钱包在这里仍然是有效防线,理由很具体。Electrum 把交易交给硬件钱包时,收款地址和金额会显示在设备自己的屏幕上。被换掉的输出地址,包括那个末四位相同的仿冒地址,必须在设备屏幕这一关也过得去。不看内容就签的人丢掉的正是这道检查,所以签名类诈骗总在这种事故里出现。
真正难看的地方
Electrum 这次不算传统意义的漏洞。它有一个信任假设,写在文档里,所有人都知道,几百万人日常依赖。攻击者没有攻破密码学,只是读了说明书,然后在你盯着手续费而不是地址的那一秒,造了一个会说谎的界面。
这个模式值得记住。在地址投毒里,攻击者污染你的历史记录,让错的地址看起来眼熟;这一次,攻击者污染你的待确认列表,让错的交易看起来像你的。两者都是钓鱼,瞄准的是同一个省事本能:核对过一次,之后信屏幕。
4.8.3 让屏幕诚实了一点。习惯这件事,它替不了你。
常见问题
Electrum 4.8.3 之后还会被这样偷吗?
这一条路被堵上了。4.8.3 会验证未确认交易里花你自己币的那些输入签名,假交易进不了本地记录。但修复只覆盖钱包自己的输入,别人转进来的交易仍然不验脚本,签名前核对地址还是得自己做。
私钥没泄露,币怎么会被转走?
攻击者要的不是你的私钥,是你亲手签一笔没看清的交易。服务器把你真实的付款藏起来,显示一笔付给攻击者地址的假交易。你以为在给卡住的付款加手续费,钱包签的其实是那笔假交易,签名完全有效。
已经加过手续费了,怎么自查?
打开那笔交易的详情,把每个输出地址和金额跟原本要付的逐字对比,不要只看首尾四位。发现地址不对就不要再加费、不要重播,剩余资金转到新钱包,并联系 Electrum 与收款方。
自己搭 Electrum 服务器有用吗?
有用,而且这是从根上解决。这类攻击依赖一个你不控制、并且会对你说谎的服务器。自建服务器并通过 Tor 或内网连接,第三方就没法替换你看到的交易。