_ べつに誰も期待はしてなかったのに、それでもやっぱり期待は裏切らない BIND さんまじパネェっす。ということで、今年も恒例7月バグが出ました。ここまで続くともはや偶然じゃないよね。
_ 以下、DNS 7月問題のまとめ。最近の脆弱性のまとめではない。ここ数年の「7月」に発覚した問題だけ。この前社内でちらっとネタにした内容に今回の件を追加した改訂版。
_ 2007/07:
- CVE-2007-2926 BIND 9: cryptographically weak query ids
- 乱数生成アルゴリズムの欠陥で外部から推測しやすいクエリ ID を生成していたため、キャッシュポイゾニングされやすくなっていた
_ 2008/07:
- CVE-2008-1447 Multiple DNS implementations vulnerable to cache poisoning
- いわゆる Kaminsky Attack
- これまで知られていた方法よりはるかに簡単に毒入れが可能に
- DNS のプロトコル仕様の問題で、これに限っていえば BIND に罪はない
- なおさらタチが悪い
- そっち方面の危険性が広く周知されたという意味ではよかった?
_ 2009/07:
- CVE-2009-0696 BIND Dynamic Update DoS
- 通称「BIND コロリ」
- 細工された dynamic update パケットを送りつけると BIND 死亡
- DDNS を使わない設定だったり、アクセス制限していても回避不可
- 権威 DNS が対象の脆弱性だが、キャッシュ DNS でも localhost ゾーンぐらいはふつう持ってるのでやっぱり死ぬ
_ 2010/07:
- CVE-2010-0213 RRSIG query handling bug in BIND 9.7.1
- DNSSEC なゾーンのキャッシュに存在しない RRSIG を問い合わせると無限にクエリを続ける
- DoS の踏み台に使えてしまう
- 9.7.1 のみ
_ 2011/07:
- CVE-2011-2464 ISC BIND 9 Remote packet Denial of Service against Authoritative and Recursive Servers
- 細工されたクエリで BIND が落ちる
- 権威/参照どちらも対象
- CVE-2011-2465 ISC BIND 9 Remote Crash with Certain RPZ Configurations
- responsible policy zone という機能を使っていると特定のクエリ(細工不要)で BIND が落ちる
- 9.8 のみ
_ 2012/07:
- CVE-2012-2978 NSD denial of service vulnerability from non-standard DNS packet from any host on the internet
- NSD おまえもか
- 細工されたパケットで落ちる
- 死ぬのは親子あるプロセスの子の方だけで、落ちても親がすぐに起動しなおすので、攻撃者は攻撃パケットを送り続ける必要がある
- CVE-2012-2808 Android DNS Poisoning: Randomness gone bad
- Android「俺も流行に乗ってみたぜ!」
- stub resolver のクエリ ID、ソースポートがランダムではなく、嘘応答を容易に注入できる
- CVE-2012-3817 bind: heavy DNSSEC validation load can cause assertion failure
- 大量の DNSSEC validation で死亡
- CVE-2012-3868 bind: high TCP query load can trigger memory leak
- 大量の問い合わせでメモリリーク
- プロセスが肥大して swap しまくったり OOM killer で named に限らずその他のプロセスが殺されたり
- 9.9 のみ
- (7/29追記) CVE-2012-2979 NSD denial of service vulnerability from DNS packet
- NSD 2発目; 3.2.11 以降のみ
- ゾーンごとの統計情報を取得する設定になっているときに、特定のパケットで落ちる
- configure で明示的に有効にしていた場合のみ影響を受ける(デフォルト off)
_ でも、今日発覚した件では BIND より Android の方が深刻のような気がする。なんつったって端末の数が多いし、レゾルバのバグなので DNSSEC でも防げないし。
_ ソースは
こうなってたそうで、ランダムでもなんでもなく時刻と pid で一意に定まってしまう。とはいえ、外部からマイクロ秒まで予測するのはさすがに難しそうな気がするので、そこそこ強度はありそうに思える(いくつかのパケットの時間間隔を正確に測定して観測から導きだすとかいう手が使えそうな気もするし、そもそもほんとにマイクロ秒の精度があるのかという疑問もあるが)。gettimeofday(&now, NULL); return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid()));_ 問題はそれよりも、query id 用とポート番号用でそれぞれ別の乱数が必要になるはずなのに、このアルゴリズムを使った場合は乱数取得の時間差がほとんどないために、高い確率でふたつの値が同じになってしまう、違っていても差はたかがしててるということ。結果として query id とソースポートの間に強い相関関係ができてしまって、正しく実装すればそれぞれで 16bit ずつ合わせて 32bit のエントロピーがあるはずなのに、実際は 16bit よりちょっと多い程度でしかない(ポート固定の場合とたいして変わらん)、というのがこの穴の本質。
_ Android 4.0.4 以前の端末が対象ということだけど、これってつまり世に出回ってる Android のほぼすべてということだよね。いまだに 2.x のバグで問題になることもあるというのに、世間がすべて穴のない端末に置き換わるまでいったい何年かかるやら。
_ カメラが壊れた。電源を入れても反応がない。10回に1回ぐらいはふつーに動いて写真も撮れることもあるが、モードを切り替えたりするとかなりの割合で電源が落ちる。この前八ヶ岳で雨に降られたときにやられちゃったんだろうな、たぶん。濡れた翌日はちゃんと動いてたんだけど。
_ まあ、持ってるカメラはこれ1台じゃないんだけね。
_ 尻焼温泉
野反湖
2枚ともやけにコッテリした色になってるなぁ。_ つーことで、今年もクソ暑い自宅から逃げて週末を高地で過ごす季節がやってきました。金曜日の夜に出てきて、まず赤城山のてっぺんまでいって車中泊。 去年もそうだったけど、ここは夜は涼しいけど朝が暑くてダメだな。車中泊ができる駐車場はたくさんあるけど、どれひとつとして木陰がなくて、天気がいいと朝8時前から車内が30℃近くまで上がってしまう。外に出るとそれほど暑く感じないのに。
_ 眠気覚ましにそのへんを散歩してから、尻焼温泉へ。川底から温泉が湧いてるといっても、上流から流れてくる水もあるしたいして熱くないだろう、この季節ならぬるいぐらいでちょうどいいや、なんて思って足をつっこんだら大間違いだった。熱くて入れん:-)。本来の湯船であろう流れを堰き止めている区画(上の写真の手前部分)ではなく、その下流部分がちょうどいい感じの温度だった。こんなに温度が高いくせに川底の石にはしっかり藻が生えていて、ぬるぬる滑って足元が覚束ないし、人工の露天風呂は管理がしっかりしてるんだなーとあらためて認識する。
_ さらに山奥に進んで野反湖へ。ふだん車中泊ばっかりしてるけど、たまにはかわったこともしてみようとテントを購入したので、まずは練習ということで、ここでテント泊でびゅうしてみる(ほんとはこの前の八ヶ岳が最初になるはずだったのだが、天気が悪かったのでやめた)。んーと、テント張ってフライシートをかぶせて、というところまでは問題なかったが、ペグ打ちがよーわからん。取説は持ってきてないし。自己流でてきとーにやってちゃんとしっかり固定できたからいいよね。ペグ1本あまったけど、これは紛失したときのための予備ということでいいんだよね(帰宅してから確認したら予備じゃなくてちゃんと使うやつだった)。そして設営完了を祝うかのように雨が降ってきやがった。その雨はうまくやり過ごしたものの、雨がやんでから外で飯を作りはじめたらまた降ってきて、今度は間に合わずずぶ濡れに。まだ新品のテントだししっかり防水が効いてるが、濡れてる人間が中に入ったら意味がない。
_ 翌朝。そのへんの山に登るつもりだったが、ぼけー、とコーヒーを飲みながら本を読んでたらそれだけですっかり満足してその気がすっかり失せた。まっすぐ帰宅。たまにはこんなのもいいね。 \
_ カメラどうすっかなぁ。修理するか新しいのを買うか今手持ちのものでなんとかするか。うーん。