Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

QuickSort Killer

29,384 views

Published on

ウサギィ勉強会で発表した資料を加筆修正したものです。
「ハードウェア業界の人達へWeb系の話をしてくれ」と振られたのですが、Web界隈のことがわからないので、悩んだ末にQuickSortの最悪計算量がO(n^2)であることを利用するとDoS攻撃が出来ると自分でも無理があると思うこじつけをして発表しました。

  • Be the first to comment

QuickSort Killer

  1. 1. ウサギィ勉強会 #001 ソフトウェアクラスタとハードウェアクラスタの交流会(?)
  2. 2. 磯野ー!サーバ落とそうぜ!(アルゴリズムDoS攻撃)Usagee Inc. Kazuya Gokita2012/05/27
  3. 3. 自己紹介✤ Kazuya Gokita (Twitter: @kazoo04)✤ 今年の元旦にウサギィ入社✤ Webサービスのこととかよくわかんないので面白い話できない✤ タイトルはジョークです(予防線)
  4. 4. 今日のテーマ(?):DoS攻撃✤ Denial of Service attack の略✤ ある程度人が増えてくると避けては通れない気がする✤ サーバに負荷をかけて重くするいやがらせ✤ 有名な方法といえば…
  5. 5. F5アタック
  6. 6. それだけじゃないよアルゴリズムの をついて攻撃できるよQuickSortの最悪計算量がO(n^2)であることを利用するとか
  7. 7. QuickSort✤ ソート(並べ替え)アルゴリズムのひとつ✤ よく使われていると思う(Cの qsort は QuickSort の略)✤ 平均計算量はO(n log n)✤ 要するに早い
  8. 8. Algorithm✤ 今回は知らない人もいると思うので簡単に✤ pivotを選ぶ(ここでは5)✤ pivot以下のものを左へ移動✤ pivotより大きいものを右へ移動✤ 左右それぞれに対して上記を繰り返す
  9. 9. 処理の流れ [897356214] ↓ [34215] [8976] ↓ [213] [45] [67] [89] ↓ [21] [3] [4] [5] [6] [7] [8] [9] ↓ [1] [2] [3] [4] [5] [6] [7] [8] [9]
  10. 10. QuickSortの弱点 [1][39274865] ↓✤ 最悪計算量がO(n^2) [1] [2] [3974865] ↓ ✤ データによっては超遅くなる [1] [2] [3] [974865] ↓✤ 下手にpivotを選ぶとヤバイ [1] [2] [3] [4] [97865] ↓✤ 中央値をpivotに選べればよいが…? [1] [2] [3] [4] [5] [9786] ↓ …
  11. 11. これくらい違うよ
  12. 12. ということは✤ Worst case になるようなデータを作る✤ 気に食わないWebサービスにどうにかしてアップロードする✤ ソートさせる✤ これで負荷をかけられるのでは?
  13. 13. 今時そんな弱点を放置している実装が 果たしてあるのか?
  14. 14. そういう実装を探す 徹夜で調査したよ 処理系 調査結果 眠い!! Ruby たぶん対策済 あと間違ってるかも C++(Boost) IntroSortへ変更 Haskell MergeSortへ変更 @yuya_takeyamaさん(PHP) Java MergeSortへ変更 @xenophobia__さん(Haskell) @repeatedlyさん(D) Perl MergeSortへ変更アドバイスありがとうございました C(glibc) 未対策 D(Phobos) 未対策glibcについては以下を参照しました http://d.hatena.ne.jp/qnighy/20090503/1241329233 PHP 未対策
  15. 15. 攻撃用データの作成 “A Killer Adversary for Quicksort” M. D . MCILROY もともとは「Cのqsort()を使って、qsort()が遅くなるデータを作ることができる」 ということを言っている論文。 今回はこれを参考にしてデータを作成した。
  16. 16. N=32の攻撃用データ(一例) [1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]✤ ポイント ✤ 前半は1∼N/2までと、(N/2)+1 ∼ N-1 までの奇数データを交互に ✤ 後半は残った偶数データを昇順でソートしたデータ
  17. 17. k = N / 2;k.times do |i|! data[i] = (i % 2 == 0) ? i + 1 : k + iend(k...N).each do |i|! data[i] = (i - k + 1) * 2end
  18. 18. ベンチマーク✤ 普通のデータ(ランダムなデータ)✤ 攻撃用データ✤ 実行時間を調べてみた(適当)✤ 測定条件が違うので言語同士の比較はできない(適当)✤ Twitter見ながら測定してたので誤差が結構あります(適当)
  19. 19. 結果(PHP) N≒1e+04 N≒1e+05 N≒1e+06 通常データ < 1 ms < 1 ms < 1 ms 攻撃データ 0.11 sec 1.82 sec > 60 secタイムアウトした…Timeoutを変更してまたやる元気はない。ねむい。
  20. 20. 結果(C言語) N≒1e+07 N≒1e+08 N≒1e+09通常データ 0.015 sec 1.68 sec 20.529 sec攻撃データ 0.185 sec 2.11 sec > 3600 sec 1時間動かしたけど終わらなかった。ねむい。
  21. 21. 回避策✤ 最近の主流?:QuickSortを使わない ✤ MergeSort, TimSort (Java, Haskell, Perl) ✤ IntroSort (C++)✤ 乱択アルゴリズムを組み込む(これはこれで別の問題がある) ✤ データをシャッフルしてからソートする ✤ ランダムに3つ選んで中央値をpivotにする✤ の技術を使う(Ruby) ←コード読んだけどよくわからん!ねむい!
  22. 22. まとめ✤ DoS攻撃≠F5連打✤ アルゴリズムの を突いて攻撃可能✤ 今回のテクニックがどういう状況なら使えるのかは知らん ✤ ユーザから数百万単位のデータを受け取ってソートするって…
  23. 23. 実はもう一個話題あった✤ 時間なかったからできなかった ✤ gzipで遊んでみた話✤ 睡魔に負けたともいう
  24. 24. Web全然関係ないよね ヽ(ω)ノ三ヽ(ω)ノ もうしわけねぇもうしわけねぇ これくらいしか思い浮かばなかった
  25. 25. ありがとうございました
  26. 26. 追記:なんで対策されてないのか✤ 俺が気づくくらいだから世間のプログラマは気づいているはず✤ っていうか少なくとも90年代には指摘されてる✤ 真偽はわからないけれど、こんな意見を貰った ✤ アルゴリズムを変えると結果が変わってしまうから(下位互換性) ✤ 実用的には問題になるケースがないから

×