正規表現がCloudflareをダウンさせた。27分間。
2019年7月2日13時42分(UTC):CloudflareのWebアプリケーションファイアウォール(WAF)に新しいルールが180以上の都市で約2秒で適用されました。
2019年7月2日13時42分(UTC):CloudflareのWebアプリケーションファイアウォール(WAF)に新しいルールが180以上の都市で約2秒で適用されました。これはシミュレートモードのXSSルールであり、何もブロックしませんが、すべてのリクエストで実行され、末尾は.*(?:.*=.*)となっています。PCREはバックトラックし、HTTPを処理するすべてのCPUコアが100%に達し、Cloudflareを介したすべてのサイトが27分間502を返し、トラフィックは82%減少しました。キルスイッチはCloudflare Accessの背後にあり、Cloudflare AccessはCloudflareの背後にあります。Cloudflare自身の報告書からの事後分析:数週間前にCPUを節約するためのリファクタリングで削除されたCPUガード、どのルールもステージングをスキップできるようにする手順、複雑性の保証がないエンジン、11の原因と7つの修正。修正に関する評決:SHIP IT。
この動画の要点
- 13:31–13:42 UTC:PRがマージされ、CIはグリーン(CPUテストなし)、Quicksilverがルールを180以上の都市にプッシュ。WAFルールはDOG → PIG → Canaryのステージをスキップ。
- 13:45–14:07:最初のページ、CPUは世界中で100%、トラフィックは82%減、至る所で502。内部コントロールパネルはCloudflare Accessの背後にあり、ダウンしている。一部の認証情報が期限切れ。めったに訓練されないバイパス。
- 14:07–14:09:グローバルWAF終了。27分後にトラフィックとCPUが正常化。14:52にWAFがルールなしで復旧。
- 7月2日(15:50 UTC)と7月12日:Cloudflareが同日のメモと完全な事後分析を公開。CPUガードを再追加、3,868のルールを再確認、段階的な展開、線形時間正規表現エンジンへの移行。
翻訳されたトランスクリプト
オリジナルの英語ナレーションから翻訳されています。利用可能なオーディオとキャプションはYouTubeによって管理されています。
0:00 1つの正規表現がすべてのCloudflareサーバーに一斉に適用され、 その後の27分間、その背後にあるサイトは502ページとなり、 これはファイアウォールにとって可能な限り最も厳しい設定です。 2019年7月2日、13時42分UTC。 Cloudflareは2時間以内に投稿:攻撃ではなく、誤ったデプロイメントです。 トラフィックは82パーセント減少。 10日後、CTOのジョン・グラハム・カミングは完全な事後分析を公開し、 正規表現も含まれ、Hacker Newsは698ポイントを与えました。
0:26 これは停止としてはスタンディングオベーションです。 どのように発生したのか、なぜ可能だったのか、そして実際に誰が非難されるべきか。 The Daily Diff、事後分析です。 13時31分。プルリクエストがマージされました。クロスサイトスクリプティングに対する新しいファイアウォールルールが1つ、 シミュレートモードなので何もブロックしません。 13時37分、テストはパスしました。CPUを測定するテストはありませんでした。 13時42分、ルールは2秒で180都市に適用されました。 WAFルールは、他のリリースが行う犬、豚、カナリアのステージをスキップするためです。
0:54 13時45分、最初のページが表示されました。 13時49分、Hacker Newsでステータスページに関するスレッドが立ち上がりました。 これはまだすべてのシステムが稼働中と表示されていました。 ルールは「ドットスター、ドットスター、イコール、ドットスター」で終わります。つまり、何でもあり、 次に何でもあり、その次に等号です。 PCREは貪欲に推測し、失敗し、他のすべての分割をバックトラックします。 「xイコールx」は23ステップかかります。 イコールの後に20個のx:555。
1:15 20個のx、イコール記号なし:何も見つけずに4,067ステップ。 それをすべてのリクエストで実行すると、すべてのコアが100パーセントになり、 何もせずに、徹底的に。 2つのガードがそれを捉えるべきでした。 ルールに対するCPU制限は数週間前、誤って削除されていました。 WAFのCPU使用率を減らすためのリファクタリングで。 そして、その手順はどのルールもステージングをスキップすることを許します。なぜなら、ルールはライブ攻撃を阻止するために存在するためです。 これは緊急事態ではなかったのに、それでもグローバルに展開されました。
1:37 14時00分、WAFが特定されました。攻撃ではありません。 14時02分、誰かがグローバル終了を提案しました。1つのコンポーネントを、 世界中でオフにします。スイッチはCloudflare Accessの背後にあります。 Cloudflare AccessはCloudflareの背後にあります。 一部の認証情報は未使用のため期限切れになっていたため、インターネット上で最速のネットワークが、 誰も訓練していないバイパスに5分を費やしました。 14時07分、キル。14時09分、トラフィックは正常化。 git blame:展開は単一速度でグローバル。CPUガードは誤ってリファクタリングで削除。上限のない正規表現エンジン。
2:04 事故; 上限のない正規表現エンジン。 ルールを書いたエンジニアではありません。事後分析では11の原因が挙げられており、 誰も名前を挙げられていません。影響範囲:27分、トラフィックの82パーセント、 すべての都市のすべてのコアでCPUが100パーセント。 ダッシュボードとAPIは同じエッジの背後にあるため、顧客は切り替えることさえできません。 Hacker News、事後分析の下で:彼らには1つの問題がありました。 正規表現を使用し、今では2つの問題があります。 古いジョークです。まだコンパイルされます。
2:28 評決、事後分析:SHIP IT。 CPUガードが戻され、3,868個のルールすべてが手動で読み取られ、 ルールはステージングを通過し、エンジンは線形時間保証のあるものに移行します。 1968年にケン・トンプソンが発表したものです。 月曜日:リクエストごとに実行されるものにドットスター・ドットスターは使用しない。 そして、キルスイッチをそれが殺すものから離しておくこと。 まだ話すことを許されていないインシデントを教えてください。 コメント欄で、またはthedailydiff.devで。
2:53 そして、今日のdiffはこれで終わりです。 AxrisiのNikoです。 責任を持ってマージしてください。
情報源
- John Graham-Cumming, "Details of the Cloudflare outage on July 2, 2019" (Jul 12, 2019)blog.cloudflare.com
- Matthew Prince, "Cloudflare outage caused by bad software deploy (updated)" (Jul 2, 2019)blog.cloudflare.com
- Matthew Prince on X, Jul 2, 2019, 14:22 UTCx.com
- Matthew Prince on X, Jul 2, 2019, 14:36 UTC ("No evidence yet attack related")x.com
- Hacker News, Jul 2, 2019, 13:49 UTC — "Cloudflare Network Performance Issues" (631 points)news.ycombinator.com
- Hacker News, Jul 2, 2019 — "Cloudflare outage caused by bad software deploy" (348 points)news.ycombinator.com
- Hacker News, Jul 12, 2019 — "Details of the Cloudflare outage on July 2, 2019" (698 points)news.ycombinator.com
- TechCrunch, Jul 2, 2019techcrunch.com



