フューチャー技術ブログ

IPAの過去問で学ぶDNSキャッシュポイズニングの攻撃手法と対応策

title.png

はじめに

こんにちは。TIG 村瀬です。

情報処理推進機構(IPA)のネットワークスペシャリスト試験の過去問を解いていて興味深い問題がありました。

対象の試験は ネットワークスペシャリスト試験 令和元年度 午後Ⅱ 問2
過去問はこちらからダウンロード可能です。
  
この問題の中でSYNフラッド攻撃、DNSキャッシュポイズニング、C&C(Command & Control)サーバの攻撃手法と対応策が記載されています。

ネットワークの試験ではあるものの内容としてはセキュリティに関するものです。DNSキャッシュポイズニングという攻撃があるのは知っていたのですが、攻撃手法と対応策を知らなかったので自分の知識を整理するためにブログにしてみました。

当たり前ですが、このブログでは犯罪行為を推奨するものではなく、セキュリティ意識、対策の向上を目的として記載しております。

DNSとは

DNSキャッシュポイズニングの説明をする前にDNSについておさらいします。

DNS(ディーエヌエス: Domain Name System)とはインターネットなどのIPネットワーク上でドメイン名(ホスト名)とIPアドレスの対応を管理するシステムです。

DNSがあるおかげで利用者はブラウザにURLを入力するだけで目的のWEBページを見ることができます。目的のWEBページが表示されるまでの過程で利用者が意識することなくDNSの名前解決によってドメイン名(ホスト名)からIPアドレスを取得しています。

インターネットを支える縁の下の力持ちですね。

DNSキャッシュポイズニングとは

DNSキャッシュポイズニングとはDNSのキャッシュを書き換えることでDNSの名前解決で本来あるべきIPアドレスではなく、攻撃者が用意した悪意のあるサーバのIPアドレスを返却すること。これがなされると悪意のあるサーバでフィッシングなどが行われます。不正なURLを利用する一般的なフィッシングとは異なり、正規のURLで悪意のあるWEBページが表示されることになるので注意深いユーザであっても気が付くのは困難になります。

なぜキャッシュを書き換えられるのか

試験問題を読むと理解しやすかったので抜粋します。

DNSキャッシュポイズニング攻撃は、次の手順で行われる。
(ⅰ)攻撃者は、偽の情報を送り込みたいドメイン名について、標的のフルリゾルバサーバに問い合わせる。
(ⅱ)フルリゾルバサーバは、指定されたドメインのゾーン情報を管理するコンテンツサーバに問い合わせる。
(ⅲ)攻撃者は、コンテンツサーバから正しい応答が返ってくる前に、大量の偽の応答パケットを標的のフルリゾルバサーバ宛てに送信する。
(ⅳ)フルリゾルバサーバは、受信した偽の応答パケットをチェックし、偽の応答パケットが正当なものであると判断してしまった場合、キャッシュの内容を偽の応答パケットを基に書き換える。

ネットワークスペシャリスト試験 令和元年度 午後Ⅱ 問2 から抜粋(試験問題に関する表記を改変しています。)

問題文に記載のある通り、フルリゾルバサーバが偽の応答パケットを正当なものと判断してしまうため、誤った情報がキャッシュされてしまいます。

もう少し詳細に説明すると上記のDNSのやりとりはTCPではなく、UDPで行われます。UDPでは通信相手を確認することなく処理が行われるため、攻撃者は偽のパケットを容易に作成することができます。

問合せに対する応答は先に届いた情報が利用されるので、正当な応答パケットよりも先に偽の応答パケットがフルリゾルバサーバに受信されると攻撃が成功してしまうのです。

図で表すと以下のようになります。

通常時の名前解決

問合せに対して応答が1つだけなされます。その応答の情報がキャッシュされます。

通常時の名前解決

DNSキャッシュポイズニングが行われる場合

正規の応答が行われるタイミングに合わせて正当なものであると判断されうる大量の偽の応答パケットを送信します。
DNSキャッシュポイズニング

