現代的な 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
Before...
■ tss [どちら側でも有効ですね。]
■ tm [DNSSECでなくとも危ない。というのが正しそう。]
■ tm [Unboundだけではなさそうなので、もっと広く警告したい。]