悪意あるElectrumサーバーがブロードキャスト直後のビットコイン支払いを偽のゼロ手数料トランザクションにすり替え――修正は4.8.3で提供
重要ポイント
- •Electrumは、悪意あるサーバーがブロードキャスト済みの支払いをすり替える高深刻度の脆弱性を修正するバージョン4.8.3をリリースし、メンテナーのSomberNightは10月24日にアドバイザリーGHSA-6jp4-8v48-cc5vを公開してアップグレードを呼び掛けた。
- •攻撃が成立したのは、旧バージョンがメモリプールトランザクションの署名を検証しておらず、偽のゼロ手数料トランザクションが保留中として表示され、Replace-By-Feeによる手数料引き上げで被害者のウォレットが攻撃者側のトランザクションに有効な署名を行ったため。
- •2つのTrezorを用いた2-of-3レガシーP2SHマルチシグ環境の被害者に届いた偽トランザクションは、31インプットすべてでバイト単位で同一のscriptSigsを持ち、宛先アドレスは本物の末尾4文字を模してGyQ3で終わっていた。
- •コミット90fe308で導入された修正は、メモリプールトランザクションをローカル履歴に追加する前にウォレット所有インプットの署名を検証するが、未確認の入金はブロックチェーン上で承認されるまでウォレットだけでは完全に検証できない。
- •アップグレードできないユーザーに対し、Electrumは手数料の引き上げを含め署名前にアウトプットのアドレスと金額を確認するよう勧告しており、自分のサーバーにのみ接続していたユーザーは影響を受けていない。

悪意あるElectrumサーバーが、ユーザーがブロードキャストした直後のビットコイン支払いを、類似アドレス宛の偽ゼロ手数料トランザクションにすり替えており、被害者が手数料を引き上げて攻撃者側のトランザクションに署名することを狙ったものだった。Electrumは10月24日、この高深刻度の脆弱性に対処するためバージョン4.8.3をリリースした。メンテナーのSomberNightは同日、アドバイザリーGHSA-6jp4-8v48-cc5vを公開し、ユーザーにアップグレードを呼び掛けた。
攻撃の仕組み
Electrumはライトクライアントであり、完全なビットコインノードを実行せず、未確認のメモリプールトランザクションに関する情報はサーバーに依存している。これはプロジェクト自身のドキュメントにも記載されている。ユーザーがトランザクション(tx1)に署名して送信すると、悪意あるサーバーはそれを止め、資金を攻撃者のアドレスに送る別のトランザクション(tx2)をウォレットに渡すことができる。
tx2は無効な署名を含んでいる。旧バージョンのElectrumはメモリプールトランザクションの署名を検証していなかったため、ウォレットはtx2を保留中として表示し、tx1を非表示にしていた。Replace-By-Fee(RBF)は、送信者が未確認トランザクションをより高い手数料で再ブロードキャストすることを可能にする。偽トランザクションの手数料が引き上げられると、ウォレットは攻撃者側のトランザクションに有効な署名を行ってしまう。これにより、スタックしたように見える支払いの手数料を引き上げるという日常的な操作が、被害者自身のウォレットが攻撃者のトランザクションに署名する瞬間へと変わってしまった。
偽造アドレスは正規の宛先とGyQ3の末尾を共有していた
被害者の一人であるdannydeezyがこの攻撃を記録した構成は、2つのTrezor、31インプット、1アウトプットによる2-of-3のレガシーP2SHマルチシグだった。ユーザーは両方のTrezorでアウトプットを確認した後にブロードキャストした。Trezorはトランザクションがウォレットを離れる前に本物を検証していたが、攻撃者のトランザクションはその後、悪意あるサーバーから渡されたため、デバイス上の検証では確認されなかった。その後、ウォレット履歴には全額が不明なアドレスに未確認で送金されたものとして表示され、後にそのエントリーは「Local」に変わった。Electrumにおいて「Local」は、そのウォレットのみが認識しており、ネットワーク上では見えないトランザクションを示す。
偽トランザクションは、本物のインプット、バージョン、ロックタイムを再現し、31個すべてのインプットでバイト単位で同一のscriptSigsを持っていた。62個の署名はすべて本物のトランザクションに対しては有効だったが、偽物に対しては一つも有効ではなかった。資金のほとんどは類似アドレスに送られ、ごく一部がウォレット自身の使用済みアドレスの一つに戻されていた。
偽物はGyQ3で終わっていた――本物の宛先も同様だった。攻撃者は、正しいアドレスの末尾4文字と一致するアドレスを作り出していた。ZachXBTも、Phantomウォレットのユーザーに影響する同様のアドレスポイズニング詐欺を指摘している。偽装アドレスは、最初と最後の文字を目視確認するだけでは見抜けないように設計されている。
バージョン4.8.3はウォレット所有インプットの署名のみ検証
別のユーザーRaju-K12は10月18日、偽トランザクションの手数料を引き上げて資金を失ったと非公開で報告した。メンテナーによると、一部のサーバーは実際にこの攻撃を実行しているという。
コミット90fe308は、メモリプールトランザクションをローカル履歴に追加する前に、ウォレット所有の「is_mine」インプットの署名検証を追加するものである。バージョン4.8.3は10月23日にgitタグ付けされ、バイナリは翌日にリリースされた。
Electrumは依然としてウォレットが管理するインプットのみを検証しており、未確認の入金トランザクションは検証されない。これはクライアントが完全なスクリプトインタープリターを持たないためである。受取人にとっては、承認されるまで保留中の入金をウォレットだけで完全に検証できないことを意味する。アップグレードできないユーザーへのElectrumの回避策は、手数料の引き上げを含め、何かに署名する前にアウトプットのアドレスと金額を確認することである。自分のサーバーにのみ接続していたユーザーは影響を受けていない。
Electrumは過去にも緊急修正を提供したことがある。2018年1月には、約2年間オープンになっていたJSON RPCインターフェースを閉鎖した。Googleの研究者Tavis Ormandyが、ウェブサイトがポートを検出して資金を流出させられることを発見していた。Cryptopolitanは7月、Coldcardのシード生成バグに関する警告が報じられた同じ日に、約594 BTC(約3,800万ドル)が約500のウォレットから流出したと報じている。