現代的な DNS キャッシュサーバは RFC 4035 の要請により、DNSSEC 署名の検証を必要としないポリシーのもとにおいても無駄な DNSSEC 応答を要求する DO bit フラグが立ってしまっており、第一フラグメント便乗攻撃に脆弱になっています。
またデフォルト設定の Unbound は否定応答に付随する NS や A をキャッシュに取り込んでしまうため非常に危険な状態で動作してしまいます。
12/5 追記:
Unbound 1.8.2 releasedに "The nameserver records in large returned negative responses are scrubbed out of the packet to avoid fragmentation based DNS cache poisoning, from a report from T.Suzuki." とあるようにこの否定応答における深刻な脆弱性は 1.8.2 で解消されました。すぐにバージョンアップしましょう。(各種バリエーションのある第一フラグメント便乗攻撃すべてが解消したわけではありません)
追記その2: rec: Skip NS records in authority/additional sections of NXD / NODATA #7258のようにPowerDNS Recursor も対応してくれました。
第一フラグメント便乗攻撃に対して耐性を強くするためには、DO bit を 0 にして、Unbound では edns-buffer-size: 512、harden-referral-path: yes を設定するとよいでしょう。(10/31の記事参照)
Unbound で DO bit を 0 にする方法を以下に示します。FreeBSD の ports を利用の場合です。DO=0 にする設定はないのでパッチ (以下の sed の部分) が必要です。自分の環境に合わせて作業してください。
# portsnap fetch # portsnap update # cd /usr/ports/dns/unbound # make clean # make extract # sed -i '' -e 's/EDNS_DO 0x8000 \/\* Dnssec Ok \*\//EDNS_DO 0x0000 \/\* Dnssec NO \*\//' work/unbound-1.?.?/util/net_help.h # grep Dnssec work/unbound-1.?.?/util/net_help.h # make # make deinstall # make reinstall # echo 'unbound_enable="YES"' >> /etc/rc.conf # echo 'unbound_anchorflags="-l"' >> /etc/rc.conf (注: 起動スクリプトが trust anchor を取り寄せようとするのを抑止するため) # echo 'module-config: "iterator"' >> /usr/local/etc/unbound/unbound.conf # echo 'harden-referral-path: yes' >> /usr/local/etc/unbound/unbound.conf # service unbound restart
これだけで安全になるわけではありませんが、第一フラグメント便乗攻撃のリスクはかなり低減できるはずです。なお当然ながらこの記事により生じた問題、あるいは私を信用しなかった場合に生じた問題等に私は一切の責任を持ちません。自分の頭脳で考えて行動しましょう。
Copyright by T.Suzuki
unboundにはDNSSECを使わないという選択はないのですか。
検証は validator の設定を消すことで止められますが、DNSSEC 応答を要求する DO bit を止めるためにはこのようにパッチを当てるしかないですね。推進者たちが傲慢なんですよ。
Unboundを捨てるという選択もある。<br>BINDではDNSSECをやめるoptionがあるような話を見かけた。<br>(事実はどうかは知らない。)
BIND も DO bit は落とせないようです。傲慢な RFC 4035 は修正されるべきですね。
DO bitを立てないことが目的なら、dnscacheをどうぞ。<br><br>RFCを非難するなら、draftを書いてください。<br><br>RFCを変えても実装が守らなければ、状況は変わらない。<br>(変える気はないのでしょうけど。)
service restart unbound ではなく service unbound restart のようです。
こじまさんありがとうございます。間違えていましたね。<br>RFC を変えさせようとするのは無駄な努力だと思うので手は出しません。
EDNSのbuffer sizeを小さくすることでもフラグメント化の危険を減らすことができると思いますが、そういう対策ではまずいのでしょうか。
良いと思います。偽の ICMP too big で MTU をかなり小さくみせかけられるので、512 まで下げてしまうと良いと思います。mufj.jp をごらんください。
mufj.jp はゾーンサーバー側での防衛策ですね。<br><br>私のはリゾルバー側での防衛策の話です。
どちら側でも有効ですね。
DNSSECでなくとも危ない。というのが正しそう。
Unboundだけではなさそうなので、もっと広く警告したい。