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.
ウサギィ勉強会 #001

   ソフトウェアクラスタと
ハードウェアクラスタの交流会(?)
磯野ー!サーバ落とそうぜ!
(アルゴリズムDoS攻撃)
Usagee Inc. Kazuya Gokita

2012/05/27
自己紹介

✤   Kazuya Gokita (Twitter: @kazoo04)

✤   今年の元旦にウサギィ入社

✤   Webサービスのこととかよくわかんないので面白い話できない




✤   タイトルはジョークです(予防線)
今日のテーマ(?):DoS攻撃


✤   Denial of Service attack の略

✤   ある程度人が増えてくると避けては通れない気がする

✤   サーバに負荷をかけて重くするいやがらせ

✤   有名な方法といえば…
F5アタック
それだけじゃないよ



アルゴリズムの をついて攻撃できるよ
QuickSortの最悪計算量がO(n^2)であることを利用するとか
QuickSort


✤   ソート(並べ替え)アルゴリズムのひとつ

✤   よく使われていると思う(Cの qsort は QuickSort の略)

✤   平均計算量はO(n log n)

✤   要するに早い
Algorithm

✤   今回は知らない人もいると思うので簡単に




✤   pivotを選ぶ(ここでは5)

✤   pivot以下のものを左へ移動

✤   pivotより大きいものを右へ移動

✤   左右それぞれに対して上記を繰...
処理の流れ


              [897356214]
                     ↓
             [34215] [8976]
                     ↓
          [213...
QuickSortの弱点
                                [1][39274865]
                                       ↓
✤   最悪計算量がO(n^2)      ...
これくらい違うよ
ということは

✤   Worst case になるようなデータを作る

✤   気に食わないWebサービスにどうにかしてアップロードする

✤   ソートさせる




✤   これで負荷をかけられるのでは?
今時そんな弱点を放置している実装が
    果たしてあるのか?
そういう実装を探す
   徹夜で調査したよ                                           処理系         調査結果
              眠い!!                       ...
攻撃用データの作成


    “A Killer Adversary for Quicksort”
             M. D . MCILROY
                 もともとは
「Cのqsort()を使って、qsort...
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, 1...
k = N / 2;
k.times do |i|
! data[i] = (i % 2 == 0) ? i + 1 : k + i
end

(k...N).each do |i|
! data[i] = (i - k + 1) * 2
end
ベンチマーク

✤   普通のデータ(ランダムなデータ)

✤   攻撃用データ




✤   実行時間を調べてみた(適当)

✤   測定条件が違うので言語同士の比較はできない(適当)

✤   Twitter見ながら測定してたので誤差が結...
結果(PHP)

          N≒1e+04    N≒1e+05    N≒1e+06


 通常データ    < 1 ms     < 1 ms     < 1 ms


 攻撃データ    0.11 sec   1.82 sec ...
結果(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...
回避策
✤   最近の主流?:QuickSortを使わない

    ✤   MergeSort, TimSort (Java, Haskell, Perl)

    ✤   IntroSort (C++)

✤   乱択アルゴリズムを組み込...
まとめ


✤   DoS攻撃≠F5連打

✤   アルゴリズムの      を突いて攻撃可能

✤   今回のテクニックがどういう状況なら使えるのかは知らん

    ✤   ユーザから数百万単位のデータを受け取ってソートするって…
実はもう一個話題あった


✤   時間なかったからできなかった

    ✤   gzipで遊んでみた話




✤   睡魔に負けたともいう
Web全然関係ないよね


    ヽ('ω')ノ三ヽ('ω')ノ
  もうしわけねぇもうしわけねぇ


 これくらいしか思い浮かばなかった
ありがとうございました
追記:なんで対策されてないのか

✤   俺が気づくくらいだから世間のプログラマは気づいているはず

✤   っていうか少なくとも90年代には指摘されてる

✤   真偽はわからないけれど、こんな意見を貰った

    ✤   アルゴリズムを変...
Upcoming SlideShare
Loading in …5
×

of

QuickSort Killer Slide 1 QuickSort Killer Slide 2 QuickSort Killer Slide 3 QuickSort Killer Slide 4 QuickSort Killer Slide 5 QuickSort Killer Slide 6 QuickSort Killer Slide 7 QuickSort Killer Slide 8 QuickSort Killer Slide 9 QuickSort Killer Slide 10 QuickSort Killer Slide 11 QuickSort Killer Slide 12 QuickSort Killer Slide 13 QuickSort Killer Slide 14 QuickSort Killer Slide 15 QuickSort Killer Slide 16 QuickSort Killer Slide 17 QuickSort Killer Slide 18 QuickSort Killer Slide 19 QuickSort Killer Slide 20 QuickSort Killer Slide 21 QuickSort Killer Slide 22 QuickSort Killer Slide 23 QuickSort Killer Slide 24 QuickSort Killer Slide 25 QuickSort Killer Slide 26
Upcoming SlideShare
運動制御
Next
Download to read offline and view in fullscreen.

7 Likes

Share

Download to read offline

QuickSort Killer

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

QuickSort Killer

  1. 1. ウサギィ勉強会 #001 ソフトウェアクラスタと ハードウェアクラスタの交流会(?)
  2. 2. 磯野ー!サーバ落とそうぜ! (アルゴリズムDoS攻撃) Usagee Inc. Kazuya Gokita 2012/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 + i end (k...N).each do |i| ! data[i] = (i - k + 1) * 2 end
  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年代には指摘されてる ✤ 真偽はわからないけれど、こんな意見を貰った ✤ アルゴリズムを変えると結果が変わってしまうから(下位互換性) ✤ 実用的には問題になるケースがないから
  • litmc

    Jun. 27, 2017
  • kenseidemura

    May. 25, 2015
  • rsatojp

    May. 30, 2014
  • KanSakamoto

    Dec. 31, 2012
  • MasayukiIsobe

    Dec. 10, 2012
  • tsuyoshicho

    Sep. 1, 2012
  • TakeshiWatanabe2

    May. 27, 2012

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

Views

Total views

30,905

On Slideshare

0

From embeds

0

Number of embeds

19,815

Actions

Downloads

18

Shares

0

Comments

0

Likes

7

×