BIND各バージョンへの毒入れ実験
(Kaminsky Bug の検証)

2011.10.18 公開

実験目的

Kaminsky が示した毒入れ手法は DNSプロトコルの欠陥によるものであり、非常に危険なものであるという論を根拠に DNSSEC が推進されている。しかし、BlackHat USA 2008 における Kaminsky の講演のスライドに示されている方法にはいろいろな点で疑義がある(Finchなど)。qmail.jp の前野氏からあれで毒が入ると思うかとの指摘を受けたこともあり、散々考えたが、私には Kaminsky のスライドどおりに毒が入ることがどうしても納得いかなかった。そして、Kaminskyが間違っている(あるいは嘘をついている)、あるいは、BIND には毒が入るバグがあって Kaminsky の攻撃手法が成功するというのではないかという仮説が引き出せる。これは前野氏が当初から洞察していたことであった。この仮説に基づくと、Kaminsky の発表から3年経った今、そのバグが修正されているかもしれないという疑惑が浮かび上がる。

今回、Kaminsky がスライドで示した毒入れ手法で本当に毒が入り、DNSSEC 以外では回避不可能なのか、あるいは対策可能なバグであり場合によっては直っていたりはしないかを調べるため、実際にBINDに対して毒入れ実験を行うこととした。

Kaminsky のスライドには怪しいTYPOも含め疑義が多いため、民田氏(JPRS)が100%毒が入るとして紹介した比較的疑義の少ない(怪しい形式ではあるがその理由は説明されていない)バリエーション(IW2008-H3-07)を加え、4種のバリエーションを試行した。

Enter The DNSRake
Named after a common method for lockpicking
1) Send a query to a nameserver, for $RANDOM.foo.com
    The bad guy has the starter pistol
2) Send 200 fake replies to that nameserver, with TXID 0- 200
    The bad guy can reply multiple times
3) Send replies containing nameserver redirections to www.foo.com
    $RANDOMwww.foo.com IN NS www.foo.com
    www.foo.com IN A 6.6.6.6
    If this works, it works
    If it fails, return to step 1

Dan Kaminsky / Black Ops 2008
It's The End Of The Cache As We Know It
Or: 64K Should Be Good Enough For Anyone より
-問い合わせ
 no0000.example.jp.  A 
-偽装応答
 ;; 回答セクション
 no0000.example.jp. IN A 192.0.2.1
 ;; 権威セクション
 example.jp.        IN NS www.example.jp.
 ;; 追加セクション
 www.example.jp.    IN A 192.0.2.10

民田雅人 IW2008 「Kaminsky Attack の全て」 より

実験方法

毒入れ実験結果

versionfile datebug fixwith answerwithout answer
(1)$random(2)domain(3)$random(4)domain
9.4.3Nov 19 2008PoisonedPoisonedPseudoGlueNot Injected
9.4.3-P4Nov 24 2009PoisonedPoisonedPseudoGlueNot Injected
9.4.3-P5Jan 19 2010CVE-2009-4022 ?PoisonedPoisonedPseudoGlueNot Injected
9.4-ESV-R3Sep 23 2011PoisonedPoisonedPseudoGlueNot Injected
9.4-ESV-R4Sep 23 2011IsolatedNot InjectedPseudoGlueNot Injected
9.5.2-P1Nov 24 2009PoisonedPoisonedPseudoGlueNot Injected
9.5.2-P2Nov 24 2009CVE-2009-4022IsolatedRefetchPseudoGlueNot Injected
9.6.1-P2Nov 24 2009PoisonedPoisonedPseudoGlueNot Injected
9.6.1-P3Jan 19 2010CVE-2009-4022IsolatedRefetchPseudoGlueNot Injected
9.7.0-b2Nov 3 2009PoisonedPoisonedPseudoGlueNot Injected
9.7.0-b3Nov 30 2009PoisonedPoisonedPseudoGlueNot Injected
9.7.0rc1Dec 11 2009CVE-2009-4022IsolatedRefetchPseudoGlueNot Injected
9.8.0Mar 01 2010IsolatedRefetchPseudoGlueNot Injected
9.8.1Sep 01 2011IsolatedRefetchPseudoGlueNot Injected

実験結果まとめ

(一部、上に記していない実験も行っている)
  1. BlackHat における Kaminsky のスライドそのまま(answerなし)では毒は入らない
  2. ダミーの Answer を加える(民田氏の紹介した手法)とBlackHat当時の BIND には毒(Additional A)が入る (AAフラグは関係なさそう)
  3. AuthoritativeなAnswerがあらかじめキャッシュにあると毒は入らない(上記に示していないが別途実験) <---これ重要!
  4. 9.5系以降については、'09年11月~'10年1月のCVE-2009-4022 の対応以降、今回試した攻撃バリエーションでは毒は入らない
  5. 9.4系では ESV-R3 まで毒が入る。9.4.3-P5 で CVE-2009-4022 に対応したはずだが、別なバグか? (9.4-ESV-R4 2786. [bug] Additional could be promoted to answer. [RT #20663] ? )
  6. 別途実験した外部名へのRe-Delegation攻撃では最新版(9.8.1)でも毒を入れることができる (詳細省略)

結論

偽応答の Additional A で狙いのAレコードに毒を入れられるというのはDNSプロトコルの脆弱性ではなくBINDの脆弱性であり、2009年末にすでに対策済みである(9.4だけ2011年9月)。そもそもAnswerがあるのだからそれに付随するレコード(glueではない!)を受け入れざるを得ないという話はなくDNSプロトコルの脆弱性ではない。対策はタイミングからみて CVE-2009-4022 2786. [bug] Additional could be promoted to answer. [RT #20663] でとられたとみられるが、詳しくは語られていない。真実を語らず、対策もでているのに明示せず、脅威を煽るのはいかがなものか。
一方、詳しく述べていないが、Glueに毒を入れ偽委譲先で狙うAレコードに毒を入れることは可能である。しかしエントロピを増やすとか、ファイアウォールなどでアドホックな対策もとりうるのであるから、運用ミスの危険性まで冒してDNSSECを導入しようという話に持っていく必然性はないと考える。

参考


T.Suzuki / Summer 2011 / 2011.10.18公開 / 2011.10.19 一部文言修正