ソースポートランダマイゼーションとその効果について解説する。
ソースポートランダマイゼーションとは、クエリごとに、フルリゾルバ(いわゆるキャッシュDNSサーバー)が権威DNSサーバーに送るクエリパケットのソースポート番号をランダムに変化させることである。
DNSキャッシュポイズニング(キャッシュ汚染)攻撃を防止するために、フルリゾルバはサーバーに送ったクエリを記録しており、クエリに対応するレスポンス以外を捨てる。図1に、DNSクエリ/レスポンスパケットフォーマットを示す。確認する情報は、権威DNSサーバーのアドレス(図1の「Auth server」)、ポート(53)、フルリゾルバのアドレス(図1の「FullResolver」、通常は1つ)、フルリゾルバのポート番号(図1の「f_source」)、クエリID(16ビット長、図1の「QID」)、クエスチョンセクションの内容(クエリ名、タイプ、クラス(図1の「qname/type」))である。
レスポンスを推定して偽装応答を注入する場合、上記6つのパラメーターを推定する必要がある。権威DNSサーバーのアドレス数をNとし、権威DNSサーバーのポートは53固定で1、フルリゾルバのアドレス数は通常1、フルリゾルバのポート番号が固定ならばポート番号数1、クエリIDの取り得る数は 216の65536、問い合わせ内容を知っていればクエリセクションも分かるために既知であると仮定すると、推定する必要のある取り得る数はN×65536 となる。
すると一度の試行による攻撃成功確率は 1÷(N×65536) となるが、推定には全てを試すという解決策(いわゆる「総当たり攻撃」)があり、N×65536回の試行を行うと確実に注入が成功することになる。現在のコンピューターやネットワークの処理能力では100万パケット程度の生成は容易であるため、攻撃は容易に成立する。
ここで、取り得る数を増やせるパラメーターはないか考えると、先ほど固定としていたフルリゾルバのポート番号が16ビットある。つまり、クエリごとにポート番号を変更することで攻撃成功確率を下げることができる。
ポート番号には使いにくいもの(0〜1023番)があるため、おおよそ6万4000程度の範囲を取り得るとすると、ポート番号をランダムにすることで一度の試行による攻撃成功確率を 1÷(N×65536×64000) にできる。毎秒100万回の試行を行っても、全ての場合を試すには N×65536×64000÷1000000=約4194×N秒かかることになり、その間には正当なレスポンスが戻ってきている。そのため、ソースポートランダマイゼーションで攻撃成功確率を下げることができる。
Copyright © ITmedia, Inc. All Rights Reserved.