見た目は同じ、中身は別物 - Unicode の視覚的攻撃
apple.com と аpple.com は同じに見えますか? 実は違います。2 つ目の URL の最初の「а」はラテン文字の「a」ではなく、キリル文字の「а」(U+0430) です。人間の目には区別がつきませんが、コンピュータにとっては完全に別の文字であり、別のドメインです。
Unicode は世界中の文字を統一的に扱える画期的な仕組みですが、その豊富な文字セットがセキュリティ上の脅威にもなっています。
ホモグラフ攻撃 - 偽ドメインの作り方
ホモグラフ攻撃 (IDN homograph attack) は、見た目が同じ (または酷似した) 異なる文字を使って偽のドメイン名を作成する攻撃です。
- ラテン文字の「a」(U+0061) とキリル文字の「а」(U+0430)
- ラテン文字の「o」(U+006F) とキリル文字の「о」(U+043E)
- ラテン文字の「p」(U+0070) とキリル文字の「р」(U+0440)
- ラテン文字の「e」(U+0065) とキリル文字の「е」(U+0435)
これらを組み合わせると、аррle.com (先頭の「а」と 2 つの「р」がキリル文字) のように、apple.com と視覚的に区別できないドメイン名を作成できます。フィッシングサイトの URL として使われれば、注意深いユーザーでも騙される可能性があります。
ブラウザの対策
主要なブラウザは、ホモグラフ攻撃への対策として、混合スクリプト (複数の文字体系が混在する) のドメイン名を Punycode 表記で表示します。先の аррle.com はキリル文字とラテン文字が混ざっているため、アドレスバーには xn--le-6kc8da.com と表示され、偽装が一目で分かります。
ただし、ラテン文字の「l」に似たキリル文字パロチカ (U+04CF) を使えば、ラベル全体をキリル文字だけでそろえた綴り (аррӏе.com = xn--80ak6aa92e.com) も作れます。Unicode の技術標準 UTS #39 が「whole-script confusable」と呼ぶこの形は、混合スクリプトという条件に当てはまらないため、ブラウザ側は「よく知られたドメインと紛らわしい単一スクリプトのラベルも Punycode 表示する」といった判定を重ねる必要があります。
見えない文字 - ゼロ幅文字の脅威
Unicode には、画面上に表示されない「ゼロ幅文字」が複数存在します。
- U+200B: Zero Width Space (ゼロ幅スペース)
- U+200C: Zero Width Non-Joiner
- U+200D: Zero Width Joiner
- U+FEFF: Zero Width No-Break Space (BOM)
これらの文字は目に見えませんが、文字列の比較やハッシュ計算には影響します。
- 透かし (ウォーターマーク): 機密文書にゼロ幅文字を埋め込み、漏洩時に誰が流出させたかを特定する手法がある。各受信者に異なるパターンのゼロ幅文字を挿入すれば、流出した文書のパターンから漏洩者を特定できる
- パスワードの問題: コピー & ペーストでパスワードを入力する際、ゼロ幅文字が混入すると「正しいパスワードなのにログインできない」という事態が発生する
- コードの改ざん: 見た目は同じでも動作が異なるソースコードを作る攻撃。2021 年に公表された Trojan Source (CVE-2021-42574) がこの手口の代表で、中心となるのは次節の方向制御文字であり、ゼロ幅文字や同形文字はその変種として使われる
方向制御文字 - テキストの流れを操る
Unicode には、テキストの表示方向を制御する文字があります。アラビア語やヘブライ語は右から左に書くため、これらの制御文字は正当な用途を持ちますが、攻撃にも悪用されます。
- U+202E: Right-to-Left Override。この文字以降のテキストを強制的に右から左に表示する
例えば、ファイル名 document_fdp.exe は、画面上では document_exe.pdf と表示されます。ユーザーは PDF ファイルだと思ってダブルクリックしますが、実際には .exe ファイル (実行ファイル) です。
開発者が注意すべきこと
- ユーザー入力を受け付ける際、ゼロ幅文字や方向制御文字をサニタイズ (除去) する
- ドメイン名の検証では、Punycode に変換してから比較する
- ファイル名の表示では、方向制御文字を除去またはエスケープする
- コードレビューでは、ゼロ幅文字の混入を検出するツール (例:
grep -P '[\x{200B}-\x{200F}\x{202A}-\x{202E}]') を使用する
まとめ
Unicode は世界中の文字を統一的に扱える偉大な仕組みですが、その豊富さがセキュリティの脅威にもなっています。ホモグラフ攻撃、ゼロ幅文字、方向制御文字 - これらの脅威を知っていれば、フィッシングサイトの URL や不審なファイル名に対する警戒心が高まります。IP 確認さんにアクセスする際も、URL バーのドメイン名が正しいことを確認する習慣をつけてください。
この記事の関連用語
よくある質問
ホモグラフ攻撃では Unicode のどんな性質が使われますか?
字形が似ていてもコードポイントは別物という性質です。ラテン文字の a は U+0061、キリル文字の а は U+0430 で、ドメイン名は Punycode に変換されてから解決されるため、見た目が同じでも 1 文字違えば別のサーバーに届きます。
ゼロ幅文字とは何ですか?
画面上に表示されない Unicode 文字です。文字列の比較やハッシュ計算には影響するため、パスワードへの混入、機密文書の透かし、ソースコードの改ざんなどに悪用されます。
ブラウザはホモグラフ攻撃を防いでいますか?
主要ブラウザは複数の文字体系が混ざったドメイン名を Punycode 表記で表示します。ただしラベル全体を 1 つの文字体系でそろえた綴り (UTS #39 の whole-script confusable) はこの条件に当てはまらないため、ブラウザはよく知られたドメインとの紛らわしさも併せて判定しています。表示された名前を信じきらず、綴りを 1 文字ずつ確かめる習慣が最後の防壁になります。