攻撃者は宛先ポート番号と識別子が何かわからないのでこれらを変更した応答パケットを大量に送信することになります。全てのパターンを網羅する場合には宛先ポート番号 * 識別子の全ての組み合わせになります。宛先ポート番号が固定の単一のポートであった場合、識別子は16ビットのため65,536パターンになります。

なお、応答パケットに必要なその他の情報であるフルリゾルバサーバのIPアドレス、コンテンツサーバのIPアドレス、送信元ポート番号は攻撃者が容易に把握できるものになります。

対応策

大別して2つの方法があります。

対応策1 送信元ポート番号のランダム化

ネットワークスペシャリスト試験 令和元年度 午後Ⅱ 問2 から抜粋します。

(ⅱ)の問合せパケットの送信元ポート番号には特定の範囲の値が使用されるケースが多いので、攻撃者は、(ⅲ)の偽の応答パケットを正当なパケットに偽装しやすくなるという問題がある。調査の結果、この問題の対応策には、送信元ポート番号のランダム化があることが分かった。

DNSキャッシュポイズニング攻撃が成立する条件の必要条件として、問合せパケットの送信元ポート番号と応答パケットの宛先ポート番号が一致し、かつ問合せパケットの識別子と応答パケットの識別子が一致することが挙げられます。固定であった送信元ポート番号をランダムにすることで攻撃が成功する確率をぐっと下げることができます。

100個のポート番号を利用するだけでも成功率を1/100にすることができます。ポート番号を仮に30,000個利用する場合の全ての組み合わせは、30,000 * 65,536 = 1,966,080,000パターンになるので攻撃者からしてみると用意するのが辛い数になります。

対応策2 フルリゾルバサーバに対する攻撃者からの名前解決要求の禁止

また、試験問題と解答にもあるとおり、そもそもの話、フルリゾルバサーバに対して攻撃者から名前解決の要求を禁止することが効果的です。
試験問題では外部DNSサーバ上でフルリゾルバサーバとコンテンツサーバが稼働しているため、(試験問題の都合上)インターネットからの名前解決要求を許容していました。

フルリゾルバサーバに対する攻撃者からの名前解決要求の禁止

ネットワークスペシャリスト試験 令和元年度 午後Ⅱ 問2から引用

試験問題と解答を踏まえてフルリゾルバサーバとコンテンツサーバの分離後のあるべき姿を整理すると以下の通りです。

  • フルリゾルバによるインターネット上のホストの名前解決はFPサーバとメール中継サーバからの要求に応答できればよい。
  • コンテンツサーバは、インターネット上の不特定のホストからの名前解決要求に応答する必要がある。

フルリゾルバサーバは社内(DMZ)からの名前解決要求だけ許容すれば良いため、インターネットからのフルリゾルバサーバに対する名前解決要求をファイアーウォールで防ぐことが重要です。
この対応により攻撃者はインターネットからフルリゾルバサーバに対して名前解決要求をできなくなります。
ちなみにコンテンツサーバにはインターネットからの名前解決要求が来ますが、DNSキャッシュを持たないので問題ありません。

さいごに

DNSキャッシュポイズニングという言葉自体は知っていたものの、キャッシュを書き換える仕組みや対応策を知らなかったのでネットワークスペシャリスト試験の勉強をすることで知識が身に付きました。

セキュリティは重要ですが、やみくもに恐れてはセキュリティ対策コストがいくらあっても足りません。どういった仕組みで攻撃が成功するかを適切に理解しておくことで、費用対効果の高いセキュリティ対策やインフラ設計ができるようになるはずです。

日々新たな脆弱性が見つかる状況であるため、100%安全と言い切れるネットワークを作ることはできません。しかしそのような状況であっても攻撃に合う確率を如何に0%に近づけるかがネットワーク(セキュリティ)エンジニアの腕の見せ所かと思います。

今回はDNSキャッシュポイズニングに焦点を充てて記載しましたが、SYNフラッド攻撃、C&C(Command & Control)サーバも興味深いのでそのうちまとめてみようと思います。