DNS(Domain Name System)は、IPアドレスとドメイン名を管理する仕組みのこと。
まず正常時の動き、次にDNSキャッシュポインズニングで攻撃を受けた時の2つの動作を説明します。
正常時
まずは通常の問題がない場合の名前解決の動きです。
①クライアント(ブラウザでアクセスしようとするユーザー)はまずDNSキャッシュサーバーに問い合わせます。この時、DNSキャッシュサーバーが既に情報を持っていれば、それが返されます(有効期限:TTLが有効な場合)。
②DNSキャッシュサーバーは、クライアントから問合せを受けたサイトの情報を持っていない場合、原本となる情報を持っている外部のDNSコンテンツサーバーに問い合わせます。
③DNSコンテンツサーバーが、DNSキャッシュサーバーにサイトAのIPアドレスを含む情報を返します。この時、DNSキャッシュサーバーは一定期間、名前解決の情報をキャッシュします。
④クライアントにサイトAのIPアドレスを返します。
⑤クライアントのブラウザが、サイトAにアクセスします。
これが正常の流れ。
DNSキャッシュポインズニング攻撃を受けた場合
攻撃者は、DNSキャッシュサーバーに偽装した情報を仕込み、サイト閲覧者を、本来とは異なる別の不正なサイトへ誘導します。
ドメイン名は本来のままなので(www.yahoo.co.jpとか)、一見、偽サイトかどうかが判断できません。
①まず攻撃者はDNSキャッシュサーバーに対してサイトAの名前解決を依頼します。
②DNSキャッシュサーバーはDNSコンテンツサーバーに問合せます。ここまでは通常の動作。
③DNSコンテンツサーバーが応答する前に、攻撃者が誘導先である偽のIPアドレスを含む、偽装した回答をDNSキャッシュサーバーに返します。
こうしてDNSキャッシュサーバーに不正なサイトへのIPアドレスを仕込みます。
この状態になると、クライアントがサイトAのドメイン名にアクセスした時、クライアントは攻撃者が仕込んだIPアドレスを見に行ってしまいます。
DNSキャッシュポイズニングはURL自体は真正であるため、一見、偽装の判断ができません。
DNSキャッシュポイズニングへの対策
旧来はDNSのデータにIDを付与することで対処していたようです。
が、このデータは16bitしかなく(要するに65536通りしかない)、総当たり(もしくはIDの推測)をすれば、偽装回答が成功してしまうようです。
根本的にはDNSSECへの対応、また、問合せ時のポートをランダムにすることで汚染の成功確率を低くする、という方法があります。
DNSSEC
応答に電子署名が付与されるので、DNSコンテンツサーバーからの応答が真正であると保証できます。但し、DNSキャッシュサーバーなどをDNSSECの仕組みに対応させなければいけません。
ただ、どうも、まだ十分には普及していないのが問題であるようです。
ポートランダマイゼーション (Port Randomization)
DNSキャッシュサーバーからDNSコンテンツサーバーに対しての、問合せ時の送信元ポート番号をランダムにし、偽装された回答を受け入れる確率を下げる、というもの。
根本的とは言わないまでも、攻撃の成功率を下げることはできるようです。
参考サイト
- JPNIC「インターネット10分講座:DNSキャッシュポイズニング」2008
- 情報処理推進機構「DNSキャッシュポイズニング対策」2009
- 日経×TECH「DNSの課題はセキュリティ、新技術普及は道半ば」2018