2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

ほが9幎前、Cloudflareは小さな䌚瀟で、私はそこで働いおいたわけではなく、単なる顧客でした。 Cloudflare を立ち䞊げおから XNUMX か月埌、私のりェブサむトに次の通知が届きたした。 jgc.orgDNSが機胜しおいないようです。 Cloudflare が倉曎を加えた プロトコルバッファ、DNSが壊れおいたした。

私はすぐに Matthew Prince に「私の DNS はどこですか?」ずいうタむトルで手玙を曞きたした。圌は技術的な詳现が満茉の長い返信を返しおきたした。ここで通信党䜓を読んでください、私はこう答えたした。

出兞: ゞョン・グラハムカミング
日時7幎2010月9日14時XNUMX分
件名: Re: DNS はどこですか?
宛先: マシュヌ・プリンス

玠晎らしいレポヌト、ありがずう。問題があれば必ず電話したす。すべおの技術情報を収集したら、これに぀いお投皿する䟡倀があるず考えられたす。オヌプンで正盎なストヌリヌを楜しんでいただけるず思いたす。特に、ロヌンチ以来トラフィックがどのように増加したかを瀺すためにグラフを添付する堎合はそうです。

私のサむトでは適切な監芖が行われおおり、障害が発生するたびに SMS を受け取りたす。監芖の結果、障害は 13:03:07 から 14:04:12 たでに発生したこずがわかりたす。テストは XNUMX 分ごずに実行されたす。

きっず分かりたすよ。ペヌロッパに自分の人間は必芁ないず思いたすか? 🙂

そしお圌は答えた

出兞: マシュヌ・プリンス
日時7幎2010月9日57時XNUMX分
件名: Re: DNS はどこですか?
宛先: ゞョン・グラハム・カミング

ありがずう。曞いおくださった皆様にお返事をさせおいただきたした。私は今オフィスに向かっおいたす。ブログに䜕か曞くか、掲瀺板に公匏の投皿を固定する予定です。私も完党に同意したす、正盎さがすべおです。

珟圚、Cloudflare は非垞に倧きな䌚瀟であり、私はそこで働いおいたすが、今では私たちの間違い、その結果、そしお私たちの行動に぀いお率盎に曞かなければなりたせん。

2月XNUMX日の出来事

2 月 XNUMX 日、WAF のマネヌゞド ルヌルに新しいルヌルを展開したした。 CPUリ゜ヌスが䞍足しおいたした 䞖界䞭のCloudflareネットワヌク䞊のHTTP/HTTPSトラフィックを凊理するすべおのプロセッサコア䞊で。新しい脆匱性や脅嚁に察応しお、WAF の管理ルヌルを継続的に改善しおいたす。たずえば、5 月に私たちは急ぎたした。 ルヌルを远加SharePoint の重倧な脆匱性から保護したす。圓瀟の WAF の重芁な点は、ルヌルを迅速か぀グロヌバルに展開できるこずです。

残念ながら、先週朚曜日の曎新には、バックトラッキングで HTTP/HTTPS CPU リ゜ヌスを倚量に浪費する正芏衚珟が含たれおいたした。その結果、コアのプロキシ、CDN、WAF 機胜が圱響を受けたした。グラフは、HTTP/HTTPS トラフィックを凊理するためのプロセッサ リ゜ヌスがネットワヌク内のサヌバヌでほが 100% に達しおいるこずを瀺しおいたす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现
むンシデント䞭のある時点での CPU 䜿甚率

その結果、圓瀟のクラむアントおよび圓瀟のクラむアントのクラむアントは、Cloudflareドメむンで502゚ラヌペヌゞを衚瀺するこずになりたした。 502 ゚ラヌは、空きコアはただあるものの、HTTP/HTTPS トラフィックを凊理するプロセスず通信できなかった Cloudflare フロント゚ンド Web サヌバヌによっお生成されたした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

この件でお客様にどれほどのご迷惑をおかけしたかは承知しおおりたす。私たちはずおも恥ずかしいです。そしお、この倱敗により、むンシデントに効果的に察凊するこずができなくなりたした。

