狠狠撸

狠狠撸Share a Scribd company logo
ブルームフィルタを利用した
ランダムサブドメイン攻撃から
のDNSキャッシュサーバの防御
東?大亮
1
(更新版)
ランダムサブドメイン攻撃
(に巻き込まれたキャッシュサーバ)
victim.com
権威サーバ
キャッシュ
サーバ
正規ユーザ
攻撃者(踏み台)
www.victim.com?
mail.victim.com?
awfbh.victim.com?
uscz8.victim.com?
abqce.victim.com?
qpdks.victim.com?
qpdks.victim.com?
abqce.victim.com?
uscz8.victim.com?
awfbh.victim.com?
www.victim.com?
mail.victim.com?
2
キャッシュサーバにおける
一般的な防御
victim.com
権威サーバ
キャッシュ
サーバ
正規ユーザ
攻撃者(踏み台)
www.victim.com?
mail.victim.com?
awfbh.victim.com?
uscz8.victim.com?
abqce.victim.com?
qpdks.victim.com?
?
?
?
?
?
?
victim.comゾーンへの問
い合わせをすべてブロッ
ク or レートリミット
BIND9: ローカルゾーン、fetch-per-zone、fetch-per-server
Unbound: ローカルゾーン、ratelimit (ver1.5.4~)
3
攻撃対象ゾーンへのクエリを
ブロックすると???
? 確かにキャッシュサーバは防御できるが、そのゾーンはキャッシュサー
バで完全に解決不可(DoS)状態になる
? ある意味、攻撃者の思う壺!
? 有名ドメイン名への攻撃に巻き込まれたら? google.com や
twitter.com をブロックするのか?
? 自動的に攻撃対象ゾーンを検出する機構を運用していた場合、攻撃で
ないものを攻撃と誤検知し、ブロックすべきでないゾーンをブロック
対象にしてしまったら?
? 攻撃クエリはブロックし、正規クエリは受けつけて名前解決したい!
4
防御の理想形
victim.com
権威サーバ
キャッシュ
サーバ
正規ユーザ
攻撃者(踏み台)
www.victim.com?
mail.victim.com?
awfbh.victim.com?
uscz8.victim.com?
abqce.victim.com?
qpdks.victim.com?
?
?
?
?
www.victim.com?
mail.victim.com?
victim.comゾーンへのク
エリのうち、正規クエリ
のみ受け付けしたい!
5
正規クエリと攻撃クエリの
判定
www.victim.com?
mail.victim.com?
awfbh.victim.com?
uscz8.victim.com?
abqce.victim.com?
qpdks.victim.com?
正規クエリは存在するドメイン名
へのクエリ: 結果はNOERROR
攻撃クエリは存在しないドメイン名
へのクエリ: 結果はNXDOMAIN
6
正規クエリ
攻撃クエリ
キャッシュサーバ(リゾルバ)が、権威サーバに問い合
わせる前に、NOERRORになりそうなクエリかどうか
判定できればよい(さもなくばブロック)
「NOERRORになりそうな
クエリ」
? そのキャッシュサーバで、過去N時間までにNOERROR
になったドメイン名(QNAME)へのクエリは、今度のク
エリも「NOERRORになりそう」と仮定して受け付ける
? 逆に、過去N時間までにNXDOMAINになった/ユーザ
からのクエリが無かったQNAMEは、今回も
NXDOMAINになる/正規ユーザも関心が無いドメイン
名とし仮定し、攻撃中はブロックしても問題ないと仮定
? Nは比較的長時間 (N=24時間 or 48時間 etc)
7
過去24時間のNOERRORなQNAMEを
どうやって覚えておくか?
? DNSのクエリは超大量にある
? (主に攻撃を受けやすい)ISP環境では、数千~数
万クエリ/秒
? 記憶には大量のメモリが必要
? 防御時に高速検索が必要
8
NOERRORなドメイン名を
ブルームフィルタで記憶
? ブルームフィルタ(Bloom ?lter)とは
? 検索キーが、検索対象の集合に属しているか否か
を、少ないメモリ量で記憶し、高速に判定可能な
確率的データ構造
? Wikipediaの同名記事の解説がわかりやすい
9
ブルームフィルタの特徴
? 使用メモリが少ない
? 1%の偽陽性率ならば、9.6ビット/要素のメモリ量でよい。
? 8.6億個 ( 毎秒1万個 24時間) の QNAMEなら1Gバイトでよい
? 記憶?検索が高速
? 記憶?検索いずれもO(1)
? 記憶済の要素数?メモリ量に応じ、偽陽性が発生する
? 偽陽性(false positive)とは、検索キーが検索対象の集合に存在しないのに
「存在する」と誤って判定してしまうこと。
? なお、BFでは偽陰性(存在するのに「存在しない」と誤判定)は発生しない
10
※BF記憶?検索の時間計算量は記憶済の要素数や使用メモリ量には依存しない。厳密には偽陽
性率を決めるパラメータkに比例はするが、偽陽性率1%で固定すればO(1)と見なせる
Unboundに実装してみた
? 通常時の動作
? ユーザからのクエリのうち、NOERRORとなったQNAMEを、ひたす
らBFに入力
? 攻撃時の防御
? 攻撃対象ゾーンへのクエリのうち、BFにヒットするもの(過去に
NOERRORになったもの)を受け付け。ヒットしないものはブロック。
? 攻撃対象ゾーンは、手動指定の他、自動判定+BF自動適用が可能
11
Githubで公開してます:
https://github.com/hdais/unbound-bloom?lter
Bloom?lterによる
victim.comゾーン宛クエリの防御
victim.com
権威サーバ
キャッシュ
サーバ
正規ユーザ
攻撃者(踏み台)
www.victim.com?
mail.victim.com?
awfbh.victim.com?
uscz8.victim.com?
abqce.victim.com?
qpdks.victim.com?
?
?
?
?
www.victim.com?
mail.victim.com?
12
veryrarename.victim.com?
?
ugjks.victim.com?
BFにマッチしない
QNAMEは正規?不正ク
エリに関わらずブロック
BFの偽陽性のため、
攻撃クエリもわずかに
「漏洩」する
BFにマッチする
QNAMEは受け付け?再
帰検索処理を行う
unbound-bloom?lterの
使用法
? BF有効化?使用するメモリ量?BFのリセット時間間隔の設定 (unbound.conf)
server:
bloomfilter-size: 1024m
bloomfilter-interval: 86400
→BF学習が有効になる。使用するメモリは
1GBx2=2GB。86400秒毎にBFをリセット
? 手動指定:ランダムサブドメイン攻撃時に、BF適用対象ゾーンを手動指定 (CLI)
$ unbound-control local_zone victim.com bloomfilter
→victim.comゾーンへのクエリにBF適用
13
$ unbound-control local_zone_remove victim.com
→victim.comゾーンへのBF解除
unbound-bloom?lterの
攻撃ゾーン自動判定①
14
? ゾーン毎に、requestlist (BIND9のrecursive clientsに相当) に長時間居座るクエリ数を制限
server:
bloomfilter-size: 1024m
bloomfilter-interval: 86400
bloomfilter-threshold: 100
→ requestlistに長時間(2秒以上)居座るクエリが
?100個を超えたゾーンにBF適用
(一定時間後、自動解除)
?ゾーンの分類にはpublicsu?xlistを使用。
QNAME
クライアントから受信して
からの経過時間
nwdw.victim.com 3.2
msdfw.victim.com 0.1
sdjef.victim.com 2.3
dmsfg.victim.com 2.4
www.example.com 1.3
mail.example.com 0.2
ゾーン
2.0秒以上「居座っている」
クエリ数
victim.com 3
example.com 0
クエリ数がbloom?lter-threshold指定値を超
えているゾーンを自動的にブルームフィルタ
requestlistの内容
名前解決に時間がかかっているクエリ数を
ゾーン毎に集計
saywc.victim.com
unbound-bloom?lterの
攻撃ゾーン自動判定②
? ゾーン毎に、BFマッチしないキャッシュミスクエリをレートリミット
server:
bloomfilter-size: 1024m
bloomfilter-interval: 86400
bloomfilter-ratelimit: 1000
→ ゾーン毎にキャッシュミスは1000qpsに制限。
超えたものはBF適用。ゾーンの分類には
publicsu?xlistを使用
キャッシュ
サーバ
?
?
?
1000qps
BFにマッチするクエリは
ratelimit非適用
victim.com
権威サーバ
mail.victim.com
www.victim.com
nsjkf.victim.com
kjsvd.victim.com
ujekc.victim.com
ejsdv.victim.com
ijkac.victim.com
正規ユーザ
攻撃者
正規ユーザ example.com
権威サーバ
BFにマッチせず、
キャッシュミスしたクエリはゾーン毎にratelimit
www.example.com
ratelimit値に達しないゾーンへのクエリには影響なし
2000qps
課題
? そもそも「過去N時間にNOERRORになったクエリのみ受け付ける」が正
規クエリのみ受付けるために有効なのか?
? まったく未検証!
? 有効だとしても、どのようなチューニングをすべきか? 特に、過去どれ
だけの期間?個数のNOERRORなドメイン名を集めればよいか
? ワイルドカードなゾーン (tumblr.comとかblogspot.jp)が攻撃された時は
無力かもしれない
? 通信の秘密!攻撃時はともかく、平常時でもユーザクエリを分析してBFに漬け込むの
はどうなのよ etc
16
現状
? unbound-users MLでbloom?lterを紹介したら、海外某ISPの方
から色々問い合わせ。使ってくれてるらしい。
? Unbound本家も、unbound-bloom?lterやBIND9を意識したのか、
実験的なランダムサブドメイン攻撃対策が入った (ver 1.5.4~)
? ゾーン毎にキャッシュミス数をratelimit
? ratelimit超えたキャッシュミスクエリはブロックするが、1/10 (設定変更可能)の確
率で受付ける。正規ユーザから人気があるQNAMEなら、いずれブロックをすり抜け
て受付けられキャッシュに乗るだろうとの仮定。
? 「ゾーン毎」を分類するのにPublic Su?x Listは使用していない(これはGood)
17
END
backup slides
unbound-bloom?ter
名前解決速度への影響
? 通常時 (キャッシュミス 100%の最悪時)
? BFに学習なし: 15,863 qps
? BFに学習あり: 14,810 qps ▲6.64%
? victim.com防御時 (victim.comへのクエリ100%の最悪時)
? victim.com refuse: 135,617 qps
? victim.com bloom?lter: 113,953 qps ▲16.0%
? (参考) victim.com キャッシュヒット: 95,371 qps
通常時のBF学習のペナルティは、100%キャッシュミスの最悪時でも6~7%程度。
bloom?lter防御時のペナルティは、REFUSEよりも16%悪いが、キャッシュヒットよりは高速
テストマシン: Core2Duo 1.6GHz(2core) / Mem 2GB
BFサイズ: 1GB / キャッシュサイズ1GB
20
攻撃対象ドメインへのクエリ
をブロックすると???
21
cloud?are.comへの水責め攻撃に巻き
込まれた某ISPのキャッシュサーバ
そのISPはcloud?are.comへのクエリ
をすべてブロックした
clould?are.comへの正規クエリと攻撃クエリを、キャッシュサーバが機械的に
識別することは、普通は困難のため、全クエリをブロックせざるを得ない
(そうしなければ、サーバが過負荷で停止してしまう)

More Related Content

ブルームフィルタを利用した ランダムサブドメイン攻撃(DNS水責め)からのDNSキャッシュサーバの防御