DNSに偽の対応情報を覚え込ませ利用者を偽サイトへ誘導する攻撃。
DNSキャッシュポイズニングとは、DNSサーバのキャッシュに偽の対応情報を覚え込ませ、正しいドメイン名を入力した利用者を偽サイトへ誘導する攻撃です。DNS(Domain Name System=ドメイン名システム)は、ドメイン名をIPアドレス(数字の住所)に変換する電話帳のような仕組みです。
身近な例で考えると、町の案内所の住所録に、偽の住所をこっそり書き加えるようなものです。案内所(DNS)を信じた人は、正しい店名を伝えたのに、まったく別の偽の店へ案内されてしまいます。「ポイズニング」は英語で「毒を盛ること」を意味します。
上のツールで▶ボタンを押すと、攻撃者が偽の応答をDNSに覚え込ませ、利用者が偽サイトへ誘導される流れと、DNSSECで攻撃が防がれる様子を確認できます。
DNSは効率化のため、一度調べた対応をキャッシュ(=一時的な覚え書き)に保存し、次回から素早く答えます。攻撃者はこの「覚え書き」を偽情報で汚すことを狙います。鍵になるのは応答のタイミングです。
攻撃は次の順で進みます。
・① 問い合わせ:利用者がドメイン名を尋ね、キャッシュDNSが本物のDNSサーバへ転送する
・② 先回り:攻撃者が、本物の応答が届くより先に偽のIPを答える応答を送り込む
・③ キャッシュ:DNSが先に届いた偽応答を本物と信じて保存する(=毒入りキャッシュ)
・④ 誘導:以降このDNSを使う利用者が、正しい名前を入力しても偽サイトへ案内される
恐ろしいのは、利用者は正しいドメイン名を入力しているのに被害に遭う点です。一度毒が入ると、キャッシュの有効期限が切れるまで多くの利用者が偽サイトへ送られ続けます。上のツールのinject〜cacheステップで、偽応答が先回りで保存される様子を見てください。
結論:DNSの照合が「問い合わせID」だけで、応答が本物かを確かめない仕組みだからです。なぜそれで問題が起きるかを順に見ていきましょう。
キャッシュDNSはドメイン名を調べるとき、外部のDNSサーバへ問い合わせを送ります。このとき「問い合わせID」(16ビット=65536通りの番号)を付けます。返事を受け取ったとき、IDが合っていれば「正しい応答だ」と判断してキャッシュに保存する仕組みです。
攻撃者はこのIDを総当たりで推測し(65536通りなので全部試してもすぐ終わります)、IDが合った偽の応答を本物の返事が来るより速く送り込みます。DNSサーバは先着した応答を本物と信じてキャッシュし、毒入りキャッシュが完成します。以降、本物の応答が来ても「もう知っている」として無視します。
| 攻撃の種類 | 偽サイトへの誘導方法 | 利用者のURL入力 |
|---|---|---|
| DNSキャッシュポイズニング | DNSの回答を偽り、正しいURLなのに偽IPへ飛ばす | 正しい URL を入力(被害に気づきにくい) |
| フィッシング | メールやSMSで偽URLリンクを踏ませる | 偽の URL を踏んでしまう(よく見ると違う) |
| MITM(中間者攻撃) | 通信経路に割り込み、コンテンツを書き換える | 正しい URL (経路の途中で書き換え) |
DNSキャッシュポイズニングが特に厄介なのは、利用者がまったく正しい操作をしているのに騙される点です。フィッシングなら「URLが少し違う」で気づけることもありますが、DNSポイズニングはURLが本物のままなので見た目では判断できません。
また、一度キャッシュに毒が入ると、そのDNSを使っているすべての利用者が被害を受けるのも特徴です(フィッシングは1人ずつURLをクリックさせる必要があります)。被害範囲が広い分、対策(DNSSEC)の重要性も高いと言えます。
根本的な対策はDNSSEC(DNS Security Extensions=DNSにデジタル署名を付ける拡張)です。応答に正規サーバの署名(=改ざんされていない証明)を付け、受け取った側が「本当に正規サーバからの応答か」を検証します。署名のない偽の応答は拒否されるので、毒入りデータはキャッシュされません。
公的な書類に「実印と印鑑証明」を付けるイメージです。署名のない偽の書類は「本物ではない」とすぐに見破れます。これにより、攻撃者が偽の応答を先回りで送っても通用しなくなります。
DNSSEC以外にも、偽応答を「当てにくく」する対策があります。
・問い合わせIDのランダム化:応答に付ける識別番号を予測されにくくする
・送信元ポートのランダム化:問い合わせに使うポート番号を毎回変え、偽応答を合わせにくくする
・ソフトウェアの更新:DNSサーバのソフトを最新に保ち、既知の弱点をふさぐ