Punycode を利用して URL を偽装するフィッシング攻撃

2017.10.27

Punycode (ピュニコード)(リンク先:英語) は、古代ギリシャの言葉 ΓΝΩΘΙΣΕΑΥΤΟ͝ (汝自身を知れ) のように ASCII では書き表すことのできない言葉を、xn--mxadglfwep7amk6b のように ASCII エンコーディングに変換するための方式です。



これにより、ローマ字 A~Z、数字 0~9、およびハイフン (-) のみを使用して、非 ASCII 文字を含む IDN (国際化ドメイン名) をエンコードすることが可能になります。



これは便利な仕組みです。なぜなら、人間にとって判読可能なサーバー名をコンピュータが判読可能なネットワーク番号に変換するグローバルなドメイン名システム(リンク先:英語) (DNS) は、ドメイン名に含まれる ASCII 文字の一部に限定されていいるからです。



(かつて DNS が成文化された際、ストレージとネットワークの帯域幅は現在よりもはるかに貴重なリソースでした。そのため、文字セットからネットワークパケットにいたるまですべてのサイズの上限が、以前のプロトコルでは厳しく制限されていました。)



ホモグラム攻撃


たとえば、次のドメインを登録するとします。


XN--MXADGLFWEP7AMK6B.EXAMPLE.COM.


最新のアプリケーションの中には、Punycode を認識し、ドメイン名を自動変換して表示するものがあります (下図参照)。


ΓΝΩΘΙΣΕΑΥΤΟΝ.EXAMPLE.COM.


この後の展開はもうお分かりでしょう。



上記の例の I、E、A、Y、T、O、N など、ローマ字の一部の文字と (音は異なる場合がありますが) ギリシャ文字、キリル文字などのアルファベットは同じ形をしています。



したがって、よく知られている ASCII の会社名とは全く違うが、非常によく似た表示になる Punycode のドメイン名を登録できる可能性があります。

たとえば、小文字のギリシャ文字「アルファ、ロー、ロー、イオタ、イプシロン」というテキスト文字列について考えてみましょう。

Punycode では xn--mxail5aa となりますが、実際に表示されるのは (インストールしてあるフォントにもよりますが) αρριϵ です。





Punycode の問題点


先日 Xudong Zheng というセキュリティ研究者が、ブラウザごとに異なる(リンク先:英語)ホモグラフ (同形異義語) 問題への対策について記事を発表しました。



Xudong Zheng 氏が登録したのは xn--80ak6aa92e.com というドメインです。これは、上記のギリシャ文字を使った apple のトリックのキリル文字版で、Punycode からロシア語のテキストに変換し直すと аррӏе と表示されます。

多くのブラウザはこの種の不正に対して積極的な対策を講じています。



たとえば Safari と Edge では、システム設定にキリル文字の言語が含まれていなければ、次のようにそのまま xn--80ak6aa92e.com と表示されます。





そもそもユーザーがキリル文字を読むことができなければ、ドメイン名が Punycode 形式で表示されていても何の影響もありません。実際、紛らわしい偽の英語テキストが表示されていない方が、ユーザーにとっては有益です。



Internet Explorer においても、Punycode 化された言語に適した設定がされていなければ、Punycode の URL がそのまま表示されます。また、アドレスバーに「表示できない文字と記号」が存在していることを通知してくれるポップアップも表示されます (下図参照)。





Chrome と Firefox では、複数のアルファベット/言語が混在している場合、現実にそのような文字列が使用されることはないという理由から、Punycode の URL の自動デコードは行いません。


しかし、Chrome および Firefox は、次のようにすべての文字が同じ言語のものであれば、Punycode の URL を自動変換します。





紛らわしいドメイン名のブロック


どうやら Chrome は次のバージョン (Chrome 58) から、この自動変換を防止するためのブラウザ保護機能を追加するようです。ただし、非 ASCII であっても正規のドメインが Punycode の URL としてブラウザに表示されてしまう可能性があります。



一方、Firefox のプログラマーたちは、Mozilla Foundation はすべての言語を平等に扱うことを目標としているため、この種の保護機能は文化的な配慮に欠けているだけでなく技術的に望ましくない、と強く主張しています(リンク先:英語)



ASCII を特別扱いすべきかどうかを Firefox が決めるべきではない、と Firefox プログラマーは主張しています (ちなみに、ASCII は American Standard Code for Information Interchange (情報交換用米国標準コード) の頭文字です)。

Mozilla チームの中には、Xudong Zheng 氏がブログ記事で使用したような「紛らわしい」ドメインを阻止する責任は、各トップレベルドメイン (TLD) のレジストラにあると示唆する人もいます。



レジストラが不正なドメイン登録や誤解を招くドメイン登録を阻止することを求められているのであれば、(車両登録機関が侮蔑的な意味を持つパーソナライズされたナンバープレートを発行しないように、) 「紛らわしい」ドメインの登録も阻止すべきだと Mozilla は述べています。



しかし、Mozilla チームの全員がこれに同意しているわけではなく、少数の非 ASCII ドメイン名に関して「文化的な配慮に欠けている」ように見られるリスクがあったとしても、フィッシング詐欺が成功しないようにできれば大した代償ではない、としています。



結局のところ、「紛らわしい」ドメイン名を許可するかどうかの決定は、それ自体がそもそも文化的に主観的な行為です。



対策

Xudong Zheng 氏が 2 つの有効な対策を提案しています。これにソフォスが 3 つ目の対策を追加しました。


  • パスワードマネージャーを使用すると、名前が不正なサイトにパスワードを貼り付けるリスクを軽減できます。
    使用されている文字エンコードが何であっても、パスワードマネージャーはユーザーが使用している「ASCII の Apple」のパスワードと「キリル文字の Apple」のドメイン名を一致させることはしません。

  • Firefox に強制的に Punycode のドメイン名を表示させます。
    ローマ字以外のアルファベットや書記体系を読み取る必要がない場合は、about:config ページに移動し、network.IDN_show_punycodetrue に設定してください。

  • 南京錠のアイコンをクリックして、HTTPS 証明書を表示させてください。
    クリックすると、DNS フレンドリーな ASCII 形式で証明書の発行先のドメイン名が表示されます。ドメイン名の先頭が xn-- であれば、アドレスバーにどのように表示されていたとしても、それが Punycode ドメインであることが分かります (注: [View Certificate] オプションで詳細情報を確認できます)。


引用元

おすすめの記事はこちら