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)を変更中であり、ルールのパフォーマンスを確認する項目をテストに追加することや、正規表現エンジンの切り替えも予定しているとのことだ。
Cloudflareでは復旧直後のブログ記事でWeb Application Firewall(WAF)の新ルールにCPUを100%使用する正規表現が含まれていたことと、ルールが段階的ではなく短時間に全世界に展開されたことを原因としていたが、世界規模の障害につながった理由はそれだけではないという。問題の正規表現には .*(?:.*=.*) という部分があり、これが多数のバックトラックを生む原因となったのだが、テストには極度なCPU使用を確認する項目がなかったそうだ。
また、極度なCPU使用を防止する保護機能が数週間前に誤って削除されていたこと、Cloudflareの他のソフトウェアと異なり迅速性が重視されるWAFルールは全世界に一括展開されるようになっていたこと、サービスがダウンして内部のコントロールパネルで認証が行えない状態だったことも原因として挙げられている。新ルールは当初、ユーザーのトラフィックをブロックせずにパススルーする「シミュレート」モードで展開されていたものの、処理自体は実際に行われるためCPU使用率の上昇につながったとのこと。
今回の問題を受けてCloudflareでは極度なCPU使用に対する保護機能を復元し、すべてのWAFルールを人力でチェックして極度なバックトラックが発生する可能性を排除したという。また、ルールを段階的に展開するようSOP(Standard Operating Procedure)を変更中であり、ルールのパフォーマンスを確認する項目をテストに追加することや、正規表現エンジンの切り替えも予定しているとのことだ。
正規表現のバックトラック (スコア:5, 参考になる)
3、4年くらい前に話題になったやつだね。
自分も仕事でウッカリやっちまわないかと思うとワラエナイ。
パフォーマンスとしての話題
正規表現:悪い表現、いい表現、最良の表現 [postd.cc]
脆弱性としての話題
StackExchangeが攻撃されたReDoSの効果 [ohgaki.net]
Re:正規表現のバックトラック (スコア:1)
本気で速度が要求されるコードは、素人が書くべきではないということかな。
もちろんCloudflareならその道の専門家が多数いるんだろうけど、そうではない人が気軽に書いちゃったんだろうか。
1個目の記事にもある通り、素人ならこういう差が出るものだってことを認識して、適切な人に任せる必要があることが分かってれば十分。
初めのコードがダメなことは分かるけど、だからといって最適なコードを用意できるかと言われると難しい。
Re:正規表現のバックトラック (スコア:4, すばらしい洞察)
× 本気で速度が要求されるコード
○ 本番用のコード
× 素人が書くべきではない
○ ちゃんとテストするべき
これくらいのミスは誰でもするやろ。
アカンのは「極度なCPU使用を防止する保護機能が数週間前に誤って削除されていたこと」やな。「保護機能」の詳細はわからんけど、きっとここだけが唯一かつ最凶レベル。
Re:正規表現のバックトラック (スコア:1)
コードといっても正規表現だからね。言語としては最上級でしょ。性能が問題になるほど重要なら、正規表現を使わない文字列処理をすれば安全なんじゃないかと。もともとそんなにガチの用途に耐えられる設計じゃなくて痒い所に手を届かせる程度のものなんだから。
Re: (スコア:0)
正規表現は(1-テープチューリング機械ですら)たかだかDTIME(o(nlog(n)))なのに対して普通のプログラミング言語で書いたものは停止性の証明すらできないが。
Re:正規表現のバックトラック (スコア:1)
でも、この「最良の正規表現」、西暦3000年になると動かなくなるよね……。
Re: (スコア:0)
ぜひ RFC 2550 に対応してください!
Re: (スコア:0)
正規表現のバックトラックの落とし穴の話自体は随分前に聞いた気がする。
先輩からだったかなあ。その時に、くれぐれも注意して使えと釘を刺された覚えが。
「Mastering Regular Expressions」 https://www.amazon.co.jp/dp/B007I8S1X0/ [amazon.co.jp]
とりあえずコレが2006年で、バックトラックは便利だけど効率上の落とし穴があるとは書いてる。
(詳しくはチャプター6をヨメってさ。)
初版の方は未確認だけど、その頃から知ってる人は知ってた話なのでは。
それこそ正規表現エンジンを作ってる側の人は、その性質も込みだから最初から知ってたろうしね
Re:正規表現のバックトラック (スコア:2, 興味深い)
この正規表現の件とか、TCP/IPやプロセッサ関連の話題なんかで
当時ありきたりの話がいま伝承じみた扱いになってるのをみると
何というか少しゾクリとすることがある
Re: (スコア:0)
なあに、7payみたいにあれだけ盛大にやらかしても、責任者は責任取らなくていいんですよ。
雲の上の人は気楽なもんです。
現場の危機感については、まるで聞く耳持たないんだもの。
Re: (スコア:0)
責任を取るためだけにいるやつがその責任すら取らないんだったらマジで存在価値ないな
オフトピ, -1 (Was: Re:正規表現のバックトラック) (スコア:1)
>とりあえずコレ
レビュー(書評)本文が英文だったのが新鮮だった。
amazon.co.jp のレビューは取り扱い商品同様相互に
各国amazonから自由にやりとりできてうらやましい。
Re: (スコア:0)
つーか愚直に探索するとありきたりな表現でもくっそ遅い。
単純文字列検索ですら、BM法がアルゴリズムの教科書の定番ネタだったりするくらいだし、
実用の正規表現エンジンが愚直な実装であることを前提とするのは素人もいいところかと。
正規表現は遅いのが当たり前で、そこから各自高速化されているのも当たり前。
そして最終的には「そのエンジンで」高速に処理できないパターンになってるかどうかの問題になる。
特定の構造が遅い速いってのは環境依存のあるTipsかと。
Re: (スコア:0)
コンパイラーが最適化してくれるからってわざわざ非効率なコードを書く必要はないんですよ。
むしろやってくれるかどうかもわからない最適化に期待することこそ素人もいいところだと思うんですが
Re: (スコア:0)
>単純文字列検索ですら、BM法がアルゴリズムの教科書の定番ネタだったりするくらいだし、
単純文字列検索「だから」そういう原始的な高速化技法があるんでしょ。
不特定多数の複雑なパターンマッチにおいては、一般的な最適化技法はないと思う。
仮にあっても、その正規表現を数回しか使用しないのであれば、最適化に
かかる時間の方が、最適化によって短縮される時間より長くなって本末転倒。
正規表現部分を何万回も何十万回も使ってボトルネックになる場合は、一流の
プログラマなら正規表現なんて使わない形に書き直す。
なので不特定多数の正規表現の汎用的な最適化なんて不可能だし実装してないんじゃないだろうか。
JavaのHotSpotVMによって高度な動的最適化が日常的に利用可能になったから、
そこで行われている最適化がどれほど無茶なことか分からない初心者も増えて
しまったのかもしれない。
HotSpotVMは、もはや初心者の理解を超えてるもんね。
Re: (スコア:0)
>長い方がいい正規表現
うっ。いかにして短くするかに腐心してきた感あり…。
デプロイプロセスなど学ぶ点が多い (スコア:2, 興味深い)
リンク先の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⇒カナリアと進む)など
こういう洗練されたオペレーションにもっていきたいです
# とおいめ
空目 (スコア:1)
一瞬、タイトルの英文字だけ目に入って、Colorful のSSDのトラブル問題かと思った。
一瞬、ほんの一瞬ね。
DDoSではない (スコア:1)
当時Twitterで中国から赤い線が世界中に飛んでるような画像が出回ってたけどフェイクニュースだったのか
Re:DDoSではない (スコア:1)
フェイクじゃなくって中国国内の端末が多すぎるから
負荷が上がってる時に中国国内から大量のアクセスが来たからそう見える図になっただけ
Re:DDoSではない (スコア:1)
ああ、単なる人口比率が出てるだけのグラフを見て「どこどこからのアクセスが集中している!」と早合点しちゃう残念あるある事例か
# まじにそういうアクセス解析を上げてくる業者がいて困る
Re:DDoSではない (スコア:1)
「どこどこからのアクセスが集中している!」というのは紛れもない事実で、早合点でも何でも無いと思うが。
それを見て「ふーん。ユーザ多いしね」とするか、「DDoSだ!」と早合点するかの違いだけで。
点線で囲まれたテキスト (スコア:0)
そんなのスラドで入力できたんだ。
編集者限定?
Re:点線で囲まれたテキスト (スコア:1)
Re: (スコア:0)
そんなのスラドで入力できたんだ。
編集者限定?
ソース見て試せばわかるのでは?
<span style="border:dotted 1px;"> .*(?:.*=.*) </span>
# 「スラドで」っていうくらいならそのくらいの検証はセルフで行こうよ
Re:点線で囲まれたテキスト (スコア:1)
無理じゃね?
ソース見て試せばわかるのでは?
上はquote、下はblockquoteで括ったコメントだけど、出力結果から入力テキスト簡単に推測できないでしょ。
<span style="border:dotted 1px;">
編集者はHTML直接入力できるのかも一般の知る所ではないけど、これを手打ちするかどうかはちょっと。
インラインコード用の記法とかあるのかもしれないけど、だれか知ってる?ってのは当然の疑問では。
Re: (スコア:0)
で、お前は当然試してからコメントしたんだろうな?
Re: (スコア:0)
で、お前が試したそれで入力できたんか?
ソース見て試してもできないから元コメは質問したんじゃないのか?
知りもしないのによくそんな大前提の所から適当に煽れるな
Re: (スコア:0)
なぜそれを点線で囲もうと思ったのか
正規表現 .*(?:.*=.*) (スコア:0)
どういう文字列へのマッチを意図していて、どう書くべきだったのだろうか
# 正規表現のパターンだけだとサブジェクトがないとみなされて投稿できなかった
Re:正規表現 .*(?:.*=.*) (スコア:2, 参考になる)
もとの表現はこうだってブログに書いてあるけど、こんなのミスなく書ける気がしない。なんとなくスクリプトを引っ掛けようとしているんだろうなあとは思うけども。
(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))
Re:正規表現 .*(?:.*=.*) (スコア:1)
?:がついてるからキャプチャーしないし、使ってもいないグループは不要
.*.*=.*
.*を連続で書く意味はない(1つで十分)
.*=.*
この場合、=は最初のものにマッチすれば十分だから否定文字クラスを使ってバックトラックをなくせる
[^=]*=.*
パターンの後ろになにか追加するときは . をそれに応じた否定文字クラスに置き換える
[^=]*=[^;]*;
Re: (スコア:0)
2文字以上なんじゃないの。
Re: (スコア:0)
.*.*のこと? .*を何回繰り返しても0文字以上だが?
Re: (スコア:0)
それ新しい顔文字つかえそう
Re:正規表現 .*(?:.*=.*) (スコア:2)
Re: (スコア:0)
特定のやつ以外のエラー検出を黙らせる感じかな。NaNはスクリプト言語っぽい。
Re: (スコア:0)
読む気失せる。正規表現のトランスパイラってないのかね。
Re:正規表現 .*(?:.*=.*) (スコア:1)
Regulex JavaScript Regular Expression Visualizerを通してみたけどGroup #1が取り出したいものなのかな?:を多用しててここだけ指定してないし。
https://jex.im/regulex/#!flags=&re=(%3F%3A(%3F%3A%5C%22%7C'%7C%5C%... [jex.im]
Re: (スコア:0)
このページ便利だな。ブックマークしとこう
すべてのWAFルールを人力でチェックして極度なバックトラックが発生する可能性を排除した (スコア:0)
これって自動化できないの?
自動化できたら極度のバックトラックを起こすようなパターンだけを自動的に排除したりできるはずだから、できないか、できても(そのバックトラックを実際に実行するのと同じくらい)高コストなんだろうけど、じゃあなんで人間はできるの? という疑問が
Re: (スコア:0)
> 極度なCPU使用に対する保護機能を復元
とあるから、人の目でも見た、くらいのダメ押しの意味では。