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 の全て」 より |
ルートサーバ 192.168.1.50 の設定 (tinydns)
.:192.168.1.50:ns.root.tss:518400
&example.nom:192.168.1.52:ns.example.nom:86400
権威サーバ 192.168.1.52 の設定 (tinydns)
Zexample.nom:ns.example.nom:tss.example.nom.:2011082901:3600:1800:604800:60:30:
.example.nom:192.168.1.52:ns.example.nom:86400
+www.example.nom:192.168.1.53:3600
AA flag | Answer Section | Authority Section | Additional Section | |
---|---|---|---|---|
(1) | 1 | $random.example.nom | $random.example.nom IN NS www.example.nom | www.example.nom IN A 192.0.2.1 |
(2) | 1 | $random.example.nom | example.nom IN NS www.example.nom | www.example.nom IN A 192.0.2.1 |
(3) | 0 | $random.example.nom IN NS www.example.nom | www.example.nom IN A 192.0.2.1 | |
(4) | 0 | example.nom IN NS www.example.nom | www.example.nom IN A 192.0.2.1 |
version | file date | bug fix | with answer | without answer | ||
---|---|---|---|---|---|---|
(1)$random | (2)domain | (3)$random | (4)domain | |||
9.4.3 | Nov 19 2008 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.4.3-P4 | Nov 24 2009 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.4.3-P5 | Jan 19 2010 | CVE-2009-4022 ? | Poisoned | Poisoned | PseudoGlue | Not Injected |
9.4-ESV-R3 | Sep 23 2011 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.4-ESV-R4 | Sep 23 2011 | Isolated | Not Injected | PseudoGlue | Not Injected | |
9.5.2-P1 | Nov 24 2009 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.5.2-P2 | Nov 24 2009 | CVE-2009-4022 | Isolated | Refetch | PseudoGlue | Not Injected |
9.6.1-P2 | Nov 24 2009 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.6.1-P3 | Jan 19 2010 | CVE-2009-4022 | Isolated | Refetch | PseudoGlue | Not Injected |
9.7.0-b2 | Nov 3 2009 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.7.0-b3 | Nov 30 2009 | Poisoned | Poisoned | PseudoGlue | Not Injected | |
9.7.0rc1 | Dec 11 2009 | CVE-2009-4022 | Isolated | Refetch | PseudoGlue | Not Injected |
9.8.0 | Mar 01 2010 | Isolated | Refetch | PseudoGlue | Not Injected | |
9.8.1 | Sep 01 2011 | Isolated | Refetch | PseudoGlue | Not Injected |
偽応答の 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を導入しようという話に持っていく必然性はないと考える。