Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Ampir 9 sababaraha taun ka pengker Cloudflare mangrupikeun perusahaan alit, sareng kuring henteu damel pikeun éta, kuring ngan ukur palanggan. Sabulan saatos ngaluncurkeun Cloudflare, kuring nampi béwara yén halaman wéb kuring jgc.orgDNS sigana teu jalan. Cloudflare parantos ngarobih kana Panyangga Protokol, tur aya DNS rusak.

Kuring langsung nyerat ka Matthew Pangeran kalayan judul "Dimana DNS kuring?" Sareng anjeunna ngirim balesan panjang pinuh ku detil téknis (baca sakabeh korespondensi dieu), anu kuring ngawaler:

Ti: John Graham-Cumming
kaping: 7 Oktober 2010, 9:14
Subject: Re: Dimana DNS kuring?
Pikeun: Matthew Pangeran

Laporan keren, hatur nuhun. Kuring pasti bakal nelepon lamun aya masalah. Eta meureun patut nulis pos ngeunaan ieu sakali anjeun geus dikumpulkeun sakabeh informasi teknis. Jigana jalma bakal ngarasakeun carita kabuka sarta jujur. Utamana upami anjeun ngagantelkeun grafik kana éta pikeun nunjukkeun kumaha lalu lintas parantos ningkat ti saprak diluncurkeun.

Kuring boga ngawas alus dina situs abdi, sarta kuring narima SMS ngeunaan unggal gagalna. Pangimeutan nunjukkeun yén gagalna lumangsung ti 13:03:07 ka 14:04:12. Tés dilaksanakeun unggal lima menit.

Kuring yakin anjeun bakal terang eta kaluar. Anjeun pasti kana nu teu butuh jalma sorangan di Éropa? 🙂

Sarta anjeunna ngawaler:

Ti: Matthew Pangeran
kaping: 7 Oktober 2010, 9:57
Subject: Re: Dimana DNS kuring?
Pikeun: John Graham-Cumming

Hatur nuhun. Kami ngabales ka saha waé anu nyerat. Abdi nuju ka kantor ayeuna sareng urang bakal nyerat hiji hal dina blog atanapi pin hiji pos resmi dina papan buletin urang. Abdi satuju pisan, kajujuran mangrupikeun sadayana.

Ayeuna Cloudflare mangrupikeun perusahaan anu ageung, kuring damel pikeun éta, sareng ayeuna kuring kedah nyerat sacara terbuka ngeunaan kasalahan urang, akibatna sareng tindakan urang.

Kajadian 2 Juli

Dina tanggal 2 Juli kami ngaluncurkeun aturan anyar dina Aturan Diurus pikeun WAFs kusabab éta Sumber daya CPU parantos béak dina unggal prosésor inti ngolah lalulintas HTTP / HTTPS dina jaringan Cloudflare sakuliah dunya. Kami terus-terusan ningkatkeun aturan anu diurus pikeun WAF pikeun ngaréspon kana kerentanan sareng ancaman anyar. Dina Méi, contona, urang rurusuhan nambahkeun aturanpikeun nangtayungan tina kerentanan serius dina SharePoint. Sakabeh titik tina WAF kami nyaéta kamampuan pikeun gancang sareng global nyebarkeun aturan.

Hanjakal, update Kemis panungtungan ngandung éksprési biasa nu wasted teuing sumberdaya HTTP / HTTPS CPU on backtracking. Proksi inti kami, CDN, sareng fungsi WAF ngalaman akibatna. Grafik nunjukkeun yén sumberdaya prosesor pikeun ngalayanan lalu lintas HTTP / HTTPS ngahontal ampir 100% dina server dina jaringan urang.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019
Pamakéan CPU dina hiji titik ayana nalika kajadian

