パスワードを忘れた? アカウント作成
13958399 story
ネットワーク

Cloudflare、全世界で発生した障害の経緯を解説 43

ストーリー by headless
解説 部門より
Cloudflareが2日におよそ30分間にわたって発生した障害について解説している(Cloudflareのブログ記事The Registerの記事)。

Cloudflareでは復旧直後のブログ記事でWeb Application Firewall(WAF)の新ルールにCPUを100%使用する正規表現が含まれていたことと、ルールが段階的ではなく短時間に全世界に展開されたことを原因としていたが、世界規模の障害につながった理由はそれだけではないという。問題の正規表現には  .*(?:.*=.*)  という部分があり、これが多数のバックトラックを生む原因となったのだが、テストには極度なCPU使用を確認する項目がなかったそうだ。

また、極度なCPU使用を防止する保護機能が数週間前に誤って削除されていたこと、Cloudflareの他のソフトウェアと異なり迅速性が重視されるWAFルールは全世界に一括展開されるようになっていたこと、サービスがダウンして内部のコントロールパネルで認証が行えない状態だったことも原因として挙げられている。新ルールは当初、ユーザーのトラフィックをブロックせずにパススルーする「シミュレート」モードで展開されていたものの、処理自体は実際に行われるためCPU使用率の上昇につながったとのこと。

