
フロントエンド乗っ取り:本物のウェブサイトが牙をむくとき
フィッシング対策のアドバイスの多くは、ひとつのルールに行き着きます。本物のサイトにいるか確認すること。アドレスは自分で入力し、ブックマークを使い、メッセージ内のリンクは無視する。良いアドバイスですが、盲点があります。本物のサイトが、本物のアドレスのまま、悪意あるものを配信し始めることがあるのです。
それがフロントエンド乗っ取りです。分散型アプリの背後にあるスマートコントラクトは完全に安全なままでも、そこにアクセスするためのウェブサイトがひそかに差し替えられ、署名を求められるすべての取引があなたのウォレットを空にするよう仕組まれている、ということが起こり得ます。
ウェブサイトとプロトコルは別物
分散型アプリは二つの部分で構成されています。
- ブロックチェーン上のコントラクト。資金を保管し、ルールを強制します。
- フロントエンド、つまりウェブサイト。データを読み取り、取引を組み立て、署名のためにウォレットへ送ります。
コントラクトは通常、監査済みで公開されており、変更も困難です。一方フロントエンドはごく普通のインフラ上でホストされたごく普通のウェブサイトであり、署名のために何があなたの前に提示されるかを正確に決めています。攻撃者がウェブサイトを支配すれば、コントラクトに手を触れる必要はまったくありません。本物の取引の代わりに自分の取引に署名させればよいだけです。
フロントエンドが乗っ取られる仕組み
- DNS ハイジャック。攻撃者はドメインの設定を奪い(多くの場合、ドメインレジストラやドメインを管理するアカウント経由)、本物のアドレスを自分のサーバーに向けます。ブラウザの URL は正しいのに、サイトは偽物です。
- ホスティングやデプロイの侵害。プロジェクトのホスティング、ビルドパイプライン、デプロイ鍵にアクセスできる攻撃者が、改ざんしたバージョンのサイトを公開します。
- 悪意ある依存関係。サイトが読み込むサードパーティのスクリプトやライブラリ(アクセス解析、UI コンポーネント、ウォレット接続パッケージなど)が侵害され、それを使うすべてのサイトが攻撃者のコードを配信し始めます。
- 注入されたスクリプト。脆弱性を突いて、本来は正当なページに攻撃者がコードを挿入します。
いずれの場合も、訪問中は何もかもが普段どおりに見えます。同じ URL、同じデザイン、同じ流れ。取引リクエストが届くまでは。
攻撃はどのように見えるか
乗っ取られたフロントエンドは、たいてい少数の高価値なリクエストのどれかを狙います。
- 攻撃者のアドレスに対する無制限のトークン承認。普通の「続行するには承認」ステップを装っています。
- NFT の「すべてを承認」。出品や受け取りとして提示されます。
- オフチェーン署名(パーミットやマーケットプレイスの注文など)。後から送信され、追加の確認なしに資金を動かせます。
- 直接送金。入金、受け取り、移行を装っています。
見抜く手がかりは、自分がしていることと署名を求められている内容の食い違いです。少額のスワップに、見覚えのないアドレスへの無制限の許可が必要になるはずはありません。報酬の受け取りに、全資産の送金が必要になるはずもありません。
身を守る方法
ページを見ても、乗っ取られたサーバーは見抜けません。防御の要は署名のステップです。攻撃者の意図はそこで必ず表に出るからです。
- リクエストはウェブサイトではなくウォレットで読む。ページは何でも表示できますが、ウォレットは実際に何に署名するのかを示します。
- 承認ではスペンダーと金額を確認する。見知らぬアドレスや無制限の許可には、きっぱり手を止めるべきです。
- 流れの急な変化を疑う。ある段階で署名や承認を一度も求めなかったサイトが、突然求めてきたら警告サインです。
- 使えるならシミュレーションを使う。取引が何をするのかを事前に確認することで、実際の効果が表示ラベルと異なるリクエストを見つけられます。
- 公式発表に注意する。フロントエンドの侵害を検知したプロジェクトは、たいてい公式チャンネルですぐに警告を出します。何かおかしいと感じたら、署名する前に確認しましょう。
- 不安なら後から取り消す。サイトが侵害されていた期間に何かを承認してしまった場合は、すぐに承認を取り消しましょう。
これはフィッシングに関する従来のアドバイスを置き換えるものではなく、それを補うものです。アドレスの確認は偽サイトからあなたを守り、リクエストを読むことは悪意に染まった本物のサイトからあなたを守ります。
SSP が役立つところ
WalletConnect 経由で接続された分散型アプリが SSP に署名を求めると、リクエストにはどのサイトが求めているか、ネットワーク、アドレスが表示されます。さらに SSP は承認前に一般的な呼び出しをデコードします。送金、承認、NFT の「すべてを承認」リクエストにはラベルが付き、リスクの高いものには明示的な警告が表示されます。メッセージは可能な限り読みやすいテキストで表示され、生データも確認できます。
その後、すべてのリクエストには、別のデバイス上の SSP Key での二度目の承認が必要です。これで乗っ取られたウェブサイトが悪意あるリクエストを出すこと自体は防げません。しかし、リクエストの正体を見抜くはっきりした機会が二度与えられ、そのどちらも攻撃者が支配するページの上ではありません。
チーム向けには、SSP Enterprise のボールトが署名者の承認前に取引シミュレーションとリスク警告を追加します。そのため、侵害されたフロントエンドを通じて作成された提案も、署名する必要のある全員による、独立した二度目のチェックを受けることになります。
率直なまとめ
フロントエンド乗っ取りは、コントラクトにも URL にも手を触れずに、信頼されたウェブサイトを攻撃者の道具に変えてしまいます。アドレスバーを確認しても見抜くことはできません。
あなたにできるのは、すべての署名リクエストを本当のインターフェースとして扱うことです。ウォレットで読み、スペンダー、金額、受取人を確認し、自分がやろうとしていたことと一致しないものはすべて拒否しましょう。


