CVE-2012-どさにっき 〜2012年1月下旬〜

by やまや
<< = >>

2012年1月26日(木)

unbound で AAAA filter

_ ふつーの場合。

  1. AAAA を聞かれる
  2. ふつーに AAAA を再帰検索する
  3. 結果を答える
AAAA filter が有効な場合。
  1. AAAA を聞かれる
  2. ふつーに AAAA を再帰検索する
  3. クライアントが ipv6 である、または結果が DNSSEC 署名されている、または AAAA が存在しなかった場合、結果をそのまま答える
  4. クライアントが ipv4 であり、かつ署名されておらず、かつ AAAA が存在する場合、さらに A を検索する
  5. A が存在していれば NODATA を返す(AAAA も A も答えない)
  6. A が存在していなければそのまま AAAA を返す

_ 今度の World IPv6 Launch に際して、BIND のような AAAA filter が unbound にも欲しいよね、という声が一部で出てる。v6 を launch するイベントのために AAAA filter が必要になるというのは、なんとも後ろ向きなんだけど、閉域網のおかげで実際に問題になる環境が存在するし、そのせいで google やら akamai やらが「ちゃんと解決しないと日本に対してだけは永久に v4 のみにするぞ」と圧力をかけてきているようなので問題が起きないように対策せざるをえない。が、実際それを実装するとなるとなんともめんどくさい。BIND もよくこんなめんどくさいもの入れたな。

_ unbound のソースをちらっと覗いてみた感じでは、v6 での問い合わせでも問答無用に AAAA を削っていいなら数行の修正でいけそうだけど、応答を組み立てる関数の中からはクライアントが v4 か v6 かといった情報にアクセスできないっぽい(?)ので、そのへんをちゃんと判定して AAAA を応答から削るとなるとけっこう手間がかかりそう。それだけではなく、AAAA と A が両方存在していた場合のみ削るようにしないといけないので、聞かれもしない A を問い合わせて AAAA だけなのか AAAA と A が両方あるのかどちらか調べる必要があってさらに複雑化する。unbound のソースのかなりの部分に手を入れる必要がありそうで超めんどくさい。少なくともわしの手には負えない。ソースを詳しく調査したわけじゃないので、見落としがあって実はほんのちょっとの修正でいけちゃうのかもしれないけどね。

_ ちなみになんで単純に AAAA を削るだけではダメなのかというと、v6 reachability を持っているけどキャッシュ DNS への問い合わせは v4 でおこなっている環境(具体的には WinXP とか、あるいは単純にキャッシュ DNS が v4 しか提供されてないとか)で、アクセスできるはずのホストにアクセスできなくなってしまうため。目的は v6 -> v4 のフォールバックを減らすことであって、v6 only のホストの存在をないものにすることではないので、A が存在しない場合には AAAA の応答を返してやる必要がある。AAAA じゃなくて ANY を聞かれた場合も、A の有無によって AAAA を除くかどうか応答を変えた方がいいのかしら。BIND はどうなってるんだっけ。

_ まあ、そんなわけで、やってみようかとも思ったけどやめた、というお話でした。期待した人がいればごめんなさい。

_ 結論: NGN がみんな悪い。


<< = >>
やまや