今回の問題を受けてCloudflareでは極度なCPU使用に対する保護機能を復元し、すべてのWAFルールを人力でチェックして極度なバックトラックが発生する可能性を排除したという。また、ルールを段階的に展開するようSOP(Standard Operating Procedure)を変更中であり、ルールのパフォーマンスを確認する項目をテストに追加することや、正規表現エンジンの切り替えも予定しているとのことだ。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by minet (45149) on 2019年07月15日 12時41分 (#3651894) 日記

    3、4年くらい前に話題になったやつだね。
    自分も仕事でウッカリやっちまわないかと思うとワラエナイ。
    パフォーマンスとしての話題
    正規表現:悪い表現、いい表現、最良の表現 [postd.cc]
    脆弱性としての話題
    StackExchangeが攻撃されたReDoSの効果 [ohgaki.net]

    • by Anonymous Coward on 2019年07月15日 14時18分 (#3651919)

      本気で速度が要求されるコードは、素人が書くべきではないということかな。
      もちろんCloudflareならその道の専門家が多数いるんだろうけど、そうではない人が気軽に書いちゃったんだろうか。

      1個目の記事にもある通り、素人ならこういう差が出るものだってことを認識して、適切な人に任せる必要があることが分かってれば十分。
      初めのコードがダメなことは分かるけど、だからといって最適なコードを用意できるかと言われると難しい。

      親コメント
      • by hjmhjm (39921) on 2019年07月16日 13時28分 (#3652205)

        × 本気で速度が要求されるコード
        ○ 本番用のコード

        × 素人が書くべきではない
        ○ ちゃんとテストするべき

        これくらいのミスは誰でもするやろ。
        アカンのは「極度なCPU使用を防止する保護機能が数週間前に誤って削除されていたこと」やな。「保護機能」の詳細はわからんけど、きっとここだけが唯一かつ最凶レベル。

        親コメント
      • by Anonymous Coward on 2019年07月15日 19時10分 (#3651972)

        コードといっても正規表現だからね。言語としては最上級でしょ。性能が問題になるほど重要なら、正規表現を使わない文字列処理をすれば安全なんじゃないかと。もともとそんなにガチの用途に耐えられる設計じゃなくて痒い所に手を届かせる程度のものなんだから。

        親コメント
        • by Anonymous Coward

          正規表現は(1-テープチューリング機械ですら)たかだかDTIME(o(nlog(n)))なのに対して普通のプログラミング言語で書いたものは停止性の証明すらできないが。

    • by Anonymous Coward on 2019年07月16日 11時44分 (#3652158)

      [12]\d{3}-[01]\d-[0-3]\d ([^ \[]*?)\[([^\]]*?)\]:.*

      でも、この「最良の正規表現」、西暦3000年になると動かなくなるよね……。

      親コメント
      • by Anonymous Coward

        ぜひ RFC 2550 に対応してください!

    • by Anonymous Coward

      正規表現のバックトラックの落とし穴の話自体は随分前に聞いた気がする。
      先輩からだったかなあ。その時に、くれぐれも注意して使えと釘を刺された覚えが。

      「Mastering Regular Expressions」 https://www.amazon.co.jp/dp/B007I8S1X0/ [amazon.co.jp]
      とりあえずコレが2006年で、バックトラックは便利だけど効率上の落とし穴があるとは書いてる。
      (詳しくはチャプター6をヨメってさ。)

      初版の方は未確認だけど、その頃から知ってる人は知ってた話なのでは。
      それこそ正規表現エンジンを作ってる側の人は、その性質も込みだから最初から知ってたろうしね

      • by Anonymous Coward on 2019年07月16日 2時56分 (#3652064)

        この正規表現の件とか、TCP/IPやプロセッサ関連の話題なんかで
        当時ありきたりの話がいま伝承じみた扱いになってるのをみると
        何というか少しゾクリとすることがある

        親コメント
        • by Anonymous Coward

          なあに、7payみたいにあれだけ盛大にやらかしても、責任者は責任取らなくていいんですよ。
          雲の上の人は気楽なもんです。

          現場の危機感については、まるで聞く耳持たないんだもの。

          • by Anonymous Coward

            責任を取るためだけにいるやつがその責任すら取らないんだったらマジで存在価値ないな

      • >とりあえずコレ

        レビュー(書評)本文が英文だったのが新鮮だった。
        amazon.co.jp のレビューは取り扱い商品同様相互に
        各国amazonから自由にやりとりできてうらやましい。

        親コメント
      • by Anonymous Coward

        つーか愚直に探索するとありきたりな表現でもくっそ遅い。
        単純文字列検索ですら、BM法がアルゴリズムの教科書の定番ネタだったりするくらいだし、
        実用の正規表現エンジンが愚直な実装であることを前提とするのは素人もいいところかと。
        正規表現は遅いのが当たり前で、そこから各自高速化されているのも当たり前。

        そして最終的には「そのエンジンで」高速に処理できないパターンになってるかどうかの問題になる。
        特定の構造が遅い速いってのは環境依存のあるTipsかと。

        • by Anonymous Coward

          コンパイラーが最適化してくれるからってわざわざ非効率なコードを書く必要はないんですよ。
          むしろやってくれるかどうかもわからない最適化に期待することこそ素人もいいところだと思うんですが

        • by Anonymous Coward

          >単純文字列検索ですら、BM法がアルゴリズムの教科書の定番ネタだったりするくらいだし、
          単純文字列検索「だから」そういう原始的な高速化技法があるんでしょ。
          不特定多数の複雑なパターンマッチにおいては、一般的な最適化技法はないと思う。

          仮にあっても、その正規表現を数回しか使用しないのであれば、最適化に
          かかる時間の方が、最適化によって短縮される時間より長くなって本末転倒。
          正規表現部分を何万回も何十万回も使ってボトルネックになる場合は、一流の
          プログラマなら正規表現なんて使わない形に書き直す。

          なので不特定多数の正規表現の汎用的な最適化なんて不可能だし実装してないんじゃないだろうか。

          JavaのHotSpotVMによって高度な動的最適化が日常的に利用可能になったから、
          そこで行われている最適化がどれほど無茶なことか分からない初心者も増えて
          しまったのかもしれない。
          HotSpotVMは、もはや初心者の理解を超えてるもんね。

    • by Anonymous Coward

      >長い方がいい正規表現
      うっ。いかにして短くするかに腐心してきた感あり…。

  • by Anonymous Coward on 2019年07月16日 12時16分 (#3652171)

    リンク先のBlog(↓)ですが、Cloudflare内でのデプロイプロセスなどが詳細に説明されており、
    そちらが非常に参考になりました(むしろ障害の内容よりも、、、)
    https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/ [cloudflare.com]

    「How Cloudflare operates」以下に書かれていますが、手順(SOPといってるやつ)がきちんと定義されているほか、
    変更管理の手法がきちんとしていること(JIRAでのChange Requestや上長の承認)や、
    ドッグフーディングについて3段階で実施している(DOG⇒PIG⇒カナリアと進む)など
    こういう洗練されたオペレーションにもっていきたいです

    # とおいめ

  • by youbun68 (48392) on 2019年07月15日 11時49分 (#3651877) 日記

    一瞬、タイトルの英文字だけ目に入って、Colorful のSSDのトラブル問題かと思った。

    一瞬、ほんの一瞬ね。

  • by Anonymous Coward on 2019年07月15日 12時31分 (#3651890)

    当時Twitterで中国から赤い線が世界中に飛んでるような画像が出回ってたけどフェイクニュースだったのか

    • by Anonymous Coward on 2019年07月15日 15時43分 (#3651932)

      フェイクじゃなくって中国国内の端末が多すぎるから
      負荷が上がってる時に中国国内から大量のアクセスが来たからそう見える図になっただけ

      親コメント
      • by Anonymous Coward on 2019年07月16日 8時54分 (#3652096)

        ああ、単なる人口比率が出てるだけのグラフを見て「どこどこからのアクセスが集中している!」と早合点しちゃう残念あるある事例か
        # まじにそういうアクセス解析を上げてくる業者がいて困る

        親コメント
        • by Anonymous Coward on 2019年07月16日 10時05分 (#3652113)

          「どこどこからのアクセスが集中している!」というのは紛れもない事実で、早合点でも何でも無いと思うが。
          それを見て「ふーん。ユーザ多いしね」とするか、「DDoSだ!」と早合点するかの違いだけで。

          親コメント
  • by Anonymous Coward on 2019年07月15日 12時06分 (#3651880)

    そんなのスラドで入力できたんだ。
    編集者限定?

    • 編集者限定というよりも、ストーリー編集時限定です。タレコミ時は編集者でもインラインスタイルシートは無視されます。
      親コメント
    • by Anonymous Coward

      そんなのスラドで入力できたんだ。
      編集者限定?

      ソース見て試せばわかるのでは?
      <span style="border:dotted 1px;"> .*(?:.*=.*)  </span>

      # 「スラドで」っていうくらいならそのくらいの検証はセルフで行こうよ

      • by Anonymous Coward on 2019年07月15日 15時32分 (#3651930)

        無理じゃね?

        ソース見て試せばわかるのでは?

        ソース見て試せばわかるのでは?

        上はquote、下はblockquoteで括ったコメントだけど、出力結果から入力テキスト簡単に推測できないでしょ。


        <span style="border:dotted 1px;">

        編集者はHTML直接入力できるのかも一般の知る所ではないけど、これを手打ちするかどうかはちょっと。
        インラインコード用の記法とかあるのかもしれないけど、だれか知ってる?ってのは当然の疑問では。

        親コメント
      • by Anonymous Coward

        で、お前は当然試してからコメントしたんだろうな?

      • by Anonymous Coward

        で、お前が試したそれで入力できたんか?
        ソース見て試してもできないから元コメは質問したんじゃないのか?
        知りもしないのによくそんな大前提の所から適当に煽れるな

  • by Anonymous Coward on 2019年07月15日 12時49分 (#3651896)

    どういう文字列へのマッチを意図していて、どう書くべきだったのだろうか
    # 正規表現のパターンだけだとサブジェクトがないとみなされて投稿できなかった

    • by Anonymous Coward on 2019年07月15日 13時25分 (#3651907)

      もとの表現はこうだってブログに書いてあるけど、こんなのミスなく書ける気がしない。なんとなくスクリプトを引っ掛けようとしているんだろうなあとは思うけども。
      (?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))

      親コメント
  • これって自動化できないの?

    自動化できたら極度のバックトラックを起こすようなパターンだけを自動的に排除したりできるはずだから、できないか、できても(そのバックトラックを実際に実行するのと同じくらい)高コストなんだろうけど、じゃあなんで人間はできるの? という疑問が

    • by Anonymous Coward

      > 極度なCPU使用に対する保護機能を復元
      とあるから、人の目で見た、くらいのダメ押しの意味では。

typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...