キャッシュポイズニングの開いたパンドラの箱 -1-
Opened Pandora's box of Cache Poisoning -1-
鈴木常彦 2014.04.15 (Concept by 前野年紀 2014.02) / English version
背景となる手法
- Kaminsky
2008年、Dan Kaminsky 氏が TTL に影響されない毒入れ手法を発表した。
しかし、偽応答のAdditional Section (だけ) で毒が入るとされたのは誤りだったことを2011年に鈴木が明らかにした。
http://www.e-ontap.com/dns/bindmatrix.html
- Müller
Bernhard Müller の "IMPROVED DNS SPOOFING USING NODE RE-DELEGATION", 2008.7.14
https://www.sec-consult.com/fxdata/seccons/prod/downloads/whitepaper-dns-node-redelegation.pdf
彼は偽応答を毒として機能させる方法 "node re-delegation" を示した。
- Sooel Son and Vitaly Shmatikov
The Hitchhiker's Guide to DNS Cache Poisoning
https://www.cs.utexas.edu/~shmat/shmat_securecomm10.pdf
どのような条件で毒を入れられるのかについてかなり網羅的に書かれている。
- Shulman
Amir Herzberg and Haya Shulman の Fragmentation Considered Poisonous,2013.3
http://u.cs.biu.ac.il/~herzbea/security/13-03-frag.pdf
Fragment化したパケットの(チェックが甘い)第2フラグメントで毒を入れられることを示した。偽応答を受け入れさせる方法として確実性が高いが、どういう偽応答が毒として機能するかは明確に述べられていない。
今回の発見: 委任インジェクション攻撃 (Müeller手法の適用範囲拡大)
前野、鈴木らの考察、検証により、どのようなターゲットに対して偽応答が毒として有効に機能するかが色々明らかになった。
ポイントは以下である。
「事前に NS のキャッシュがないか容易に上書きでき、本物の応答に邪魔されないノードが危険である」
以下のケースで node re-delegation の応用によって重要なドメイン名(ゾーン)が危険に晒されることがわかった。
1. ゾーンがないサブドメインへの毒入れ (Müllerの手法の適用拡大)
NSが存在せず事前にキャッシュがない例のようなケースにおいて、sld.tld の 偽 NS を容易に毒入れすることができ、偽のゾーンサーバで sld.tld ゾーンを自由にできる。
例
a) tld から example.sld.tld が委譲されていて sld.tld ゾーンが存在しない
b) 多くの FQDN (Müllerが示したのはこの特殊ケース)
なお、事前に example.sld.tld 内の A レコードがキャッシュされていても、偽 sld.tld ゾーンの NS は毒入れ可能である。キャッシュにヒットせず新たに検索されたレコードから偽ゾーンの毒に侵されていく。
追加解説:委任インジェクションの原理
2. 親子ゾーン同居 (世代間同居)への毒入れ ...(我々との情報交換からJPRSが発見)
tld から sld.tld が委譲されているが sld.tld ゾーンが tld ゾーンと同じサーバにある場合、
a) キャッシュは子の応答を親の応答として受け取る可能性がある (子のNSを探して問い直さなくて済む)
b) 子の名前がNSが高い優先度でキャッシュされる機会が少ない (aによる/特に孫ばかり引かれるケースなど)
(わかりやすくするため訂正)
a) 子ゾーン内の存在しない名前の問い合わせに対して、親が否定応答を返してしまう
b) 孫ゾーン内の名前の問い合わせに対して、親が子を飛び越えて孫への委任情報(NS+A)を返してしまう(ex. www.foo.bar.internot.jp)
c) 親が子ゾーン内の名前を NS に使っていてもキャッシュサーバはそのAレコードを子ゾーンに問い合わせる必要がない。(親の親がグルーとして返してくれている)
といった理由からキャッシュが子の NS を得られない状況が生じやすく、キャッシュは子 (sld.tld) の 偽 NS を容易に毒入れすることができ、偽 sld.tld ゾーンを自由にできる。
3. 子のゾーン内の名前を親のNSに用いているゾーンへの毒入れ
子ゾーン内の名前を親の NS に用いていると、子に毒入れすることによって、親ゾーンを自由にできる。
結論
以上の条件にあう対象を探した結果、以下の重要なゾーンの偽NS情報をキャッシュさせゾーン内のレコードを自由に偽れることがわかった。
- co.jp などのゾーンのキャッシュに毒が入る ...(主として 1.による)
- kr などのゾーンのキャッシュに毒が入る (com などにも毒が入る) ...(主として 2. による)
- . (root) ゾーンのキャッシュに毒が入る (2.に移転インジェクションも併用すると有効的)
仕様(RFC2181など)、実装、運用をすべて見直す必要がある。
* 今回さらに危険な問題 (移転インジェクション攻撃)が見つかっている。
緩和策
キャッシュサーバでの対策
ゾーンサーバでの対策
- NSなしノードの解消
- 親子同居構成の解消
- NS名の見直し
関連情報
注:実験はすべて仮想インターネット環境上で行った (BIND 9.9.2-P2 /Unbound 1.4.20)
今回の脆弱性の公開について様々なご助言を頂いた名古屋大学高倉弘喜教授に感謝致します。
連絡先: 中京大学工学部教授 鈴木常彦 / endofdns at e-ontap.com