SPN セキュリティ技術解説セミナー DNS におけるキャッシュ汚染攻撃 2008 年 10 月 25 日 ( 土 ) 2008 年 11 月 3 日改訂 塩月誠人 <mshio@sec-pro.net> 合同会社セキュリティ プロフェッショナルズ ネットワーク
本セッションの概要 DNS はインターネットを利用する際に誰もがお世話になる非常に基本的なサービスです そのため DNS サーバにおけるセキュリティ侵害は 多くのインターネット利用者に重大な影響を与えかねません 中でも DNS キャッシュの汚染は 効果的なファーミング攻撃手法として特に近年注目されています 本セッションではこの DNS キャッシュ汚染が発生する仕組みについて クエリ ID の予測 バースデイアタック 古典的キャッシュ汚染攻撃 (Ka shpureff Attack) Kaminsky's Attack といった手法を例に挙げ解説するとともに その対策方法について考察します 2
DNS とは DNS Domain Name System 平たく言うと ホストの名前と IP アドレスを関連付ける仕組み 名前の例 www.example.co.jp IP アドレスの例 192.168.1.1 名前から IP アドレスを調べる 正引き IP アドレスから名前を調べる 逆引き www.example.co.jp? www.example.co.jp? 192.168.1.1 192.168.1.1 組織内の DNS サーバ インターネット上の DNS サーバ群 3
DNS の階層構造 ルート "." arpa mil edu org com jp in-addr co ad ac or 218 example 45 www 192.168.1.1 www2 4
DNS における名前解決の仕組み ルート DNS サーバ 権威 の 委任 net の NS 反復的問い合わせ Iterative Query ドメイン net DNS サーバ 権威 の 委任 ドメイン sec-pro.net DNS サーバ sec-pro.net の NS 61.12.249.254 キャッシュDNSサーバ組織内 DNSサーバ 61.12.249.254 権威 DNS サーバ cache 再帰的問い合わせ Recursive Query 5
一般的な DNS の問題点 情報の漏洩 BIND バージョン情報の取得 (BIND に固有の問題 ) ゾーン転送 情報の改竄 不正な情報の挿入 ダイナミックアップデート 偽造 DNS リプライの挿入 DNS キャッシュの汚染 外部からの再帰的問い合わせ 資源の浪費 (CPU キャッシュ ) 各種 DNS サーバ攻撃の助長 Pharming 攻撃に利用 その他 DNS サービスのバグによる各種脆弱性を利用した攻撃 ( サービス妨害 不正コードの実行 ) 6
Pharming の脅威 Phishing エサ ( 電子メール等 ) を使って一本釣り Fishing( 釣り ) から派生した造語 不正な電子メール等を用い 犠牲者を偽サイトに誘導 Pharming タネ ( 不正な名前解決 ) をまいて 一気に収穫 Farming( 農場経営 ) から派生した造語 ホストの名前解決の仕組みを不正に操作し その仕組みを利用する犠牲者すべてを偽サイトに誘導 DNS の情報を不正に操作 いずれも主としてオンライン詐欺 ( カード番号やパスワード等の不正取得 ) に利用 Pharming の方が効率的かつ効果的 The Pharming Guide http://www.ngssoftware.com/papers/thepharmingguide.pdf 7
Pharming の概念 不正に介入 攻撃者 WWW. 銀行.JP DNS による名前解決 10.1.1.1 クライアント 192.168.1.1 偽の 銀行 Web サイト 10.1.1.1 本物の 銀行 Web サイト 192.168.1.1 8
各種 Pharming 手法 ホストファイルの改ざん DNS リプライの詐称クエリ クエリ リプライ ルート DNS サーバ クエリ リプライ クエリ JP DNS サーバ 不正なダイナミックアップデート ドメイン名の乗っ取り クライアント 参照 ホストファイル (/etc/hosts 等 ) リプライキャッシュDNSサーバ参照格納キャッシュ リプライ Kashpureff タイプのキャッシュ汚染 Kaminsky タイプのキャッシュ汚染 銀行.JP DNS サーバ 参照 DNS 設定情報 不正侵入による DNS 設定情報の改ざん 9
DNS のキャッシュとは キャッシュ DNS サーバは 問合せた結果のレコードを一定期間保持 DNS レコードのキャッシュ 同じ問合せに対して キャッシュに保持されたレコードを返すことでレスポンス時間を短縮 ネットワークトラフィック等の資源を節約 キャッシュの情報が汚染される ( 誤った情報がキャッシュされる ) と そのキャッシュ DNS サーバに問合せるすべてのホストが騙される キャッシュに保持される期間は 当該レコードの TTL 値に依存 TTL 値は権威 DNS サーバで定義 通常は 1 日 (86400sec) に設定 最近は短い値の場合も多い 攻撃者はキャッシュ汚染時に自由な TTL 値を設定することが可能 ただし実装によりキャッシュ保持時間の最大値が異なる (?) Windows Server 2003 DNS 86400sec (1 day) BIND 9 604800sec (1 week) 10
キャッシュ汚染手法の分類 DNS リプライの詐称によるキャッシュ汚染 偽のリプライを返すことで結果的にキャッシュを汚染 いかにしてクエリ ID を合致させるかがポイント 1) MITM/ ネットワーク盗聴 2) ブルートフォース 3) クエリ ID 予測 4) バースデイアタック Kashpureff タイプのキャッシュ汚染 DNS リプライに権威外のレコードを入れて返すことでキャッシュを汚染 古典的キャッシュ汚染手法 (1997 年 2005 年にインターネット上で攻撃 ) Kaminsky タイプのキャッシュ汚染 リプライ詐称を効率的に実行し 権威の委任を利用して偽情報を入れる 2008 年に Kaminsky 氏により発表 同 7 月に各種 DNS サーバが一斉パッチ 11
DNS リプライの詐称によるキャッシュ汚染 正常な DNS クエリとリプライ ドメイン sec-pro.net 権威 DNS サーバ 61.12.249.254 キャッシュ DNSサーバ 61.12.249.254 cache 次の問い合わせにはキャッシュの情報を返す 偽の DNS リプライの挿入 ドメイン sec-pro.net 権威 DNS サーバ 攻撃者 10.1.1.1 偽造 DNS リプライ キャッシュ DNSサーバ 10.1.1.1 cache 10.1.1.1 12
DNS リプライの詐称が成功する条件 (1) DNS の応答パケットは基本的に UDP なので トランスポート層での詐称は容易 偽の DNS リプライを挿入するためには以下の条件が必要 正規の DNS サーバからのリプライよりも先に送り込まなければならない 正規の DNS サーバが遠い 動作していない DOS でダウン 成功率 UP 以下が正しいリプライパケットでなければならない ソースおよびデスティネーション IP アドレス ソースおよびデスティネーション UDP ポート番号 クエリの内容 クエリ ID IP アドレス? キャッシュ DNS サーバ / 権威 DNS サーバいずれも IP アドレスは既知 13
DNS リプライの詐称が成功する条件 (2) ポート番号? 権威 DNS サーバ側 53 番固定 キャッシュ DNS サーバ側 今年 7 月の一斉パッチ以前は多くの場合固定のため 事前に問合せることで判明 クエリの内容? 攻撃者が能動的に問合わせを発行すれば既知 クエリ ID(Transaction ID)? DNS の問い合わせの識別子 (2 バイト 65,536 通り ) 古い BIND や NT4.0DNS(SP4 より前?) では連番だったため 容易に予測可能であったが 最近の DNS サービスは基本的にランダムなクエリ ID を使用 ローカルネットワーク上では比較的容易に詐称可能 ( ネットワーク盗聴や MITM 攻撃を利用 ) 14
DNS リプライパケット IP Header UDP Header DNS Message src-ip dst-ip src-port dst-port 1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ID +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ QR Opcode AA TC RD RA Z RCODE +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ QDCOUNT +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ANCOUNT +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ NSCOUNT +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ARCOUNT +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +---------------------+ HEADER +---------------------+ QUESTION SECTION +---------------------+ ANSWER SECTION +---------------------+ AUTHORITY SECTION +---------------------+ ADDITIONAL SECTION +---------------------+ 15
クエリ ID によるリプライ詐称の防止 (1) C 権威 DNS サーバ QUERY ANSWER IP-B IP-C P-1138 P-53 QID: 5678 IP-C IP-B P-53 P-1138 QID: 5678 一致!! B キャッシュ DNS サーバ QUERY IP-A IP-B P-1024 P-53 QID: 1234 ANSWER 一致!! IP-B IP-A P-53 P-1024 QID: 1234 A クライアント 16
クエリ ID によるリプライ詐称の防止 (2) C QUERY 権威 DNS サーバ IP-B IP-C P-1138 P-53 QID: 5678 B QUERY IP-A IP-B P-1024 P-53 QID: 1234 A X 攻撃者 不一致!! ANSWER IP-C IP-B P-53 P-1138 QID: 9999 Х キャッシュ DNS サーバ クライアント Query ID を正しく推測しなければ偽造 DNS リプライは挿入できない 17
偽造リプライ挿入の確率 キャッシュ DNS サーバが偽造リプライを受付ける確率は R * W P_s = ----------- N * P * I R: 偽造リプライパケットの送出レート (pps) つまり一秒に何発打てるか W: 窓 が開いている秒数 (s) つまり正規リプライが返るまでの時間 N: 対象ドメインの権威 DNS サーバの数 P: キャッシュサーバのポート番号がとりうる値の数 (1~64,000 程度 ) I: Query ID のとりうる値の数 (16bit つまり 65,536 ) R=5000, W=0.1, N=2, P=1, I=65536 として 0.4% 程度の確率 18
クエリ ID 予測による DNS リプライの詐称 (1) 以下の DNS サーバのクエリ ID は容易に予測できることが 2007 年に公開 BIND8(8.4.7-P1 にてフィックス ) http://www.trusteer.com/docs/bind8dns.html BIND9(9.2.8-P1, 9.3.4-P1, 9.4.1-P1, 9.5.0a6 にてフィックス ) http://www.trusteer.com/docs/bind9dns.html Windows 2000 Server/Windows Server 2003(MS07-062 にてフィックス ) http://www.trusteer.com/docs/windowsdns.html 攻撃者の管理する DNS サーバに問い合わせを発行させ そのクエリ ID を基にして次のクエリ ID を予測し 偽造 DNS リプライを挿入 19
クエリ ID 予測による DNS リプライの詐称 (2) ドメイン sec-pro.net 権威 DNS サーバ 攻撃者ドメイン attacker.dom の権威 DNS サーバ QID:XXX 攻撃者 QID をサンプリングして 次の QID を予測 QID:YYY aaa.attacker.dom? aaa.attacker.dom? 偽造 DNSリプライ QID:YYY 10.1.1.1 キャッシュ DNSサーバ 10.1.1.1 cache 10.1.1.1 20
バースデイアタックによる DNS リプライの詐称 (1) バースデイパラドックス 人が 23 人集まると 同じ誕生日同士の人が存在する可能性は 1/2 を超え 60 人も集まると確実に存在する という確率論 つまり 自分と同じ誕生日の人を探すのは大変だが 誕生日が同じ というペアを探すのは容易 DNS のクエリ ID の場合 500 発程度のクエリおよび偽造リプライを送信することにより 80% 以上の確率でクエリ ID が合致 DNS Cache Poisoning - The Next Generation http://www.lurhq.com/dnscache.pdf BIND9 では同時問い合わせを同時並行的に処理しないので安全 Windows DNS は MS07-062 適用後 同時並行的に処理しない 21
バースデイアタックによる DNS リプライの詐称 (2) ドメイン sec-pro.net DNS 権威サーバ どれかの QID が ( たまたま ) 合致する 攻撃者 QID QID 10.1.1.1 偽造 DNS リプライ キャッシュ DNSサーバ 10.1.1.1 cache 10.1.1.1 22
Kashpureff タイプのキャッシュ汚染手法 (1) キャッシュ DNS から攻撃者が管理する権威 DNS サーバへ問合わせをさせ そのリプライに入れた権威外のレコードでキャッシュを汚染 CNAME や NS レコードを利用し ANSWER/ADDITIONAL セクションに挿入 本来信用してはいけないレコードを信用してしまうといった キャッシュ DNS サーバの脆弱性を利用したもの 脆弱な DNS サーバは 権威外のレコードをキャッシュに保存 古い BIND や デフォルトの NT4.0/2000 DNS (SP3 より前 ) は脆弱 最新の Windows DNS でも 設定によっては脆弱になるので注意 DNS キャッシュ機能はさまざまな製品 ( ルータ ゲートウェイ製品等 ) に含まれるが 場合によってはそれらに脆弱性が存在 Windows DNS での対策 : DNS 設定の 詳細 プロパティで Pollution に対してセキュリティでキャッシュを保護する を設定 (2000 SP3 以降および 2003 ではデフォルト ) 23
Kashpureff タイプのキャッシュ汚染手法 (2) インターネットで発生した Kashpureff タイプのキャッシュ汚染攻撃 1997 年 7 月 : http://www.cert.org/advisories/ca-1997-22.html BIND4.9.6/8.1.1 より前のバージョンに脆弱性 AlterNIC(Eugene Kashpureff 氏 ) により多数の DNS サーバが攻撃 www.internic.net へのアクセスが AlterNIC のサーバへ誘導 2005 年 3 月 ~4 月 : http://isc.sans.org/presentations/dnspoisoning.php Windows NT/2000 Symantec ゲートウェイ製品の DNS 各種商用サイトのドメイン名がターゲット 不正サイトにリダイレクト (Web E-Mail FTP IMAP/POP ) 不正サイト上でスパイウェアを配布 対策済みの Windows DNS でも BIND4/8 をフォワーダとして使っている場合は脆弱 24
Kashpureff タイプのキャッシュ汚染手法 (3) ドメイン sec-pro.net 権威 DNS サーバ 攻撃者ドメイン attacker.dom の権威 DNS サーバ キャッシュ DNS サーバ cache 10.1.1.1 10.1.1.1 攻撃者 25 aaa.attacker.dom CNAME www.sec-pro.net www.sec-pro.net A 10.1.1.1 aaa.attacker.dom? aaa.attacker.dom? 権威外のレコード
フォワーダ経由でのキャッシュ汚染 (1) フォワーダ 自分の代わりに名前解決してくれる DNS サーバ Windows DNS は フォワーダの設定をしている場合 フォワーダからのリプライなら権威外レコードであっても受け入れる ( 仕様 ) つまり Pollution に対してセキュリティでキャッシュを保護する と設定していても Kashpureff タイプのキャッシュ汚染が発生 以下の場合 Windows DNS に対するキャッシュ汚染が可能 フォワーダ DNS に Kashpureff タイプのキャッシュ汚染脆弱性がある場合 フォワーダ DNS が毒を浄化せずにリプライを戻す場合 (BIND8/4?) フォワーダ DNS を詐称してキャッシュ汚染攻撃された場合 クエリ ID の推測が必要 ( バースデイアタックや総当り ) 解説ページ : http://www.st.rim.or.jp/~shio/advisories/windns_poison/w indns_poison.txt 26
フォワーダ経由でのキャッシュ汚染 (2) ドメイン sec-pro.net 権威 DNS サーバ 攻撃者ドメイン attacker.dom の権威 DNS サーバ 攻撃者 フォワーダ DNS サーバ aaa.attacker.dom? キャッシュ DNS サーバ cache 10.1.1.1 10.1.1.1 27 aaa.attacker.dom? フォワーダ DNS からのリプライを詐称 aaa.attacker.dom CNAME www.sec-pro.net www.sec-pro.net A 10.1.1.1 aaa.attacker.dom? リプライを返さない フォワーダ設定 Windows DNS はフォワーダからのリプライなら権威外のレコードでも受け入れる 権威外のレコード
従来のキャッシュ汚染攻撃手法の欠点 DNS リプライの詐称によるキャッシュ汚染 一度失敗すれば正規のレコードがキャッシュされ キャッシュ保持中 (TTL 値の期間中 ) は攻撃できない 効率的な攻撃が不可 ある一定の期間 (T) 連続した攻撃で 一度でも偽造リプライを受付ける確率は TTL の値に依存 T/TTL R * W P_cs = 1-1 - ----------- N * P * I R=5000, W=0.1, N=2, P=1, I=65536, TTL=86400(1 日 ) として 10 日で約 4% TTL が例えば 1 時間 (3600) だとすると 10 日で約 60% 20 日で約 84% Kashpureff タイプのキャッシュ汚染 脆弱性を持つキャッシュ DNS サーバのみが攻撃対象 攻撃対象が極めて限定 ( 設定を誤った Windows DNS 等 ) 28
Kaminsky タイプのキャッシュ汚染手法 (1) 2008 年になって Dan Kaminsky 氏が新しいタイプの DNS キャッシュ汚染手法を考案 DNS のもともとの設計による問題 今まで考えられていたよりも容易にリプライ詐称が可能 攻撃の機会は TTL 値に依存しない ( いつでも レース が開始できる ) BIND Windows DNS 等 多くのターゲットに適用可能 DNS の下位ドメインに対する 委任 の仕組みを利用してキャッシュを汚染 実装によっては既存レコードの上書きも可能 (Windows DNS A レコード ) 7 月に各種 DNS の実装が一斉にアップデート ソースポートをランダマイズすることで攻撃成功の可能性を低減 29
Kaminsky タイプのキャッシュ汚染手法 (2) 基本はブルートフォース型 DNS リプライの詐称 つまりターゲットのキャッシュ DNS サーバから権威 DNS サーバへの問い合わせに対するリプライを詐称 ランダムなクエリ ID で多数の偽造リプライを返し どれかが当たるのを待つ 存在しないホスト名をクエリに使用 001.www.sec-pro.net 等の存在しないレコードを キャッシュ DNS サーバから権威 DNS サーバへ問い合わせさせる 毎回クエリのホスト名を変えるため TTL 値に依存することなく何度でも連続してリプライ詐称をトライすることが可能 (001, 002, 003, 004,...) どのようにしてキャッシュを汚染するか? 001.www.sec-pro.net を偽 IP アドレスでキャッシュさせても意味がない やりたいことは www.sec-pro.net を偽 IP アドレスでキャッシュ 30
Kaminsky タイプのキャッシュ汚染手法 (3) 手法その 1: 偽造リプライ中に委任先の NS レコードを入れることで参照先を変更例 1)www.sec-pro.net NS ns.attacker.dom 例 2)sec-pro.net NS ns.attacker.dom それにより www.sec-pro.net の問い合わせを攻撃者の DNS サーバへ誘導 例 2 の場合は sec-pro.net ドメイン全体の乗っ取りが可能 BIND9.5.0-P2 および WS2K3/SP2(MS08-037 適用済み ) で検証 ( いずれもソースポート固定に設定 ) 手法その 2: CNAME や NS レコードを利用して ターゲット A レコードを直接挿入 / 上書き例 )001.www.sec-pro.net CNAME/NS www.sec-pro.net www.sec-pro.net A 10.1.1.1 WS2K3 DNS は CNAME を利用して A レコードの挿入および上書きが可能 BIND9.5.0-P2 は NS を利用して A レコード挿入が可能 31
Kaminsky タイプのキャッシュ汚染手法 (4) ドメイン sec-pro.net DNS 権威サーバ どれかの QID が ( たまたま ) 合致 攻撃者 QID 001. 002. 001. www.sec-pro.net NS ns.attacker.dom 偽造 DNS リプライ www.sec-pro.net NS ns.attacker.dom QID 002. 偽造 DNS リプライ キャッシュ DNSサーバ cache 10.1.1.1 www.sec-pro.net NS ns.attacker.dom 10.1.1.1 権威の委任により NS レコードがキャッシュ 攻撃者ドメイン attacker.dom の権威 DNS サーバ 32
DNS キャッシュ汚染攻撃への対策 (1) ソースポートのランダマイズによりキャッシュ汚染成功率を下げる Kaminsky タイプのキャッシュ汚染攻撃が成功する確率 T R * W P_cs = 1-1 - ----------- N * P * I R=5000, W=0.1, N=2, P=1, I=65536 として 1 分間の攻撃で約 20% ソースポートのランダマイズ P=64000 とすると 10 日間の攻撃で約 5% 2008 年 7 月に各種 DNS の実装が一斉にパッチ提供 ポートランダマイズ 設定によってはランダム化しない場合もあるので注意 例 ) BIND query-source port 53; ソースポートが固定化 NAT/NAPT 環境ではソースポートのランダム化効果がなくなる場合もある ランダム度のテスト (https://www.dns-oarc.net/oarc/services/dnsentropy) dig +short porttest.dns-oarc.net TXT ソースポートのランダム度 dig +short txidtest.dns-oarc.net TXT クエリ ID のランダム度 33
DNS キャッシュ汚染攻撃への対策 (2) 外部からの再帰的問合せを禁止する 攻撃者がインターネット経由で直接トリガーを引くことを抑制 攻撃者 再帰的問合せを拒否 Х キャッシュ DNSサーバ 再帰的問合せを許可 cache 内部から強制的に再帰的問合せを発行させることもできるので注意が必要 メールサーバに問合せを発行させる (mail from: xxx@www.sec-pro.net 等 ) Webバグを使ってブラウザ / メールクライアントから問合せを発行 外部からの再帰的問合せのテスト (http://recursive.iana.org/) 34
DNS キャッシュ汚染攻撃への対策 (3) 同時並行的な連続問合せの制限 ( バースデイアタック対策 ) Windows DNS は Pollution に対してセキュリティでキャッシュを保護する を設定 (Kashpureff Attack 対策 ) パケットフィルタリングによるソース IP アドレス詐称の防止 DNSSEC の導入 公開鍵暗号方式を利用しゾーンのリソースレコードに署名 出所の認証と整合性チェックを提供 問い合わせ側 ( リゾルバ ) はレコードの署名を確認することで 偽造リプライ等によるキャッシュ汚染を回避し 正しいレコードのみを受け入れる 公開鍵を上位ドメインに署名してもうらことで信頼関係を構築 インターネットで広く普及するにはしばらく時間がかかりそう SE( スウェーデン ): 対応中 ORG/GOV: 対応予定 DLV(DNSSEC Lookaside Validation) TLD が DNSSEC 化していない場合に DNSSEC 対応する技術 35
まとめ DNS キャッシュ汚染は極めて影響度の高い攻撃のため 適切な対応が必要 DNS サーバの最新版へのアップデート 設定の確認 ルータやゲートウェイ製品の DNS キャッシュ機能にも注意 クエリ ID およびソースポートのランダマイズによりリスクはかなり低減されるが 所詮は確率の大小の問題 外部からの再帰的問合せの禁止により攻撃の難易度は高まるが 不可能ではない Kashpureff タイプの脆弱性は致命的 特に Windows DNS は設定を確認 Windows DNS のフォワーダ経由でのキャッシュ汚染にも注意 Windows クライアントでもキャッシュ汚染が発生する可能性 最終兵器は DNSSEC だが 36