情報処理試験でのセキュリティ問題(DNSキャッシュポイズニング編)


情報処理試験でのセキュリティ問題

ターゲット

経験の浅いエンジニアおよび、情報処理試験に挑戦しようとしている方、ITに関してプログラミング以外も知識を増やしたい方。

まえがき

情報処理試験でのセキュリティ問題は午後の必須化を始め、重点の置かれ方が変わってきています。結構前からっちゃ前からなんですけど。
そのため、情報処理に出てくる午前問題のセキュリティについてをまとめていきます。どれも重要なんで、紹介の順番は順不同です。

なんで情報処理試験についての記事を書くかというのは私の別記事参照です。
「ただのプログラマ」で終わらないためには

私の知識も完璧ではありません。学習者や私のためにもなりますので、間違いがあればご指摘ください。攻撃的なコメントはお控えください。泣きます。

DNSキャッシュポイズニング攻撃

平成30年の春秋両方に出題されていた(気がする)頻出の問題です。名前もよく耳にしますね。
DNSとはなにか?については厳密にはセキュリティ問題とは異なるため、別にします。

さて、本題です。DNSキャッシュポイズニング攻撃は、その名の通り、DNSキャッシュサーバに毒で冒しまっせって攻撃です。
DNSサーバにも、毎回問い合わせする時間を短縮させるためにDNSキャッシュサーバがあります。そのキャッシュサーバにももちろんDNS情報があるわけですが、この攻撃はDNSキャッシュサーバに偽のDNS情報をキャッシュとして登録させることで、利用者を偽のWebサイトに誘導する攻撃です。

基本情報ではない知識ですが、DNSの名前解決はその性質によって再帰的な問合せ反復(非再帰的)問合せに区別されます。
名前は「なんじゃそりゃ」って思いますが、どんな問い合わせをしているか、という内容はいたって簡単です。

再帰的問合せ

クライアントPCから名前解決要求を受けたDNSキャッシュサーバが他のDNSサーバに代理で問合せを行い、最終的な結果を返す必要のある問合せのこと

このクライアントPCをResolver(リゾルバ)と言います。

キャッシュサーバは、この問い合わせ内容を自身にキャッシュとして残しておき、次回以降の問い合わせに素早い対応をすることが可能になります。
このキャッシュが毒に侵されてしまいます。

反復(非再帰的)問合せ

DNSキャッシュサーバが、名前を解決できるまで繰り返し他のDNSサーバに行う問合せのこと

攻撃内容

1回目

リゾルバ「なんちゃら.comのIPアドレス教えて!」
DNSキャッシュサーバ「ほいきた。DNSサーバーに聞いてくるわ」
各種DNSサーバ「a.b.c.d だよ」
DNSキャッシュサーバ「a.b.c.dだってさ!(次回用に自分に書き込んどこ)」

2回目(正常)

リゾルバ「なんちゃら.comのIPアドレス教えて!」
DNSキャッシュサーバ「おっ、待ってました、前と同じだね!a.b.c.dだよ!」(1回目より早い応答が可能)

3回目(DNSキャッシュポイズニングに攻撃された状態)

悪いやつ「IP変えてやろ」

リゾルバ「なんちゃら.comのIPアドレス教えて!」
DNSキャッシュサーバ「おっ、待ってました、前と同じだね!o.p.q.rだよ!」(書き換えられたIPを返却してしまう)

リゾルバ「変なページじゃんか!!!」

という具合です。

この攻撃の具体的な動きを以下に記します。

悪いリゾルバ(攻撃者)「なあなあ、俺にもなんちゃら.comのIPアドレス教えて」( 偽の再帰的問合せ )
DNSキャッシュサーバ「ほいきた。DNSサーバーに聞いてくるわ」
各種DNSサーバ「a.b.c.d だy
悪いリゾルバ(攻撃者)「いやいや o.p.q.r だよ^^こっちがただしいよ^^」
DNSキャッシュサーバ「o.p.q.rだってさ!(次回用に自分に書き込んどこ)」

とまあこんな具合にキャッシュサーバに偽の情報を書き込ませて、正しい情報を破棄させます。

対策

キャッシュサーバへの再帰的問合せの役割は、内部ネットワークから外部ネットワークに接続する際の名前解決です。原則として外部からの再帰的な問合せに応じる必要はないんですよね。会社の出入り口のようなもので、内部の方のリクエストにのみ応じていればいいんです。
DNSキャッシュポイズニングは、外部からの(見ず知らずの人からの)問い合わせに応えてしまっていることがことの発端なので、リクエストを受け付けるホストを、内部ネットワークだけに限定することが対策になります。

また、DNSキャッシュサーバは、DNSサーバからのポート番号、IPアドレス、トランザクションIDが自分の知っている情報と一致して初めて「DNSの情報だな、よし、キャッシュに登録しよう」と認めます。則ち、DNSキャッシュポイズニングが成立するためにはポート番号、トランザクションIDなど、必要な情報が推測しやすいようなものになっていると、正しい応答だ、と誤認させる原因にもなります。

最後に

会話形式にしたのが若干滑ってしまった感は否めません。若干後悔しています。

本記事のような内容は、プログラムとは直接関係ないけどいいのかな、って不安になったので運営に問い合わせたところ、「技術者の役に立てばいいですよ(要約)」という返答が来たので引き続きまとめていきたいです。

交流などはぜひTwitterからどうぞです~!

ご意見ご感想、コメントでもなんでもお待ちしております。

改訂履歴

(2019/09/03) 作成 DNSキャッシュポイズニング攻撃について