CVE-2015-7547 対策における信頼できるキャッシュサーバとは
先の記事にて解説したとおり、信頼できる通信路 との組み合わせにおいては、TCP のみで攻撃することは困難であるため、UDP におけるヒープ確保の阻止が焦点となります。つまり、A/AAAA の1セットの UDP レスポンスにおいて、それぞれが1024バイト、合計値が2048バイトを超過しない事が条件です。EDNS0 無効時においては、1レスポンスあたり512バイトであるため、仕様に沿っていればこれを超過しません。
多くの DNS キャッシュのソフトウェアにおいては、DNS クエリ/レスポンスのチェックや再構築をしているため、異常な構造を持つデータはフィルタされる場合が殆どです。EDNS0 無効時に512バイトを越えるデータを送りつけるような違反も同様です。
しかし、DNS の転送のみを行う DNS フォワーダにおいてはチェックが甘いため、今回の脆弱性に対する防御にはなり得ない場合もあります。その例として、多くの Linux ディストリビューションにて利用可能な dnsmasq において検証しました。
dnsmasq を経由した攻撃のシナリオ
dnsmasq の UDP レスポンスのサイズ制限はバージョンにより異なるようです。CentOS6 付属のバージョン 2.48-16.el6_7 では1280バイトに制限されていますが、配布元の最新版バージョン 2.75 では2048バイトを越えるパケットの通過を確認しています。
これより、低い方の制限値である1280バイトを前提とします。この制限により、PoC で用いられている 1 UDP レスポンスにて、ヒープ確保を誘発させる手法は使えません。しかしながら、EDNS0 無効時に512バイトを越えるレスポンスを転送してしまいます。A/AAAA クエリの合計値が2048バイトを越えた場合に、ヒープ確保が誘発されるため、以下の様なシナリオにおいて攻撃が成立します。
- UDP の A クエリに対して TC ビットなし1200バイト程度のデータを返す
- この時点では TCP フォールバックさせずに続く AAAA クエリを処理させる
- UDP の AAAA クエリに対して TC ビットあり1200バイト程度のデータを返す
- 合計値が2048を越えるためヒープ確保
- 更に TC ビットにより TCP フォールバックを誘発
- TCP の AAAA クエリに対して2048バイトを越えるデータを返す
- クライアントにてスタックバッファオーバーフローが発生
検証に用いた両バージョンにおいて、この手法により攻撃が成立することを確認しています。この結果により、dnsmasq は今回の脆弱性の回避策にはなり得ないと判断しました。
検証にて確認したソフトウェア
検証にて今回の脆弱性の回避策となり得たソフトウェアとバージョンを以下に表として示します。単体ではなく必ず 信頼できる通信路 と組み合わせる必要があります。
EDNS0 無効時に512バイトを越えるデータを送らないというのは、DNS のソフトウェアとしてはかなり基本的な部分であるため、他のバージョンであっても同一ソフトウェアであれば同じ動作をすると推測されます。
ソフトウェア名 | バージョン | 備考 |
---|---|---|
BIND | 9.9.8-P3 | 配布元最新版 |
BIND | 9.3.6-25.P1.el5_11.6 | CentOS5 系最新版 |
BIND | 9.8.2-0.37.rc1.el6_7.6 | CentOS6 系最新版 |
BIND | 9.9.4-29.el7_2.2 | CentOS7 系最新版 |
Unbound | 1.5.7 | 配布元最新版 |
Unbound | 1.4.20-26.el7 | CentOS7 系最新版 |