Hasilna, klien kami (jeung klien kami 'klien) réngsé nepi ka kaca kasalahan 502 dina domain Cloudflare. Kasalahan 502 dibangkitkeun ku pangladén wéb Cloudflare anu masih ngagaduhan inti gratis tapi henteu tiasa komunikasi sareng prosés anu nanganan lalu lintas HTTP / HTTPS.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Urang terang sabaraha kasulitan ieu nyababkeun palanggan urang. Kami isin pisan. Sareng kagagalan ieu ngahalangan urang pikeun sacara efektif nungkulan kajadian éta.

Mun anjeun salah sahiji konsumén ieu, anjeun meureun sieun, ambek jeung kesel. Leuwih ti éta, urang geus teu kungsi a gangguan global. Konsumsi CPU anu luhur disababkeun ku hiji aturan WAF kalayan éksprési biasa anu kirang kecap anu nyababkeun mundur kaleuleuwihan. Ieu ekspresi kaliru: (?:(?:"|'|]|}||d|(?:nan|infinity|true|false|null|undefined|symbol|math)|`|-|+)+[)]*;?((?:s|-|~|!|{}||||+)*.*(?:.*=.*)))

Sanaos ieu pikaresepeun sorangan (sareng kuring bakal nyarioskeun langkung rinci di handap), jasa Cloudflare turun salami 27 menit sanés ngan ukur kusabab ekspresi biasa anu goréng. Butuh waktu pikeun ngajelaskeun runtuyan kajadian nu ngakibatkeun gagalna, jadi kami slow ngabales. Dina ahir tulisan, kuring bakal ngajelaskeun backtracking dina ekspresi biasa jeung ngabejaan Anjeun naon nu kudu jeung eta.

Aya naon

Hayu urang mimitian dina urutan. Sadaya waktos di dieu aya dina UTC.

Jam 13:42 p.m., saurang insinyur di tim firewall nyieun parobahan leutik kana aturan deteksi XSS ngagunakeun prosés otomatis. Sasuai, hiji tikét pamundut robah dijieun. Urang ngatur tiket sapertos ngaliwatan Jira (screenshot handap).

Saatos 3 menit, halaman mimiti PagerDuty muncul, ngalaporkeun masalah sareng WAF. Ieu mangrupikeun tés sintétik anu nguji pungsionalitas WAF (kami ngagaduhan ratusan) di luar Cloudflare pikeun ngawas operasi normal. Ieu langsung dituturkeun ku halaman panggeuing ngeunaan tes jasa tungtung-ka-tungtung Cloudflare anu gagal, masalah lalu lintas global, kasalahan 502 nyebar, sareng seueur laporan ti Points of Presence (PoP) kami di kota-kota di sakumna dunya anu nunjukkeun kakurangan. sumberdaya CPU.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Kuring nampi sababaraha panggeuing ieu, kaluar tina rapat, sareng nuju ka méja nalika kapala departemén pamekaran solusi kami nyarios yén kami kaleungitan 80% tina lalu lintas urang. Kuring lumpat ka insinyur SRE kami, anu parantos ngusahakeun masalahna. Awalna urang panginten ieu mangrupikeun serangan anu teu dipikanyaho.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Insinyur Cloudflare SRE sumebar di sakumna dunya sareng ngawas kaayaan sakitar jam. Biasana, panggeuing ieu ngabéjaan ka anjeun ngeunaan masalah lokal khusus ngeunaan lingkup kawates, dilacak dina dasbor internal, sareng direngsekeun sababaraha kali sadinten. Tapi halaman ieu sareng bewara nunjukkeun hal anu serius, sareng insinyur SRE langsung nyatakeun tingkat severity P0 sareng ngahubungi manajemén sareng insinyur sistem.

Insinyur London urang nuju ngadangukeun ceramah di aula utama dina waktos éta. Kuliah kedah diganggu, sadayana ngumpul di kamar konperénsi ageung, sareng langkung seueur spesialis disebut. Ieu sanés masalah umum anu tiasa diurus ku SRE sorangan. Éta penting pikeun ngalibetkeun spesialis anu leres.

Tabuh 14:00 kami nangtukeun yén masalahna sareng WAF sareng teu aya serangan. Tim kinerja narik data CPU sareng janten jelas yén WAF kedah disalahkeun. pagawe sejen dikonfirmasi téori ieu ngagunakeun strace. Batur ningali dina log yén aya masalah sareng WAF. Jam 14:02 p.m., sadayana tim sumping ka kuring nalika diusulkeun ngagunakeun pembunuhan global, mékanisme anu diwangun dina Cloudflare anu mareuman hiji komponén di sakuliah dunya.

Kumaha urang maéhan global pikeun WAF mangrupikeun carita anu béda. Éta henteu saderhana pisan. Urang make produk urang sorangan, sarta saprak jasa kami Access teu bisa dipake, urang teu bisa auténtikasi jeung asup kana panel kontrol internal (lamun sagalana geus dibereskeun, urang diajar yén sababaraha anggota tim geus leungit aksés alatan fitur kaamanan nu disables credentials lamun panel kontrol internal teu dipaké pikeun a waktos na lami).

Sareng kami henteu tiasa nampi jasa internal kami, sapertos Jira atanapi sistem ngawangun. Kami peryogi mékanisme workaround, anu jarang dianggo (ieu ogé kedah didamel). Tungtungna, hiji insinyur junun mareuman WAF di 14:07, sarta di 14:09, lalulintas sarta tingkat CPU deui normal di mana waé. Sesa mékanisme panyalindungan Cloudflare damel sapertos biasa.

Teras we nyetél ngeunaan mulangkeun WAF. Kaayaan éta luar biasa, ku kituna urang ngajalankeun tés négatip (naroskeun ka diri urang upami parobihan éta leres-leres masalahna) sareng tés positip (pastikeun rollback tiasa dianggo) dina hiji kota nganggo lalu lintas anu misah, mindahkeun palanggan anu mayar ti dinya.

Jam 14:52 kami yakin yén kami ngartos alesanana sareng ngadamel koreksi, sareng ngaktifkeun WAF deui.

Kumaha Cloudflare jalan

Cloudflare boga tim insinyur dedicated ka ngatur aturan pikeun WAFs. Aranjeunna narékahan pikeun ningkatkeun tingkat deteksi, ngirangan positip palsu, sareng gancang ngabales ancaman anyar nalika muncul. Dina 60 dinten ka pengker, aya 476 pamenta perobahan anu diolah pikeun aturan anu diurus pikeun WAF (rata-rata hiji unggal 3 jam).

Parobihan khusus ieu kedah disebarkeun dina modeu simulasi, dimana lalu lintas klien nyata ngalangkungan aturan, tapi teu aya anu diblokir. Kami nganggo mode ieu pikeun nguji éféktivitas aturan sareng ngukur tingkat positip sareng négatip palsu. Tapi sanajan dina modeu simulasi, aturan kudu sabenerna jadi dieksekusi, sarta dina hal ieu aturan ngandung ekspresi biasa nu consuming teuing sumberdaya processor.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Sakumaha anjeun tiasa tingali tina pamundut parobihan di luhur, kami ngagaduhan rencana panyebaran, rencana balikan deui, sareng tautan kana prosedur operasi standar internal (SOP) pikeun panyebaran jinis ieu. SOP pikeun ngarobah aturan ngamungkinkeun pikeun diterbitkeun sacara global. Sabenerna, di Cloudflare, hal-hal dilakukeun sacara lengkep béda, sareng SOP nyatakeun yén urang mimiti ngirimkeun parangkat lunak pikeun uji sareng panggunaan internal ka titik internal ayana (PoP) (anu dianggo ku karyawan urang), teras ka sajumlah leutik klien di hiji lokasi terasing, lajeng ka angka nu gede ngarupakeun klien, sarta ngan lajeng ka sakuliah dunya.

Ieu naon eta Sigana mah. Kami nganggo git sacara internal via BitBucket. Insinyur anu damel dina parobihan ngirimkeun kode, anu diwangun pikeun TeamCity, sareng nalika ngawangunna pas, para pamariksaan ditugaskeun. Sakali pamundut tarikan disatujuan, kode dirakit sareng séri tés dijalankeun (deui).

Upami ngawangun sareng tés parantos suksés, pamundut parobihan didamel di Jira sareng manajer atanapi pimpinan anu cocog kedah nyatujuan parobihan éta. Saatos persetujuan, panyebaran lumangsung kana anu disebut "PoP menagerie": ANJING, BABI sareng Kanaria (anjing, babi jeung kenari).

DOG PoP mangrupikeun Cloudflare PoP (sapertos unggal kota kami anu sanés) anu dianggo ngan ku karyawan Cloudflare. PoP pikeun pamakéan internal ngidinan Anjeun pikeun nyekel masalah saméméh lalulintas customer mimiti ngalir kana solusi. Hal mangpaat.

Upami tés ANJING suksés, kodena ngalih ka tahap BABI (guinea pig). Ieu Cloudflare PoP, dimana sajumlah leutik lalu lintas palanggan gratis ngalir ngaliwatan kode anyar.
Upami sadayana leres, kodeu asup kana Kanaria. Kami ngagaduhan tilu Canary PoPs di sababaraha tempat di dunya. Di antarana, lalu lintas klien anu mayar sareng gratis ngalangkungan kodeu énggal, sareng ieu mangrupikeun pamariksaan terakhir pikeun kasalahan.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019
Prosés Release Software di Cloudflare

Lamun kode ok di Kanaria, urang ngaleupaskeun. Ngaliwatan sadaya tahapan - ANJING, BABI, Kanaria, saalam dunya - butuh sababaraha jam atanapi dinten, gumantung kana parobihan kode. Kusabab keragaman jaringan sareng klien Cloudflare, urang nguji kode sateuacan ngaleupaskeun sacara global ka sadaya klien. Tapi WAF henteu sacara khusus nuturkeun prosés ieu kusabab ancaman kedah direspon gancang.

ancaman WAF
Dina sababaraha taun katukang, aya paningkatan anu signifikan dina ancaman dina aplikasi umum. Ieu kusabab kasadiaan anu langkung ageung tina alat uji parangkat lunak. Contona, urang nembe wrote ngeunaan ngahuleng).

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019
sumber: https://cvedetails.com/

Sering pisan, bukti konsép didamel sareng langsung diterbitkeun dina Github supados tim anu ngajaga aplikasi tiasa gancang nguji sareng mastikeun yén éta aman. Ku alatan éta, Cloudflare perlu kamampuhan pikeun ngabales serangan anyar gancang-gancang ku kituna konsumén boga kasempetan pikeun ngalereskeun software maranéhanana.

Conto anu saé pikeun réspon gancang Cloudflare nyaéta panyebaran panyalindungan kerentanan SharePoint dina Méi (baca di dieu). Ampir langsung saatos pengumuman, kami perhatikeun sajumlah ageung usaha pikeun ngamangpaatkeun kerentanan dina pamasangan SharePoint konsumén urang. Lalaki urang terus-terusan ngawaskeun ancaman anyar sareng aturan nyerat pikeun ngajagi para nasabah.

Aturan anu nyababkeun masalah dina Kemis sakuduna ngajagi tina skrip cross-site (XSS). Serangan sapertos kitu ogé janten langkung sering dina taun-taun ayeuna.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019
sumber: https://cvedetails.com/

Prosedur standar pikeun ngarobih aturan anu diurus pikeun WAF nyaéta ngalaksanakeun uji integrasi kontinyu (CI) sateuacan nyebarkeun global. Kemis kamari kami ngalakukeun ieu sareng ngaluncurkeun aturan. Jam 13:31, saurang insinyur ngirimkeun paménta tarik anu disatujuan kalayan perobahan.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Jam 13:37 TeamCity ngumpulkeun aturan, ngajalankeun tés sareng masihan payuneun. WAF test suite nguji fungsionalitas inti WAF sarta diwangun ku sajumlah badag unit test pikeun fungsi individu. Saatos tés unit, urang nguji aturan pikeun WAF nganggo sajumlah ageung pamundut HTTP. Permintaan HTTP pariksa pamundut mana anu kedah diblokir ku WAF (pikeun ngahalangan serangan) sareng anu tiasa diidinan (supaya henteu ngahalangan sadayana sareng ngahindarkeun positip palsu). Tapi kami henteu nguji pikeun pamakéan CPU kaleuleuwihan, sarta examining log tina WAF ngawangun saméméhna nunjukeun yen waktos palaksanaan test aturan teu nambahan, jeung hese nyangka yén aya moal jadi cukup sumberdaya.

Tés lulus sareng TeamCity mimiti sacara otomatis nyebarkeun parobihan jam 13:42.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Quicksilver

Aturan WAF museurkeun kana remediasi ancaman langsung, ku kituna urang nyebarkeunana nganggo toko nilai konci anu disebarkeun Quicksilver, anu nyebarkeun parobahan sacara global dina sababaraha detik. Sadaya klien kami nganggo téknologi ieu nalika aranjeunna ngarobih konfigurasi dina dasbor atanapi via API, sareng éta berkat kami ngabales parobahan kalayan kecepatan kilat.

Kami henteu acan nyarios seueur ngeunaan Quicksilver. Saméméhna kami dipaké Tycoon Kyoto salaku toko konci-nilai anu disebarkeun sacara global, tapi aya masalah operasional sareng éta, sareng kami nyerat toko sorangan, diulang di langkung ti 180 kota. Ayeuna kami nganggo Quicksilver pikeun nyorong parobahan konfigurasi ka klien, ngapdet aturan WAF, sareng nyebarkeun kode JavaScript anu ditulis ku klien ka Cloudflare Workers.

Ngan butuh sababaraha detik ti ngaklik tombol dina dasbor atawa nelepon hiji API pikeun nyieun parobahan konfigurasi sakuliah dunya. Konsumén resep kana laju pangaturan ieu. Sareng Pagawe masihan aranjeunna panyebaran parangkat lunak global ampir sakedapan. Rata-rata, Quicksilver nyebarkeun ngeunaan 350 parobahan per detik.

Sareng Quicksilver gancang pisan. Rata-rata, urang ngahontal persentil ka-99 tina 2,29 detik pikeun nyebarkeun parobahan ka unggal komputer di sakuliah dunya. Laju biasana mangrupikeun hal anu saé. Barina ogé, nalika anjeun ngaktipkeun pungsi atawa mupus cache, éta lumangsung ampir instan jeung madhab. Ngirim kode ngaliwatan Cloudflare Workers lumangsung dina laju anu sarua. Cloudflare ngajangjikeun para nasabahna apdet gancang dina waktos anu pas.

Tapi dina hal ieu, speed maénkeun lulucon kejam on kami, jeung aturan robah madhab dina hitungan detik. Anjeun meureun geus noticed yén kode WAF ngagunakeun Lua. Cloudflare ngagunakeun Lua sacara éksténsif dina produksi sareng detil Lua di WAF urang geus dibahas. Lua WAF ngagunakeun PCRE internal tur lumaku backtracking pikeun cocog. Éta henteu gaduh mékanisme pikeun ngajagaan tina ekspresi anu kaluar tina kontrol. Di handap ieu kuring bakal ngobrol langkung seueur ngeunaan ieu sareng naon anu urang lakukeun ngeunaan éta.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Sateuacan aturan disebarkeun, sadayana lancar: pamundut tarik diciptakeun sareng disatujuan, pipa CI / CD ngumpulkeun sareng nguji kodeu, pamundut parobihan dikintunkeun dumasar kana SOP anu ngatur panyebaran sareng rollback, sareng panyebaran parantos réngsé.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019
Prosés deployment Cloudflare WAF

Aya nu lepat
Salaku Cenah mah, urang nyebarkeun puluhan aturan WAF anyar unggal minggu, sarta kami boga loba sistem di tempat ngajaga ngalawan konsékuansi négatip tina deployment misalna. Sareng nalika aya anu salah, biasana mangrupikeun kombinasi sababaraha kaayaan sakaligus. Lamun manggihan ngan hiji alesan, ieu, tangtosna, reassuring, tapi teu salawasna bener. Ieu mangrupikeun alesan anu nyababkeun gagalna jasa HTTP/HTTPS kami.

  1. Insinyur nyerat ekspresi biasa anu tiasa nyababkeun kaleuleuwihan mundur.
  2. A fitur nu bisa geus dicegah éksprési biasa ti wasting teuing CPU ieu salah dihapus dina refactoring tina WAF sababaraha minggu saméméhna-refactoring ieu diperlukeun sangkan WAF meakeun kirang sumberdaya.
  3. Mesin ekspresi biasa teu ngagaduhan jaminan pajeulitna.
  4. Test suite teu bisa ngadeteksi konsumsi CPU kaleuleuwihan.
  5. SOP ngamungkinkeun parobahan aturan non-darurat digulung sacara global tanpa prosés multi-léngkah.
  6. Rencana rollback diperlukeun ngajalankeun hiji WAF ngawangun pinuh dua kali, nu nyandak lila.
  7. Peringatan munggaran ngeunaan masalah lalu lintas global dipicu telat.
  8. Kami nyandak sababaraha waktos pikeun ngapdet halaman status.
  9. Urang ngalaman masalah ngakses sistem alatan glitch a, sarta prosedur bypass teu ogé ngadegkeun.
  10. Insinyur SRE leungit aksés ka sababaraha sistem kusabab kredensialna kadaluwarsa kusabab alesan kaamanan.
  11. Palanggan kami henteu ngagaduhan aksés kana dasbor Cloudflare atanapi API sabab ngalangkungan wilayah Cloudflare.

Naon geus robah saprak Kemis panungtungan

Kahiji, urang sapinuhna ngeureunkeun sagala gawé dina release pikeun WAF sarta ngalakonan di handap:

  1. Kami ngenalkeun deui panyalindungan overuse CPU anu kami hapus. (Siap)
  2. Mariksa sacara manual sadayana 3868 aturan dina aturan anu diurus pikeun WAF pikeun milarian sareng ngabenerkeun kasus poténsial sanésna anu mundur kaleuleuwihan. (Vérifikasi réngsé)
  3. Urang kaasup profil kinerja pikeun sakabéh aturan dina set test. (Diperkirakeun: 19 Juli)
  4. Ngalih ka mesin ekspresi biasa re2 atawa karahaan - duanana nyadiakeun jaminan runtime. (Diperkirakeun: 31 Juli)
  5. Kami nyerat deui SOP pikeun nyebarkeun aturan sacara bertahap, sapertos parangkat lunak sanés dina Cloudflare, tapi dina waktos anu sami gaduh kamampuan pikeun nyebarkeun global darurat upami serangan parantos dimimitian.
  6. Kami ngembangkeun kamampuan pikeun gancang nyabut dasbor Cloudflare sareng API ti daérah Cloudflare.
  7. Otomatis apdet kaca Status Cloudflare.

Jangka panjang urang ngajauhan tina Lua WAF anu kuring nyerat sababaraha taun ka pengker. Mindahkeun WAF ka sistem firewall anyar. Ku cara ieu WAF bakal langkung gancang sareng nampi tingkat panyalindungan tambahan.

kacindekan

Kagagalan ieu nyababkeun kasulitan pikeun urang sareng para nasabah. Kami gancang-gancang ngabenerkeun kaayaan sareng ayeuna nuju ngusahakeun cacad dina prosés anu nyababkeun kacilakaan, ogé ngagali langkung jero pikeun ngajagaan tina masalah poténsial kalayan ekspresi biasa di hareup nalika migrasi ka téknologi anyar.

Kami pisan isin ngeunaan outage ieu sareng hapunten ka konsumén urang. Kami ngarepkeun parobahan ieu bakal mastikeun yén hal sapertos kieu henteu kajantenan deui.

Aplikasi. Backtracking éksprési biasa

Pikeun ngartos kumaha ekspresi:

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

ate up sagala sumberdaya CPU, anjeun kudu nyaho saeutik ngeunaan kumaha mesin ekspresi biasa baku jalan. Masalahna di dieu nyaéta pola .*(?:.*=.*). (?: sarta pakait ) mangrupa grup non-nangkep (nyaéta, éksprési dina kurung dikelompokkeun salaku éksprési tunggal).

Dina konteks konsumsi CPU kaleuleuwihan, pola ieu bisa digambarkeun salaku .*.*=.*. Dina formulir ieu, pola Sigana unnecessarily kompléks. Tapi anu langkung penting, dina dunya nyata, ekspresi (sapertos éksprési kompleks dina aturan WAF) anu naroskeun mesin pikeun cocog sareng sempalan anu dituturkeun ku sempalan anu sanés tiasa ngakibatkeun mundur bencana. Sareng sababna.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Dina ekspresi biasa . hartina anjeun kudu cocog hiji karakter, .* - cocog enol atawa leuwih karakter "greedily", nyaeta, nangkep maksimum karakter, ku kituna .*.*=.* hartina cocog enol atawa leuwih karakter, lajeng cocog enol atawa leuwih karakter, manggihan literal = karakter, cocog enol atawa leuwih karakter.

Hayu urang nyandak jalur tés x=x. Ieu luyu jeung babasan .*.*=.*. .*.* saméméh tanda sarua cocog kahiji x (salah sahiji grup .* соответствует x, jeung kadua - enol karakter). .* sanggeus = patandingan panungtungan x.

Perbandingan ieu butuh 23 léngkah. Grup kahiji .* в .*.*=.* tindakan greedily tur cocog sakabéh string x=x. Mesin pindah ka grup salajengna .*. Urang teu boga deui karakter pikeun cocog, jadi grup kadua .* cocog enol karakter (ieu diwenangkeun). Lajeng mesin mindahkeun kana tanda =. Henteu aya deui simbol (grup kahiji .* dipaké sakabéh éksprési x=x), euweuh ngabandingkeun lumangsung.

Lajeng mesin éksprési biasa balik deui ka awal. Anjeunna pindah ka grup munggaran .* sarta ngabandingkeun éta с x= (tibatan x=x), lajeng nyandak grup kadua .*. Kelompok kadua .* dibandingkeun jeung kadua x, sarta kami deui teu boga karakter ditinggalkeun. Jeung nalika mesin ngahontal deui = в .*.*=.*, euweuh gawéna. Sareng anjeunna mundur deui.

Kali ieu grup .* masih cocog x=, tapi grup kadua .* henteu aya deui x, jeung nol karakter. mesin nyobian pikeun manggihan karakter literal = dina pola .*.*=.*, tapi teu kaluar (sanggeus kabeh, grup kahiji geus nempatan eta .*). Sareng anjeunna mundur deui.

Kali ieu grup kahiji .* nyokot ngan kahiji x. Tapi grup kadua .* "rakus" ngarebut =x. Naha anjeun parantos nebak naon anu bakal kajadian? mesin nyoba cocog literal =, gagal sarta ngajadikeun backtracking sejen.

Kelompok kahiji .* masih cocog jeung kahiji x. Kadua .* ukur nyokot =. Tangtu, mesin teu bisa cocog literal =, sabab grup kadua geus ngalakukeun ieu .*. Jeung deui backtracking. Sarta kami nyoba cocog string tilu karakter!

Hasilna, grup kahiji .* cocog ngan hiji munggaran x, kadua .* - kalawan enol karakter, sarta mesin tungtungna cocog literal = dina babasan с = baris. Salajengna nyaeta grup panungtungan .* dibandingkeun sareng anu terakhir x.

23 léngkah ngan pikeun x=x. Lalajo pidéo pondok ngeunaan ngagunakeun Perl Regexp:: Debugger, nu nembongkeun kumaha léngkah jeung backtracking lumangsung.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Ieu geus loba karya, tapi kumaha lamun gantina x=x urang bakal boga x=xx? Éta 33 léngkah. Sareng upami x=xxx? 45. Hubungan teu linier. grafik nembongkeun ngabandingkeun tina x=x ka x=xxxxxxxxxxxxxxxxxxxx (20 x после =). Lamun urang boga 20 x sanggeus =, mesin ngalengkepan cocog dina 555 léngkah! (Salajengna, upami urang kaleungitan x= sareng senarna ngan ukur diwangun ku 20 x, mesin bakal nyandak 4067 léngkah ngartos yen aya euweuh patandingan).

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

video ieu nembongkeun sagala backtracking pikeun ngabandingkeun x=xxxxxxxxxxxxxxxxxxxx:

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Masalahna nyaéta nalika ukuran senar naék, waktos anu cocog tumbuh super-linier. Tapi hal-hal tiasa langkung parah upami ekspresi biasa rada dirobih. Hayu urang nyebutkeun urang kungsi .*.*=.*; (nyaéta, aya titik koma literal dina tungtung pola). Contona, pikeun cocog ekspresi kawas foo=bar;.

Sarta di dieu backtracking bakal jadi musibah nyata. Pikeun babandingan x=x eta bakal butuh 90 léngkah, teu 23. Jeung jumlah nu tumuwuh gancang. Pikeun ngabandingkeun x= sarta 20 x, 5353 léngkah diperlukeun. Ieu bagan. Tingali kana nilai sumbu Y dibandingkeun jeung bagan saméméhna.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Upami anjeun resep, pariksa sadayana 5353 léngkah anu cocog anu gagal x=xxxxxxxxxxxxxxxxxxxx и .*.*=.*;

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Ku ngagunakeun cocog puguh tinimbang rakus, extent backtracking bisa dikawasa. Lamun urang ngarobah ekspresi aslina kana .*?.*?=.*?, pikeun babandingan x=x eta bakal nyandak 11 léngkah (teu 23). Sedengkeun pikeun x=xxxxxxxxxxxxxxxxxxxx... Sadaya sabab ? после .* ngabejaan mesin pikeun cocog jumlah minimum karakter sateuacan ngaléngkah.

Tapi mappings puguh teu lengkep ngajawab masalah backtracking. Lamun urang ngaganti conto catastrophic .*.*=.*; dina .*?.*?=.*?;, waktos palaksanaan bakal tetep sarua. x=x masih merlukeun 555 léngkah, jeung x= sarta 20 x - 5353.

Hiji-hijina hal anu bisa dipigawé (sagigireun lengkep nulis balik pola pikeun spésifisitas gede) nyaéta abandon mesin éksprési biasa kalawan mékanisme backtracking na. Ieu anu bakal urang laksanakeun dina sababaraha minggu ka hareup.

Solusi pikeun masalah ieu geus dipikawanoh saprak 1968, nalika Kent Thompson nulis artikel Téhnik Pemrograman: Algoritma milarian éksprési biasa ("Metode Pemrograman: Algoritma Pilarian Ekspresi Biasa"). Artikel ngajelaskeun mékanisme nu ngidinan Anjeun pikeun ngarobah hiji éksprési biasa kana mesin kaayaan terhingga non-deterministik, sarta sanggeus parobahan kaayaan dina mesin kaayaan terhingga non-deterministik, ngagunakeun hiji algoritma anu waktu palaksanaan gumantung linier dina string loyog.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Métode Programming
Algoritma Pilarian Babasan Biasa
Ken Thompson

Bell Telephone Laboratories, Inc., Murray Hill, New Jersey

Ieu ngajelaskeun métode pikeun milarian string husus tina karakter dina téks na ngabahas palaksanaan metoda ieu dina formulir compiler. Kompiler nyandak éksprési biasa salaku kode sumber sareng ngahasilkeun program IBM 7094 salaku kode obyék. Program obyék nyokot input dina wangun téks pilarian sarta emits sinyal unggal waktos string téks ieu loyog jeung ekspresi biasa dibikeun. Artikel nyadiakeun conto, masalah jeung solusi.

algoritma
Algoritma pilarian saméméhna ngakibatkeun backtracking lamun pilarian sawaréh suksés gagal pikeun ngahasilkeun hasil.

Dina modeu kompilasi, algoritma henteu dianggo sareng simbol. Ieu ngalirkeun parentah pikeun kode disusun. Palaksanaan gancang pisan - saatos ngalirkeun data ka luhur daptar ayeuna, éta otomatis milarian sadaya karakter padeukeut anu mungkin dina ekspresi biasa.
Algoritma kompilasi sareng milarian kalebet dina pangropéa téksu waktos-sharing salaku pamilarian kontekstual. Tangtu, ieu tebih ti hijina aplikasi tina prosedur pilarian misalna. Contona, varian algoritma ieu dipaké salaku pilarian simbol dina tabel di assembler.
Hal ieu dianggap nu maca wawuh jeung ungkapan biasa na IBM 7094 basa programming komputer.

Panyusun
Compiler diwangun ku tilu tahapan ngajalankeun paralel. Tahap kahiji nyaéta nyaring sintaksis, anu ngamungkinkeun éksprési reguler anu leres sacara sintaksis anu diliwat. Léngkah ieu ogé nyelapkeun operator "·" pikeun cocog sareng ekspresi biasa. Dina lengkah kadua, ekspresi reguler dirobih kana bentuk postfix. Dina tahap katilu, kode objék dijieun. 2 tahapan anu munggaran atra, sareng urang moal cicing di dinya.

artikel Thompson urang teu ngobrol ngeunaan mesin kaayaan terhingga nondeterministic, tapi ngajelaskeun algoritma waktos linier ogé tur nampilkeun program ALGOL-60 anu dibangkitkeun kode basa assembly pikeun IBM 7094. palaksanaan nyaeta tricky, tapi ide pisan basajan.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

jalur pilarian ayeuna. Diwakilan ku ikon ⊕ kalayan hiji input sareng dua kaluaran.
Angka 1 nunjukkeun pungsi léngkah kompilasi katilu nalika ngarobih conto ekspresi biasa. Tilu karakter kahiji dina conto nyaéta a, b, c, sarta masing-masing nyiptakeun éntri tumpukan S[i] jeung widang NNODE.

NNODE kana kode anu aya pikeun ngahasilkeun éksprési biasa anu dihasilkeun dina éntri tumpukan tunggal (tingali Gambar 5)

Ieu kumaha ekspresi biasa bakal kasampak kawas .*.*=.*, Lamun ngabayangkeun eta sakumaha dina gambar tina artikel Thompson urang.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Dina Gbr. 0 aya lima kaayaan mimitian ti 0, jeung 3 siklus nu dimimitian ti nagara bagian 1, 2 jeung 3. Tilu siklus ieu pakait jeung tilu. .* dina babasan biasa. 3 ovals kalawan titik pakait jeung hiji simbol. Oval kalayan tanda = cocog karakter literal =. Nagara 4 nyaéta final. Upami urang ngahontal éta, maka ekspresi biasa dicocogkeun.

Pikeun ningali kumaha diagram kaayaan sapertos kitu tiasa dianggo pikeun cocog ekspresi biasa .*.*=.*, urang bakal kasampak di cocog string x=x. Program dimimitian ti kaayaan 0, ditémbongkeun saperti dina Gbr. 1.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Pikeun algoritma ieu jalan, mesin kaayaan kudu di sababaraha nagara bagian sakaligus. Hiji mesin terhingga non-deterministik bakal nyieun sagala transisi mungkin sakaligus.

Sateuacan gaduh waktos maca data input, éta asup ka dua nagara bagian munggaran (1 sareng 2), sapertos anu dipidangkeun dina Gbr. 2.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Dina Gbr. 2 nunjukkeun naon anu lumangsung nalika anjeunna ningali heula x в x=x. x tiasa peta ka titik luhur, balik ti kaayaan 1 jeung deui kaayaan 1. Atawa x tiasa peta ka titik di handap, balik ti kaayaan 2 jeung balik ka kaayaan 2.

Sanggeus cocog kahiji x в x=x urang masih di nagara bagian 1 jeung 2. Urang teu bisa ngahontal kaayaan 3 atawa 4 sabab urang kudu karakter literal =.

Algoritma lajeng mertimbangkeun = в x=x. Sapertos x sateuacanna, éta tiasa cocog sareng salah sahiji dua puteran luhur ti kaayaan 1 ka kaayaan 1 atanapi tina kaayaan 2 ka kaayaan 2, tapi algoritma tiasa cocog sareng literal. = sarta mindahkeun tina kaayaan 2 mun kaayaan 3 (jeung geuwat 4). Ieu ditémbongkeun dina Gbr. 3.

Rincian ngeunaan pemadaman Cloudflare dina 2 Juli 2019

Algoritma teras ngalih ka anu terakhir x в x=x. Ti nagara bagian 1 jeung 2 transisi sarua mungkin deui ka nagara bagian 1 jeung 2. Ti kaayaan 3 x tiasa cocog sareng titik di beulah katuhu sareng uih deui ka kaayaan 3.

Dina tahap ieu, unggal karakter x=x dianggap, sarta saprak urang geus ngahontal kaayaan 4, ekspresi biasa cocog string anu. Unggal karakter diolah sakali, jadi algoritma ieu linier dina panjang string input. Jeung euweuh backtracking.

Jelas, saatos ngahontal kaayaan 4 (nalika algoritma parantos cocog x=) sakabéh éksprési biasa dicocogkeun, sarta algoritma nu bisa nungtungan tanpa tempo eta pisan x.

Algoritma ieu gumantung sacara linier kana ukuran string input.

sumber: www.habr.com

Tambahkeun komentar