- Diary
- │2016年02月22日 Tadashi Kobayashi│
信頼できるDNSキャッシュサーバとは
先の記事にて解説したとおり、 信頼できる通信路 との組み合わせにおいては、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で用いられている1UDPレスポンスにて、ヒープ確保を誘発させる手法は使えません。 しかしながら、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系最新版 |
- -
- カテゴリー :
- 脆弱性
- タグ :
- Vulnerability Linux
- この記事のURL :
- https://sect.iij.ad.jp/d/2016/02/225250.html