あなたがこれらの顧客の䞀人だったら、おそらく怖がり、怒り、動揺しおいるでしょう。さらに、私たちは 䞖界的な混乱。 CPU 消費量が高くなるのは、正芏衚珟の衚珟が䞍適切な 1 ぀の WAF ルヌルが原因で、過剰なバックトラッキングが発生したした。眪悪感のある衚珟は次のずおりです。 (?:(?:"|'|]|}||d|(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-|+)+[)]*;?((?:s|-|~|!|{}||||+)*.*(?:.*=.*)))

これはそれ自䜓興味深いものですが (これに぀いおは埌ほど詳しく説明したす)、Cloudflare サヌビスが 27 分間ダりンしたのは正芏衚珟が間違っおいたためだけではありたせん。障害に至った䞀連の出来事を説明するのに時間がかかり、察応が遅れたした。この投皿の最埌では、正芏衚珟でのバックトラッキングに぀いお説明し、その操䜜方法に぀いお説明したす。

どうした

順番に始めたしょう。ここでの時間はすべお UTC です。

午埌 13 時 42 分に、ファむアりォヌル チヌムの゚ンゞニアが怜出ルヌルに小さな倉曎を加えたした。 XSS 自動プロセスを䜿甚したす。これにより、倉曎芁求チケットが䜜成されたした。このようなチケットは Jira を通じお管理したす (䞋のスクリヌンショット)。

3 分埌、PagerDuty の最初のペヌゞが衚瀺され、WAF の問題が報告されたした。これは、通垞の動䜜を監芖するために、Cloudflare の倖郚で WAF (数癟個ありたす) の機胜をテストする総合テストでした。このすぐ埌には、他の Cloudflare ゚ンドツヌ゚ンドサヌビステストの倱敗、䞖界的なトラフィックの問題、広範囲にわたる 502 ゚ラヌ、および䞖界䞭の郜垂にあるポむント オブ プレれンス (PoP) からの䞍足を瀺す倧量のレポヌトに関するアラヌトのペヌゞが続きたした。 CPU リ゜ヌスの。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

これらのアラヌトをいく぀か受信し、䌚議から飛び出し、テヌブルに向かう途䞭で、゜リュヌション開発郚門の責任者が、トラフィックの 80% が倱われたず蚀いたした。私は SRE ゚ンゞニアの元に駆け぀けたした。圌らはすでに問題に取り組んでいたのです。最初、私たちはそれが䜕らかの未知の攻撃であるず考えたした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

CloudflareのSRE゚ンゞニアは䞖界䞭に散らばっおおり、0時間䜓制で状況を監芖しおいたす。通垞、これらのアラヌトは範囲が限定された特定のロヌカルな問題を通知し、内郚ダッシュボヌドで远跡され、XNUMX 日に耇数回解決されたす。しかし、これらのペヌゞず通知は非垞に深刻な事態を瀺しおいたため、SRE ゚ンゞニアは盎ちに重倧床レベル PXNUMX を宣蚀し、経営陣ずシステム ゚ンゞニアに連絡したした。

そのずき、ロンドンの゚ンゞニアたちはメむンホヌルで講矩を聞いおいたした。講矩は䞭断され、党員が倧きな䌚議宀に集たり、さらに専門家が呌ばれた。これは、SRE が自分たちで察凊できる兞型的な問題ではありたせんでした。適切な専門家を関䞎させるこずが急務でした。

14:00 に、問題は WAF にあり、攻撃はなかったず刀断したした。パフォヌマンス チヌムが CPU デヌタを抜出したずころ、WAF が原因であるこずが明らかになりたした。別の埓業員は strace を䜿甚しおこの理論を確認したした。他の誰かが、WAF に問題があるこずをログで確認したした。午埌14時02分、䞖界䞭でXNUMX぀のコンポヌネントをシャットダりンするCloudflareに組み蟌たれたメカニズムであるグロヌバルキルを䜿甚するこずが提案されたずき、チヌム党䜓が私のずころにやっお来たした。

WAF のグロヌバル キルをどのように行ったかは別の話です。それはそれほど単玔ではありたせん。圓瀟は自瀟補品を䜿甚しおおり、圓瀟のサヌビス以来 アクセス が機胜せず、内郚コントロヌル パネルを認蚌しおログむンできたせんでした (すべおが修正された埌、内郚コントロヌル パネルが目的で䜿甚されおいない堎合に資栌情報を無効にするセキュリティ機胜が原因で、䞀郚のチヌム メンバヌがアクセスできなくなったこずがわかりたした)長い間。

そしお、Jira やビルド システムなどの内郚サヌビスにアクセスできたせんでした。回避策のメカニズムが必芁でしたが、それはあたり䜿甚されたせんでした (これも解決する必芁がありたす)。最終的に、14 人の゚ンゞニアが 07 時 14 分に WAF を無効にするこずに成功し、09 時 XNUMX 分にはトラフィックず CPU レベルがどこでも正垞に戻りたした。 Cloudflareの残りの保護メカニズムは通垞どおり機胜したした。

次に、WAF の埩元に着手したす。状況が異垞だったため、1 ぀の郜垂で別のトラフィックを䜿甚しおネガティブ テスト (倉曎が本圓に問題なのか自問する) ずポゞティブ テスト (ロヌルバックが機胜するこずを確認する) を実行し、そこから有料顧客を転送したした。

14時52分、原因が分かったず確信しお修正し、WAFを再床オンにしたした。

Cloudflareの仕組み

Cloudflareには、WAFのルヌル管理を専門ずする゚ンゞニアのチヌムがいたす。怜出率を向䞊させ、誀怜知を枛らし、新たな脅嚁が出珟したずきに迅速に察応するよう努めおいたす。過去 60 日間で、WAF の管理ルヌルに察しお 476 件の倉曎リク゚ストが凊理されたした (平均 3 時間に XNUMX 件)。

この特定の倉曎は、実際のクラむアント トラフィックがルヌルを通過するものの、䜕もブロックされないシミュレヌション モヌドで展開する必芁がありたした。このモヌドを䜿甚しお、ルヌルの有効性をテストし、停陜性率ず停陰性率を枬定したす。ただし、シミュレヌション モヌドであっおも、ルヌルは実際に実行する必芁があり、この堎合、ルヌルにはプロセッサ リ゜ヌスを過剰に消費する正芏衚珟が含たれおいたした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

䞊蚘の倉曎リク゚ストからわかるように、展開蚈画、ロヌルバック蚈画、およびこのタむプの展開甚の内郚暙準操䜜手順 (SOP) ぞのリンクがありたす。ルヌルを倉曎するための SOP により、ルヌルをグロヌバルに公開できたす。実際、Cloudflareでは、物事はたったく異なる方法で行われ、SOPでは、テストおよび内郚䜿甚のために゜フトりェアを最初に瀟内のPoint of PresencePoP埓業員が䜿甚するに出荷し、次に瀟内の少数のクラむアントに出荷するこずが芏定されおいたす。隔離された堎所に、次に倚数のクラむアントに、そしお初めお党䞖界に。

芋た目はこんな感じです。 BitBucket 経由で内郚的に git を䜿甚したす。倉曎に取り組む゚ンゞニアはコヌドを送信し、それが TeamCity に組み蟌たれたす。ビルドが合栌するず、レビュヌ担圓者が割り圓おられたす。プル リク゚ストが承認されるず、コヌドがアセンブルされ、䞀連のテストが (再床) 実行されたす。

ビルドずテストが正垞に完了するず、Jira で倉曎リク゚ストが䜜成され、適切なマネヌゞャヌたたはリヌダヌが倉曎を承認する必芁がありたす。承認埌、DOG、PIG、およびいわゆる「PoP 動物園」ぞの展開が行われたす。 カナリア 犬、豚、カナリア。

DOG PoP は、Cloudflare の埓業員のみが䜿甚する Cloudflare PoP (他の郜垂ず同様) です。内郚䜿甚のための PoP を䜿甚するず、顧客のトラフィックが゜リュヌションに流入し始める前に問題を発芋できたす。䟿利なもの。

DOG テストが成功するず、コヌドは PIG (モルモット) ステヌゞに進みたす。これは Cloudflare PoP で、少量の無料の顧客トラフィックが新しいコヌドを通過したす。
すべおが正垞であれば、コヌドは Canary に入力されたす。䞖界のさたざたな地域に 3 ぀の Canary PoP がありたす。このコヌドでは、有料クラむアントず無料クラむアントのトラフィックが新しいコヌドを通過し、これが゚ラヌの最埌のチェックずなりたす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现
Cloudflareでの゜フトりェアリリヌスプロセス

コヌドが Canary で問題なければ、リリヌスしたす。 DOG、PIG、Canary、党䞖界のすべおの段階を通過するには、コヌドの倉曎に応じお数時間たたは数日かかりたす。 Cloudflareのネットワヌクずクラむアントは倚様であるため、コヌドをすべおのクラむアントにグロヌバルにリリヌスする前に、コヌドを培底的にテストしたす。ただし、脅嚁には迅速に察応する必芁があるため、WAF は特にこのプロセスに埓いたせん。

WAFの脅嚁
過去数幎間で、䞀般的なアプリケヌションにおける脅嚁が倧幅に増加したした。これは、゜フトりェア テスト ツヌルの可甚性が向䞊したためです。たずえば、最近次のように曞きたした。 毛矜立ち).

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现
出所 https://cvedetails.com/

倚くの堎合、抂念実蚌が䜜成され、すぐに Github で公開されるため、アプリケヌションを保守しおいるチヌムはアプリケヌションを迅速にテストし、適切にセキュリティが確保されおいるこずを確認できたす。したがっお、Cloudflareは、顧客が゜フトりェアを修正する機䌚を埗るこずができるように、新しい攻撃にできるだけ早く察応する胜力を必芁ずしおいたす。

Cloudflare の迅速な察応の奜䟋は、5 月に SharePoint の脆匱性保護を導入したこずです (ここで読む。この発衚が行われた盎埌、私たちは、お客様の SharePoint むンストヌルの脆匱性を悪甚しようずする膚倧な数の詊みに気づきたした。圓瀟のスタッフは垞に新しい脅嚁を監芖し、お客様を保護するためのルヌルを䜜成しおいたす。

朚曜日に問題を匕き起こしたルヌルは、クロスサむトスクリプティングXSSから保護するこずを想定しおいた。このような攻撃も近幎非垞に頻繁になっおいたす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现
出所 https://cvedetails.com/

WAF のマネヌゞド ルヌルを倉曎する暙準手順は、グロヌバル展開の前に継続的むンテグレヌション (CI) テストを実斜するこずです。先週の朚曜日にこれを実行し、ルヌルを展開したした。午埌 13 時 31 分に、゚ンゞニアが倉曎を加えお承認されたプル リク゚ストを送信したした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

13時37分、TeamCityはルヌルを収集し、テストを実行し、ゎヌサむンを出したした。 WAF テスト スむヌトは、WAF のコア機胜をテストし、個々の機胜に察する倚数の単䜓テストで構成されたす。単䜓テストの埌、膚倧な数の HTTP リク゚ストを䜿甚しお WAF のルヌルをテストしたした。 HTTP リク゚ストは、どのリク゚ストが WAF によっおブロックされるべきか (攻撃を阻止するため)、どのリク゚ストが通過できるかを確認したす (すべおをブロックせず、誀怜知を避けるため)。しかし、過剰な CPU 䜿甚率に぀いおはテストしたせんでした。たた、以前の WAF ビルドのログを調べるず、ルヌル テストの実行時間は増加しおおらず、十分なリ゜ヌスがないこずを疑うのは困難であるこずがわかりたした。

テストは合栌し、TeamCity は午埌 13 時 42 分に倉曎の自動デプロむを開始したした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

クむックシルバヌ

WAF ルヌルは脅嚁の即時修埩に重点を眮いおいるため、倉曎を数秒でグロヌバルに䌝播する Quicksilver の分散キヌバリュヌ ストアを䜿甚しお WAF ルヌルを展開したす。圓瀟のすべおのクラむアントは、ダッシュボヌドたたは API 経由で構成を倉曎するずきにこのテクノロゞヌを䜿甚しおおり、そのおかげで圓瀟は倉曎に超高速で察応できたす。

クむックシルバヌに぀いおはあたり話しおきたせんでした。以前に䜿甚しおいた 京郜倧物 キヌず倀のペアのグロヌバルに分散されたストアずしお機胜したしたが、運甚䞊の問題があったため、私たちは独自のストアを䜜成し、180 以䞊の郜垂で耇補したした。珟圚、Quicksilver を䜿甚しお、構成倉曎をクラむアントにプッシュし、WAF ルヌルを曎新し、クラむアントによっお䜜成された JavaScript コヌドを Cloudflare Workers に配垃したす。

ダッシュボヌド䞊のボタンをクリックするか API を呌び出しおから、䞖界䞭で構成を倉曎するたでにかかる時間はわずか数秒です。お客様はこのセットアップの速さを気に入りたした。そしお、Workers は、ほが瞬時にグロヌバルな゜フトりェアを導入できるようにしたす。平均しお、Quicksilver は 350 秒あたり玄 XNUMX の倉曎を䌝播したす。

そしおクむックシルバヌは非垞に速いです。平均しお、䞖界䞭のすべおのコンピュヌタヌに倉曎を䌝播するために、99 パヌセンタむル 2,29 秒を達成したした。通垞、スピヌドは良いこずです。結局のずころ、機胜を有効にしたりキャッシュをクリアしたりするず、それはほが瞬時にどこでも行われたす。 Cloudflare Workersを介したコヌドの送信は同じ速床で行われたす。 Cloudflareは、顧客に適切なタむミングでの迅速なアップデヌトを玄束したす。

しかし今回の堎合、スピヌドが私たちにひどい冗談を蚀い、ルヌルは数秒のうちにどこでも倉曎されたした。 WAF コヌドが Lua を䜿甚しおいるこずに気づいたかもしれたせん。 Cloudflareは本番環境ず詳现でLuaを広範囲に䜿甚しおいたす WAFのLua 我々 すでに議論されおいたす。 Lua WAF が䜿甚する PCRE 内郚的に照合のためにバックトラッキングを適甚したす。制埡䞍胜になった衚珟から保護するメカニズムはありたせん。以䞋では、これに぀いお詳しく説明し、それに察しお私たちが取り組んでいるこずに぀いお説明したす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

ルヌルがデプロむされる前は、すべおがスムヌズに進みたした。プル リク゚ストが䜜成されお承認され、CI/CD パむプラむンがコヌドを収集しおテストし、デプロむずロヌルバックを管理する SOP に埓っお倉曎リク゚ストが送信され、デプロむが完了したした。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现
Cloudflare WAF 導入プロセス

䜕がうたくいかなかった
先ほども述べたように、私たちは毎週数十の新しい WAF ルヌルを導入しおおり、そのような導入による悪圱響から保護するための倚くのシステムを導入しおいたす。そしお、䜕か問題が発生するずきは、通垞、耇数の状況が䞀床に組み合わさっお起こりたす。理由が 1 ぀だけ芋぀かった堎合は、もちろん安心できたすが、必ずしもそうずは限りたせん。これらが重なっお、HTTP/HTTPS サヌビスの倱敗に぀ながった理由です。

  1. ゚ンゞニアが、過剰な結果をもたらす可胜性のある正芏衚珟を䜜成したした。 埌戻りする.
  2. 正芏衚珟による過剰な CPU の浪費を防ぐ機胜が、数週間前の WAF のリファクタリングで誀っお削陀されたした。このリファクタリングは、WAF のリ゜ヌス消費を枛らすために必芁でした。
  3. 正芏衚珟゚ンゞンには耇雑さの保蚌がありたせんでした。
  4. テスト スむヌトは過剰な CPU 消費を怜出できたせんでした。
  5. SOP により、耇数段階のプロセスを必芁ずせずに、緊急でないルヌル倉曎をグロヌバルに展開するこずができたす。
  6. ロヌルバック蚈画では、完党な WAF ビルドを 2 回実行する必芁があり、長い時間がかかりたした。
  7. 䞖界的な亀通問題に関する最初の譊報が発せられるのが遅すぎたした。
  8. ステヌタスペヌゞの曎新に時間がかかりたした。
  9. 䞍具合によりシステムぞのアクセスに問題があり、バむパス手順が十分に確立されおいたせんでした。
  10. SRE ゚ンゞニアは、セキュリティ䞊の理由により資栌情報の有効期限が切れたため、䞀郚のシステムにアクセスできなくなりたした。
  11. 圓瀟の顧客は、Cloudflare リヌゞョンを経由するため、Cloudflare ダッシュボヌドや API にアクセスできたせんでした。

先週の朚曜日から倉わったこず

たず、WAF のリリヌスに関するすべおの䜜業を完党に停止し、次のこずを行っおいたす。

  1. 削陀した CPU 過剰䜿甚保護を再導入したす。 準備ができお
  2. WAF の管理ルヌル内の 3868 個のルヌルをすべお手動でチェックしお、過剰なバックトラッキングのその他の朜圚的なケヌスを芋぀けお修正したす。 (怜蚌完了)
  3. テスト セットにはすべおのルヌルのパフォヌマンス プロファむリングが含たれおいたす。 予定19月XNUMX日
  4. 正芏衚珟゚ンゞンぞの切り替え re2 たたは さび - どちらも実行時保蚌を提䟛したす。 予定31月XNUMX日
  5. Cloudflareの他の゜フトりェアず同様に、ルヌルを段階的に展開するためにSOPを曞き盎しおいたすが、同時に、攻撃がすでに始たっおいる堎合に緊急にグロヌバルに展開する機胜も備えおいたす。
  6. Cloudflare リヌゞョンから Cloudflare ダッシュボヌドず API を緊急に削陀する機胜を開発䞭です。
  7. ペヌゞ曎新の自動化 クラりドフレアのステヌタス.

長期的には、私が数幎前に䜜成した Lua WAF から離れおいくこずになりたす。 WAF の移動先 新しいファむアりォヌルシステム。これにより、WAF の速床が向䞊し、远加の保護レベルが埗られたす。

たずめ

この障害により、圓瀟およびお客様にはご迷惑をおかけしたした。私たちは状況を修正するために迅速に行動し、珟圚、クラッシュの原因ずなったプロセスの欠陥に取り組んでいるほか、将来新しいテクノロゞヌに移行する際に正芏衚珟に関する朜圚的な問題を防ぐためにさらに深く調査しおいたす。

この床のサヌビス停止に぀いおは非垞に圓惑しおおり、お客様にお詫び申し䞊げたす。これらの倉曎により、このようなこずが二床ず起こらないようになるこずを願っおいたす。

応甚。正芏衚珟をバックトラッキングする

匏の仕組みを理解するには:

(?:(?:"|'|]|}||d
(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-
|+)+[)]*;?((?:s|-|~|!|{}||||+)*.*(?:.*=.*)))

CPU リ゜ヌスをすべお䜿い果たした堎合は、暙準の正芏衚珟゚ンゞンがどのように動䜜するかに぀いお少し知っおおく必芁がありたす。ここで問題ずなるのはパタヌンです .*(?:.*=.*). (?: そしお察応する ) は非キャプチャ グルヌプです (぀たり、括匧内の匏は 1 ぀の匏ずしおグルヌプ化されたす)。

過剰な CPU 消費のコンテキストでは、このパタヌンは次のように説明できたす。 .*.*=.*。この圢匏では、パタヌンが䞍必芁に耇雑に芋えたす。しかし、より重芁なのは、珟実の䞖界では、あるフラグメントずその埌に別のフラグメントが続くこずを゚ンゞンに芁求する匏 (WAF ルヌルの耇雑な匏など) が臎呜的なバックトラッキングに぀ながる可胜性があるこずです。だからこそ。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

正芏衚珟では . 1 文字ず䞀臎する必芁があるこずを意味したす。 .* - 0 個以䞊の文字を「貪欲に」䞀臎させたす。぀たり、最倧の文字をキャプチャしたす。 .*.*=.* は、0 個以䞊の文字ず䞀臎し、次に 0 個以䞊の文字ず䞀臎し、リテラル = 文字を怜玢し、0 個以䞊の文字ず䞀臎するこずを意味したす。

テストラむンに行っおみたしょう x=x。ずいう衚珟に盞圓したす .*.*=.*. .*.* 等号が最初のものず䞀臎する前に x (グルヌプのうちの1぀ .* 䞀臎 x、2番目のれロ文字。 .* after = 最埌に䞀臎 x.

この比范には 23 の手順が必芁です。最初のグルヌプ .* в .*.*=.* 貪欲に動䜜し、文字列党䜓ず䞀臎したす x=x。゚ンゞンは次のグルヌプに移動したす .*。䞀臎する文字がもうないので、2 番目のグルヌプ .* れロ文字ず䞀臎したす (これは蚱可されたす)。その埌、゚ンゞンが暙識に移動したす =。これ以䞊シンボルはありたせん (最初のグルヌプ) .* 衚珟党䜓を䜿甚した x=x)、比范は行われたせん。

そしお、正芏衚珟゚ンゞンは最初に戻りたす。圌は最初のグルヌプに移りたす .* そしおそれを比范したす с x= その代わり x=x)、その埌 2 番目のグルヌプず察戊したす .*。 2番目のグルヌプ .* 2番目ず比范されたす x, そしおたたしおも文字が残りたせん。そしお゚ンゞンが再びかかるず = в .*.*=.*、䜕も機胜したせん。そしお圌は再び埌戻りしたす。

今回のグルヌプは .* ただ䞀臎したす x=、しかし、2番目のグルヌプ .* もういや x、れロ文字。゚ンゞンはリテラル文字を芋぀けようずしおいたす = パタヌンの䞭で .*.*=.*、しかし出おきたせん結局最初のグルヌプがすでに占領しおいたした .*。そしお圌は再び埌戻りしたす。

今回は第䞀グルヌプ .* 最初の x のみを取りたす。しかし第二グルヌプは .* 「貪欲に」捕らえたす =x。䜕が起こるかすでに予想したしたか゚ンゞンはリテラルず䞀臎しようずしたす =、倱敗しおたた埌戻りしたす。

最初のグルヌプ .* ただ最初のものず䞀臎したす x。 2番 .* だけかかりたす =。もちろん、゚ンゞンは文字通り䞀臎するこずはできたせん =、2番目のグルヌプがすでにこれを行っおいるため、 .*。そしおたた埌戻り。そしお、3 文字の文字列を照合しようずしおいたす。

その結果、最初のグルヌプは、 .* 最初のもののみに䞀臎したす x二番目 .* - 文字がれロの堎合、゚ンゞンは最終的にリテラルず䞀臎したす = 匏で с = 列をなしお。次は最埌のグルヌプです .* 前回のものず比范されたす x.

のみの23ステップ x=x。 Perl の䜿甚に関する短いビデオを芋る 正芏衚珟::デバッガ, これは、ステップずバックトラッキングがどのように発生するかを瀺しおいたす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

これはすでに倧倉な䜜業ですが、代わりにどうでしょうか x=x 私たちは持っおいたす x=xx?それは33ステップです。で、もし x=xxx? 45. この関係は盎線的ではありたせん。グラフは以䞋ずの比范を瀺しおいたす。 x=x ЎП x=xxxxxxxxxxxxxxxxxxxx 20 x 埌の =。埌の x が 20 ある堎合 =、゚ンゞンは 555 ステップでマッチングを完了したす。 (たた、負けおしたった堎合は、 x= 文字列は単玔に 20 で構成されたす x、゚ンゞンは䞀臎しないこずを理解するたでに 4067 ステップかかりたす)。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

このビデオでは、比范のためにすべおのバックトラッキングを瀺しおいたす x=xxxxxxxxxxxxxxxxxxxx:

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

問題は、文字列サむズが増加するに぀れお、マッチング時間が超盎線的に増加するこずです。ただし、正芏衚珟を少し倉曎するず、状況がさらに悪化する可胜性がありたす。持っおいたずしたしょう .*.*=.*; (぀たり、パタヌンの最埌に文字通りのセミコロンがありたした)。たずえば、次のような匏に䞀臎させるには、 foo=bar;.

そしお、ここで埌戻りするず本圓に悲惚なこずになりたす。比范甚 x=x 90 ステップではなく 23 ステップかかりたす。そしおその数は急速に増加しおいたす。比べる x= そしお、20 x, 5353歩必芁です。これがチャヌトです。軞の倀を芋おください Y 前のグラフず比范しおください。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

興味があれば、5353 件の倱敗したマッチング ステップをすべお確認しおください。 x=xxxxxxxxxxxxxxxxxxxx О .*.*=.*;

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

貪欲なマッチングではなく遅延マッチングを䜿甚するこずにより、バックトラッキングの皋床を制埡できたす。元の衚珟を次のように倉曎するず、 .*?.*?=.*?、比范のために x=x 11 ステップ (23 ステップではありたせん) が必芁です。はどうかず蚀うず x=xxxxxxxxxxxxxxxxxxxx。すべおの理由は ? 埌の .* 次に進む前に、最小限の文字数ず䞀臎するように゚ンゞンに指瀺したす。

しかし、遅延マッピングはバックトラッキングの問題を完党に解決するわけではありたせん。悲惚な䟋に眮き換えるず .*.*=.*; Ма .*?.*?=.*?;の堎合、実行時間は倉わりたせん。 x=x それでも 555 ステップ必芁です。 x= そしお、20 x - 5353

(より具䜓性を高めるためにパタヌンを完党に曞き盎す以倖に) できる唯䞀のこずは、バックトラッキング メカニズムを備えた正芏衚珟゚ンゞンを攟棄するこずです。これが今埌数週間にわたっお行われる予定です。

この問題の解決策は、ケント・トンプ゜ンが蚘事を曞いた 1968 幎以来知られおいたした。 プログラミング手法: 正芏衚珟怜玢アルゎリズム (「プログラミング方法: 正芏衚珟怜玢アルゎリズム」)。この蚘事では、正芏衚珟を非決定的有限状態マシンに倉換し、非決定的有限状態マシンの状態倉化埌に、実行時間が䞀臎した文字列に線圢に䟝存するアルゎリズムを䜿甚できるメカニズムに぀いお説明したす。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

プログラミング方法
正芏衚珟怜玢アルゎリズム
ケン・トンプ゜ン

Bell Telephone Laboratories, Inc.、ニュヌゞャヌゞヌ州マレヌヒル

テキスト内の特定の文字列を怜玢するメ゜ッドに぀いお説明し、コンパむラ圢匏でのこのメ゜ッドの実装に぀いお説明したす。コンパむラヌは正芏衚珟を゜ヌス・コヌドずしお受け取り、IBM 7094 プログラムをオブゞェクト・コヌドずしお生成したす。オブゞェクト プログラムは、怜玢テキストの圢匏で入力を受け取り、テキスト文字列が指定された正芏衚珟ず䞀臎するたびにシグナルを発行したす。この蚘事では、䟋、問題、解決策を瀺したす。

アルゎリズム
以前の怜玢アルゎリズムでは、郚分的に成功した怜玢で結果が埗られなかった堎合、バックトラッキングが発生しおいたした。

コンパむル モヌドでは、アルゎリズムはシンボルを凊理したせん。コンパむルされたコヌドに呜什を枡したす。実行は非垞に高速です。珟圚のリストの先頭にデヌタを枡した埌、正芏衚珟内のすべおの連続文字が自動的に怜玢されたす。
コンパむルおよび怜玢アルゎリズムは、タむムシェアリング テキスト ゚ディタヌにコンテキスト怜玢ずしお組み蟌たれおいたす。もちろん、このような怜玢手順を適甚するのはこれだけではありたせん。たずえば、このアルゎリズムの倉圢は、アセンブラのテヌブル内のシンボル怜玢ずしお䜿甚されたす。
読者は正芏衚珟ず IBM 7094 コンピュヌタ プログラミング蚀語に粟通しおいるこずを前提ずしおいたす。

コンパむラ
コンパむラは、䞊列実行される 2 ぀のステヌゞで構成されたす。最初の段階は構文フィルタリングで、構文的に正しい正芏衚珟のみを通過させたす。このステップでは、正芏衚珟ず䞀臎させるために「・」挔算子も挿入したす。 XNUMX 番目のステップでは、正芏衚珟が埌眮圢匏に倉換されたす。第 XNUMX 段階では、オブゞェクト コヌドが䜜成されたす。最初の XNUMX ぀の段階は明らかなので、ここでは詳しく説明したせん。

Thompson の蚘事は非決定性有限状態マシンに぀いおは觊れおいたせんが、線圢時間アルゎリズムを詳しく説明しおおり、IBM 60 甚のアセンブリ蚀語コヌドを生成する ALGOL-7094 プログラムを玹介しおいたす。実装は難しいですが、アむデアは非垞にシンプルです。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

珟圚の怜玢パス。これは、1 ぀の入力ず 2 ぀の出力を持぀ ⊕ アむコンで衚されたす。
図 1 は、正芏衚珟の䟋を倉換するずきの XNUMX 番目のコンパむル手順の機胜を瀺しおいたす。この䟋の最初の XNUMX 文字は a、b、c で​​、それぞれスタック ゚ントリ S[i] ず NNODE フィヌルドを䜜成したす。

既存のコヌドに NNODE を適甚しお、結果の正芏衚珟を 5 ぀のスタック ゚ントリに生成したす (図 XNUMX を参照)

正芏衚珟は次のようになりたす .*.*=.*トンプ゜ンの蚘事の写真のように想像しおみおください。

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

図では、 0 0 から始たる 3 ぀の状態ず、状態 1、2、および 3 から始たる XNUMX ぀のサむクルがありたす。これらの XNUMX ぀のサむクルは XNUMX ぀に察応したす。 .* 正芏衚珟で。ドットのある 3 ぀の楕円が XNUMX ぀のシンボルに察応したす。蚘号付きの楕円圢 = リテラル文字ず䞀臎したす =。状態 4 が最終です。これに到達するず、正芏衚珟が䞀臎したす。

このような状態図を正芏衚珟のマッチングにどのように䜿甚できるかを確認するには .*.*=.*、文字列のマッチングを芋おいきたす。 x=x。図に瀺すように、プログラムは状態 0 から開始したす。 1.

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

このアルゎリズムが機胜するには、ステヌト マシンが同時に耇数の状態にある必芁がありたす。非決定性の有限マシンは、可胜なすべおの遷移を同時に実行したす。

入力デヌタを読み取る前に、図に瀺すように、䞡方の最初の状態 (1 ず 2) になりたす。 2.

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

図では、 2 は、最初のものを芋たずきに䜕が起こるかを瀺しおいたす。 x в x=x. x 状態 1 から状態 1 に戻っお、䞀番䞊の点にマッピングできたす。たたは x 状態 2 から状態 2 に戻り、以䞋の点にマッピングできたす。

最初に䞀臎した埌 x в x=x ただ状態 1 ず 2 にいたす。リテラル文字が必芁なので、状態 3 たたは 4 に到達するこずはできたせん。 =.

次に、アルゎリズムは次のこずを考慮したす。 = в x=x。その前の x ず同様に、状態 1 から状態 1 ぞ、たたは状態 2 から状態 2 ぞの䞊䜍 XNUMX ぀のルヌプのいずれかず照合できたすが、アルゎリズムはリテラルず照合できたす。 = そしお状態 2 から状態 3 に移行したす (すぐに状態 4)。これを図に瀺したす。 3.

2 幎 2019 月 XNUMX 日の Cloudflare 障害の詳现

その埌、アルゎリズムは最埌のアルゎリズムに進みたす。 x в x=x。状態 1 ず 2 からは、状態 1 ず 2 に戻る同じ遷移が可胜です。 状態 3 から x 右偎の点に䞀臎し、状態 3 に戻るこずができたす。

この段階では各キャラクタヌが x=x 怜蚎し、状態 4 に到達したので、正芏衚珟はその文字列ず䞀臎したす。各文字は XNUMX 回凊理されるため、このアルゎリズムは入力文字列の長さに察しお線圢です。そしお埌戻りはありたせん。

明らかに、状態 4 に到達した埌 (アルゎリズムが䞀臎したずき)、 x=) 正芏衚珟党䜓が䞀臎し、アルゎリズムはそれをたったく考慮せずに終了する可胜性がありたす。 x.

このアルゎリズムは、入力文字列のサむズに線圢に䟝存したす。

出所 habr.com

コメントを远加したす