クリップボード乗っ取り:送金前にアドレスを照合する方法
チェックサムが防げるのは打ち間違いで、差し替えではありません。ビットコイン1,304件・モネロ5,415件の改変アドレスを実際に検証し、本当に効く確認手順をまとめました。
クリップボードは私有の通路ではありません。ほとんどすべてのデスクトップ OS で、それは単一の共有バッファであり、あなたのアカウントで動く任意のプログラムが読み書きできます。確認ダイアログも記録もありません。クリップボード乗っ取りが狙うのはまさにそこです:暗号資産のアドレスらしい文字列を監視し、あなたがコピーした瞬間に自分のアドレスへ差し替えます。貼り付け、形式は正しく、ウォレットは受け取り、資金は出ていきます。これは仮想のフォーマット問題ではありません。模倣できる形式はチェーン上にいくらでもあります。2026年10月24日 17:47:02 UTC に採掘されたビットコインのブロック 972,954 には、660 個の使用可能な出力が五つの形で含まれていました:42文字の P2WPKH が409個、34文字の P2PKH が143個、34文字の P2SH が46個、62文字の P2TR が44個、62文字の P2WSH が18個。コピーした内容の先頭4文字を見れば、乗っ取り側はどの形で返せばよいか分かります。
チェックサムは、この問題を実際より安全に感じさせる原因です。私たちはそのブロックから実在のアドレス bc1q5js6zn25fwvr0zhm537ytt30f2d2fjzuh7gs6n を取り、42 か所それぞれを bech32 の他の文字に置き換えて 1,304 通りの変異を試しました。通ったのは 0 件です。同じことを 4 バイトの Keccak チェックサムを持つ 95 文字のモネロアドレスでも行い、5,415 通りの単一文字変異のうち通ったのは 0 件でした。Base58Check も同じです。1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa を 1 文字変えれば二重 SHA256 の検査に落ち、TRON の USDT コントラクト TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t を 1 文字変えても落ちます。このアドレスは 0x41 のネットワークバイトと 20 バイトに復号でき、末尾 4 バイトがチェックサムです。つまり 1 文字の打ち間違いはほぼ確実に捕まります。議論の欠陥は、乗っ取り側が 1 文字の打ち間違いをしないという点にあります。渡されるのは、チェックサムまで正しく生成された別の文字列です。 (XMR→USDT 出口ルート)
パイプラインの検査はここで終わります。当社の注文エンドポイントのサーバー側検証は長さの上限——256 文字だけ——で、形式とチェックサムの検査は一つ下の流動性プロバイダ側で行われます。どちらの拒否も実在し、今日どちらも実際に発生させました:95 文字のモネロアドレスを 1 文字変えると「… is not valid. Reason: Invalid checksum」が返り、「test」を送ると「invalid destination address」が返ります。途中で切れた貼り付けは捕まりますが、正しく貼れたものは捕まりません。より弱いのは EVM 系です。イーサリアムのアドレスには必須のチェックサムがありません。EIP-55 は大文字小文字にチェックサムを埋め込む仕組みで、しかも混在表記を使ったときだけ効きます。0xdAC17F958D2ee523a2206206994597C13D831ec7 で再計算し一致を確認しましたが、同じアドレスを全部小文字にしても、小文字の 16 進 1 文字を変えても、どのウォレットも受け取ります。ETH と USDT-ERC20 では、打ち間違いを止められるのはあなたの目だけです。 (XMR→USDT 出口ルート)
差し替えを行う面は四つあり、クリップボードはその一つにすぎません。ホスト側のマルウェアはバッファを読み、パターンに一致すれば書き戻します。悪意あるブラウザ拡張はクリップボードすら不要で、貼り付けた後に input の値を書き換えられます。数年前にフィッシングページから保存したアドレスは、アドレス帳が既定で信頼され、ほとんど再確認されないために生き続けます。QR の上書きでは、カメラは一方のコードを見て、画面は別のコードを描画します。これら四つを貫くのは「貼り付け、ちらっと見る、送信」という習慣で、弱いのは「ちらっと見る」の部分です。34 文字のビットコインアドレスで先頭4文字と末尾4文字だけを比べるなら、確認したのは 34 文字のうち 8 文字、約四分の一であり、しかも改ざんされた可能性のあるその画面の上で確認しているのです。
効く確認は地味で、30 秒ほどで終わります:送金に使うのとは別のデバイスで、文字列全体を 1 文字ずつ照合するのです。ハードウェアウォレットで署名するなら、その機器は署名時に宛先を自分の画面に表示します。描画しているのはファームウェアであり OS ではありません。侵害されたホストが書き換えられない唯一の表示です。スワップ注文や取引所へ支払う場合、宛先はスマホ側にあります:受け取り用ウォレットを開き、受け取りをタップし、デスクトップの画面と突き合わせて読みます。QR はクリップボードを完全に迂回するので、攻撃面を一つ丸ごと消せます。ただし受け取り側ウォレット自身の画面から読み取り、コードの下に印字されたアドレス文字列も必ず読んでください。QR の差し替えは実在する手口です。こうして一度確認したアドレスはウォレットのアドレス帳に保存し、以後は保存済みの項目だけを使います。チャットから再コピーするのが、二度目にやられる典型的な経路です。
ブロードキャスト後はどれも取り戻せません。だからこそ送金前の確認だけが意味を持ちます。ビットコインのトランザクションは署名時に RBF を有効にした場合しか置き換えられず、スワップの入金ではほとんど有効化されません。モネロ、TRON、イーサリアムの送金は承認されれば確定です。スワップ注文で自分が管理するアドレスは支払先だけではありません。返金先も同じで、失敗の仕方も同一です:返金先が差し替えられれば、失敗した注文は寄付に変わります。知っておく価値のある非対称性があります。注文ページの入金アドレスはプロバイダが注文ごとに生成し、専用の QR 付きで表示されます。あなたのクリップボードを通らないので、乗っ取り側に差し替える対象がありません。あなたの責任になるのは、自分で入力または貼り付ける二つ——支払先と返金先です。
多くの人は「まず少額を送って試す」に手が伸びます。自分で管理するウォレット宛なら計算は合います。今日のレートで 141 vB のビットコイン取引は 1 sat/vB なら 141 サトシ、BTC が 80,255 ドルなら約 0.11 ドル。モネロの 1 入力 2 出力は 1,534 バイトで、20,000 piconero/バイトの下限なら 0.00003068 XMR、2 セント未満です。USDT-TRC20 の送金は 64,285 のエネルギー(6.4285 TRX)に 345 バイトの帯域(0.345 TRX)、TRX 0.3295 ドルで約 2.23 ドル。通用しないのは、スワップ注文で試すやり方です。USDT-TRC20 から XMR の下限は現在 19.741234 USDT。実際の見積り——100 USDT が 0.14558008 XMR、5,000 が 8.18028676——を当てはめると、限界価格は 1 XMR あたり 609.85 USDT、注文あたりの固定費は約 11.22 ドルになります。下限で出すと、この固定費は送金額の 56.8% です。試すなら自己管理ウォレットへの送金で試し、スワップ注文では試さないこと。 (XMR→USDT 出口ルート)
正直な限界:入力している機械がカーネルレベルで侵害されていれば、その機械上で行う確認は何の意味も持ちません。ウォレットのアドレス表示も、ブロックエクスプローラも、QR コードも同様です。だからこそ手順はソフトウェアではなく二台目のデバイスを軸に組みます。実際のマルウェアに耐える習慣はどれも小さなものです。全文字を照合していないアドレスをクリップボードに載せない。検証済みのアドレス帳を維持し、チャットからの再コピーをやめる。貼り付けたばかりのアドレスは、先週使ったものと同じでも信頼しない——そこが乗っ取り側の変えるポイントだからです。失って困る金額なら、送信ボタンの前にハードウェアウォレットの画面かスマホで声に出して照合する。特別なことではありません。30 秒の遅れと、誰にも取り返せない送金の差です。