SIM フリーどさにっき 〜2014年11月下旬〜

by やまや
<< = >>

2014年11月21日(金)

逆引き shellschock

_ きのうの dnsops BoF で発表してきました。 資料置いときます

_ スライドに書いてないこと、当日話さなかったことについていくつか補足。

_ OSX や OpenBSD、Windows などのリゾルバが脆弱だとはいえないと思う。glibc など BIND8 由来のコードは応答を勝手に加工しているわけで、本来やるべきでない余計なことをやっているという解釈も成り立つわけだし、BIND8 のコードもサニタイズ対象の文字が非常に少なく、shellshock はたまたま防げたけれど、他の攻撃にも耐えられるとはとても思えない中途半端な実装でしかない。OpenBSD の getnameinfo() はそのへんしっかり対策してあって、こちらの関数を使っていればまず攻撃は成立しないだろうけど、基本的にはリゾルバに頼らず、呼び出す側の方で対策すべきだと思う。

_ 質疑で getdnsがどうなってるか聞かれたけど答えられなかったので、調べてみた。getdns-0.1.5/src/gldns/wire2str.c の dname_char_print() という関数。

        if(c == '.' || c == ';' || c == '(' || c == ')' || c == '\\')
                return gldns_str_print(s, slen, "\\%c", c);
        else if(!(isascii((int)c) && isgraph((int)c)))
                return gldns_str_print(s, slen, "\\%03u", (unsigned)c);
ちうことで、.;()\ の記号5種と、0x00-0x20、0x7f-0xff。libc の dn_expand() と比べると "@$ の3文字少ない。ただし、この関数がどこから呼ばれてるのかまで追いきれてないので、どんな場合もこれが呼ばれて危ない文字が排除されるのかどうかは確認できてない。ちなみに ldns も ldns_rdf2buffer_str_dname() という関数で同じ文字を潰してる。

_ おまけ。逆引きに 0x00 (NUL) が含まれていた場合の各 OS の getnameinfo() の挙動。foo.example.com.(NUL)bar.example.net. という逆引きを DNS につっこんだ。

NUL 以降を捨てるリゾルバは DNS に存在していたものとまったく異なる名前を返しているわけで、これによって逆引きを誤認させることができると言えなくもないんだけど、そもそも逆引き自体がいくらでも詐称可能なので、別にできたからといって通常の逆引き詐称とと大差ない。これをもってセキュリティ的に危ないことができるわけじゃないと思う。


2014年11月23日(日) 勤労感謝の日

無題

_ せっかくの3連休なのに、急用ができてどこにも行けなくなってしまった。今年は晴天の週末が貴重なのに…。


<< = >>
やまや