先頭の六文字と末尾の六文字は同じだった
取引履歴に自分のアドレスと前後が同じ偽アドレスを仕込み、いつかそれがコピーされるのを待つ攻撃がある。ビットコインで実際に 0.1 BTC が抜き取られた事例をブロックチェーンの記録でたどり、イーサリアムでこの攻撃がはるかに安い理由、同じ少額入金がプライバシーを崩すのに使われる仕組み、そしてウォレットでできる対策を整理する。
2025 年 1 月 19 日 02 時 11 分(UTC)、高さ 879,853 のブロックに小さな取引が一つ入った。入力一つ、出力一つ。443 サトシを持つアドレスが 330 サトシを送り、残りの 113 サトシは手数料になった。受け取ったアドレスは bc1qr9xkxanfstzqpfd5ce0t3evwc45pnmsr2wua0h、送ったアドレスは bc1qr9wuw4zkjflet80lr9cr5ec8620c4fg52wua0h だった。
二つを並べると、先頭の bc1qr9 と末尾の 2wua0h が同じだ。間の三十文字は違う。受け取った側の持ち主のウォレットには、自分のアドレスと前後がそっくりなアドレスから入金があった記録が一つ残った。
53 日後の 3 月 13 日 09 時 46 分、受け取った側のアドレスで 1 BTC のコインが使われた。そのうち 0.1 BTC が、前後が同じあのアドレスに送られた。翌日、その 0.1 BTC はさらに別の場所へ移された。これがアドレス・ポイズニング(address poisoning)、アドレス汚染と呼ばれる攻撃だ。
偽の記録を仕込む方法
攻撃は三段階だ。まず、標的のアドレスと前後数文字が同じアドレスを作る。次に、そのアドレスから標的にごく少額を送り、標的の取引履歴に偽アドレスを残す。そして待つ。標的がいつか、アドレスを改めて確かめずに履歴からコピーする日を待つのだ。
似たアドレスを作るのに特別な技術はいらない。鍵を無作為に作り、アドレスを計算し、望む文字が出るまで繰り返す。Bech32 アドレスは一文字が 32 通りなので、合わせる文字が一つ増えるごとに試行回数は 32 倍になる。上の事例で bc1q はすべての SegWit v0 アドレスに共通だから、攻撃者が実際に合わせたのは先頭の r9 の二文字と末尾の六文字、計八文字だ。32 の 8 乗は約 1 兆 1 千億。コンピューター一台で十分に届く数だ。九文字ならその 32 倍、十文字ならさらに 32 倍になる。前後四、五文字だけを確かめる習慣は、攻撃者が負担できるコストの中にちょうど収まっている。
もう一つある。Bech32 アドレスの末尾六文字はチェックサム、つまりタイプミスを検出する値だ。人が最もよく確かめる場所がこのチェックサムなのだが、偽アドレスはタイプミスではなく最初から正しく作られたアドレスなので、チェックサムも合う。ウォレットは何の警告も出さない。
ビットコインでこの攻撃がまれな理由
Casa の Jameson Lopp は 2025 年 4 月、ビットコインのブロックチェーン全体を走査してこの攻撃の痕跡を数えた。入力と出力が一つずつで、入力アドレスと出力アドレスの先頭四文字と末尾四文字が一致する取引を探す方法だった。最初の痕跡は 2023 年 7 月 7 日、高さ 797,570 のブロックにあった。その後 2025 年 1 月までに約 48,000 件が見つかった。
攻撃者が使った額も数えた。被害者に送った少額が合計 0.0684 BTC、手数料が 0.2231 BTC、合わせて約 0.29 BTC。ブロック容量にしてブロック四つ分だ。そして確認された成功例は一件、冒頭の 0.1 BTC だった。汚染取引を受け取ったアドレスの種類は P2PKH、P2SH、P2WPKH で、Taproot(P2TR)アドレスはなかった。Lopp は、この攻撃は手数料が低いときにしか採算が合わないと結論づけた。
冒頭の事例で攻撃資金がどこから来たかも、ブロックチェーンにそのまま残っている。2024 年 11 月 12 日の一つの取引が出力 1,401 個を一度に作り、そのうち 832 個が 443 サトシだった。偽アドレスに入った 443 サトシはその一つだ。この取引の手数料率は vB あたり 2.67 サトシ、二か月後の汚染取引は 109 vB で 113 サトシ、vB あたり約 1 サトシだった。手数料が vB あたり数十サトシに上がれば、汚染一件のコストは数千サトシになる。それを数万回払って一度成功する商売は割に合わない。
ビットコインでこの攻撃が高くつく根本的な理由は、0 円の記録を作れないことにある。履歴に何かを残すには実際のコインが入った出力を作らなければならず、Bitcoin Core は小さすぎる出力を中継しない。この基準をダスト(dust)の上限という。Core のソースの定義は単純で、その出力を使うのにかかる手数料が出力の金額より大きければダストだ。既定のダスト手数料率 vB あたり 3 サトシで計算すると、P2PKH 出力は 546 サトシ、P2WPKH 出力は 294 サトシが上限で、ソースのコメントにそのまま書かれている。同じ式で P2TR を計算すると 330 サトシになる。上の事例の攻撃者が送った額はちょうど 330 サトシだった。受け取り側は P2WPKH だったので 294 サトシでも中継されたはずだが、攻撃者はそれより少し多めに送った。
イーサリアムではなぜ多いのか
アカウント型のブロックチェーンでは事情が違う。イーサリアムのトークン送金は記録上 0 個でありうるし、誰でも作れる偽トークンを送って、履歴に同じ名前のトークンの記録を残すこともできる。攻撃者が払うのはガス代だけだ。Etherscan が 0 のトークン送金を既定で隠し、偽トークンに印を付けるのもそのためだ。
カーネギーメロン大学の研究チームは、イーサリアムと BNB チェーンで二年間に起きたアドレス・ポイズニングを測定し、2025 年の USENIX Security で発表した。攻撃の試みは 2 億 7 千万件、標的になったアドレスは 1,700 万個、実際に送金してしまった被害は 6,633 件、確認された損失は 8,380 万ドルだった。手数料がより安い BNB チェーンのほうが汚染送金ははるかに多かった。ビットコインの 48,000 件とイーサリアムの 2 億 7 千万件、この差がそのままコスト構造の差だ。
大きな被害はたいていこちら側で起きた。2024 年 5 月 3 日には、ある人物が WBTC 1,155 個、当時約 7 千万ドルを偽アドレスに送った。この事件は、攻撃者が一週間ほど後にイーサに換えた資金の大半を返すという珍しい結末を迎えたが、そうした結末は例外だ。2025 年 12 月には約 5 千万ドル分の USDT を失った事例が報じられた。報道によれば、被害者はまず少額でテスト送金をし、その直後に攻撃者が偽アドレスから少額を送って履歴を汚染した。テスト送金でアドレスを確かめたあと、履歴からそのアドレスをコピーして本送金をしたのだ。慎重な習慣が攻撃の入り口になった。
ダストのもう一つの使い道
ビットコインで望まない少額入金が問題になったのは、アドレス・ポイズニングよりずっと前からだ。こちらはお金を盗むためではなく、誰が誰なのかを突き止めるためのものだ。一般にダスティング攻撃(dusting attack)と呼ばれる。
ビットコインのウォレットにあるのは残高ではなく UTXO、つまり使われていないコインのかけらだ。送金するとき、ウォレットはこのかけらをいくつか選んで一つの取引の入力にまとめる。ブロックチェーン分析はまさにこの点を利用する。一つの取引の入力はたいてい同じ人のものだと仮定するのだ(共通入力所有ヒューリスティック)。受け取る側が自分のコインを加えるペイジョインのような例外を除けば、この仮定はたいてい当たる。誰かが私のアドレスに少額を送っておけば、私のウォレットがいつかその少額を他のコインと一緒に使った瞬間、別々のアドレスが一人のものとして結びつけられる。
Bitcoin Core は 2019 年 11 月の 0.19 で、この問題を狙ったウォレットのオプション avoid_reuse を入れた。リリースノートはその理由をこう書いた。
this can eliminate a serious privacy issue where a malicious user can track spends by sending small payments to a previously-paid address that would then be included with unrelated inputs in future payments.
悪意のあるユーザーが一度入金のあったアドレスに少額を送っておくと、その少額が後で無関係な入力と一緒に使われ、支出を追跡されてしまう問題をなくせるという意味だ。このオプションを有効にすると、ウォレットはすでに一度使われたアドレスに届いたコインを、既定でコイン選択から外す。
アドレス・ポイズニングに使われた少額も同じ性質を持つ。330 サトシの P2WPKH コインを使うには、入力一つに 68 vB あまりかかる。手数料率が vB あたり 5 サトシでも使うコストは 340 サトシで、コインの価値を上回る。受け取っても使えないお金であり、うっかり使えば自分のコイン同士のつながりを明かすだけだ。
ウォレットでできること
第一に、アドレスは取引履歴からコピーしない。毎回受取人から新しく受け取るか、最初に確かめたアドレスにラベルを付けてアドレス帳から取り出す。自分のウォレット同士で移すときも同じだ。受け取る側のウォレットで新しいアドレスを作れば、汚染された履歴が入り込む余地はない。アドレスを一度だけ使う原則を守れば、攻撃者が狙う「いつものアドレス」そのものがなくなる。
第二に、確認は前後数文字ではなく全体で行う。上で数えたとおり、前後数文字を合わせるコストは攻撃者にとって負担できる範囲だ。ハードウェアウォレットを使うなら、デバイスの画面に表示されたアドレス全体を受取人のアドレスと照合する。パソコンの画面はクリップボードをすり替えるマルウェアにだまされうるが、デバイスの画面はデバイス自身が署名する取引を示す。
第三に、頼んでいない少額は凍結する。コインコントロールに対応したウォレットでは、特定のコインを使わないよう固定できる。Sparrow は UTXO 一覧の Freeze UTXO で、Electrum は Coins タブの凍結で固定する。Bitcoin Core は lockunspent コマンドでロックするが、既定では再起動で解除されるので、残すには persistent を有効にする。新しくウォレットを作るなら avoid_reuse を有効にしておくのも手だ。
最後に、テスト送金をしたなら、本送金のアドレスは履歴から取らない。最初にアドレスを受け取った場所から改めて取る。テスト送金と本送金の間こそ、攻撃者が狙う隙だ。
まとめ
アドレス・ポイズニングは暗号を破らない。鍵も盗まない。人が長い文字列を扱うやり方、つまり両端だけを見て残りを信じる習慣を利用する。ビットコインでは記録を一つ残すにも実際のコインと手数料がかかるので、この攻撃はまれで高くつくが、0.1 BTC の事例が示すとおり、ないわけではない。履歴は自分がしたことの記録ではなく、誰でも書き込める記録だ。送り先のアドレスは履歴からではなく、受取人から受け取るべきだ。