図1 通信のあて先を覚えておいて,次回以降に役立てる(イラスト:なかがわ みさこ)
図1 通信のあて先を覚えておいて,次回以降に役立てる(イラスト:なかがわ みさこ)
[画像のクリックで拡大表示]
図2 偽の情報を仕込んで,偽サイトにユーザーを誘導する(イラスト:なかがわ みさこ)
図2 偽の情報を仕込んで,偽サイトにユーザーを誘導する(イラスト:なかがわ みさこ)
[画像のクリックで拡大表示]

 DNSキャッシュ・ポイズニングは,DNS(domain name system)サーバーに,偽の情報を仕込む攻撃のことである。DNSサーバーはもとより,DNS機能を内蔵したルーターなども攻撃対象になるため,被害が広範囲に及ぶ危険性がある。

 DNSサーバーは,クライアントから要求されたドメイン名のIPアドレスを調べ,そのIPアドレスをクライアントに返答する。Webアクセスの場合でDNSの基本的なしくみをみてみよう。利用者はWebブラウザのアドレス入力欄に「www.nikkeibp.co.jp」などと入力する。するとクライアントは,DNSサーバーに対して「www.nikkeibp.co.jpのIPアドレスは?」という要求を送る。この要求を受け取ったDNSサーバーは,インターネット上にある他のDNSサーバーに問い合わせて,最終的にクライアントに「IPアドレスはx.x.x.x」という応答を返す。

 またDNSサーバーは,クライアントからの要求に効率的に応答するために「キャッシュ」というしくみを備えている。DNSサーバーは,一度調べたドメイン名とIPアドレスの情報を,記録(キャッシュ)しておく(図1)。そして,再び同じ内容の要求を受けたときに,キャッシュしておいた情報を返す。こうすることで,クライアントからの要求を効率よくさばく。

 DNSキャッシュ・ポイズニングは,このキャッシュに偽の情報を教え込む攻撃だ。手順は,まずターゲットとなるDNSサーバーに要求パケットを送る。その直後に,偽の情報を記載した応答パケット送り付ける。正規の応答パケットが届く前に,偽の情報を記載した応答パケットを送り込むことで,偽の情報をキャッシュさせる。

 偽の情報をキャッシュさせられたDNSサーバーは,クライアントのDNS要求に対して,偽のアドレス情報を返答する。その結果,クライアントは偽のアドレスにアクセスすることになるので,攻撃者にパケットの内容を盗み見られたり,フィッシング詐欺の標的にされる危険性が出てくる(図2)。

 DNSには,要求と応答を対応付けるために,DNSパケットのヘッダー部分にID番号を記載するしくみがある。例えば,ID番号が100番の要求パケットをDNSサーバーが送ったとしたら,同じ100番のID番号を持つ応答パケットが返ってきたときに,自身が要求したパケットに対する応答パケットとみなして受信する。

 ただし,このDNSパケットのID番号は16ビット分しかない。個数にすると6万5536個である。攻撃者は,大量のパケットを送信できる攻撃ツールを使う。こうしたツールを使えば,1秒間に数万パケットを送り付けることは難しくない。そうなると,かなり高い確率でDNSサーバーに偽の情報を仕込むことが可能になる。

 例えば,DNSパケットのID番号を32ビットに増やせば,攻撃を受ける確率を大幅に下げることができる。しかし,DNSのプロトコル自体はIETFによって標準化されたものであり,仕様を急に変更することはできない。

 また,DNSの応答パケットが正式のものか虚偽のものかを判断する「DNSSEC」(DNS security extension)というしくみを利用する手もある。しかしDNSSECは,パケットの検証に公開鍵暗号方式を使うため,運用ノウハウが別途必要になることもあり,あまり利用されていない。

 そこで,DNSサーバー・ソフトを提供するベンダーやDNS機能を実装した機器のメーカーは,プロトコル自体は変えずに攻撃を受けにくくするパッチを公開している。

 従来,DNS機能を搭載する機器は,DNSの要求パケットを送る際,特定の1個の送信元ポート番号を使っていた。今回,各ベンダーやメーカーからリリースされたパッチでは,DNSの要求パケットを送信する際に使う送信元ポート番号をランダムに変更する。こうすると,攻撃者が攻撃を成功させるためには,DNSパケットのID番号のほかに,ポート番号も一致させなければならない。これにより,安心できるレベルまで攻撃を受ける確率を下げることができる。