Petunjuk dan ruang lingkup
Sebuah aplikasi berada di balik CDN, reverse proxy, WAF, dan layanan backend. Tim keamanan menemukan bahwa komponen-komponen tersebut tidak sepakat mengenai batas permintaan dalam aliran bita (byte stream) HTTP/1.1 yang sama, sehingga memungkinkan front end melihat satu permintaan sementara backend mem-parsing permintaan kedua dari bita yang tersisa. Jelaskan mekanismenya, penanganan yang aman atas konflik Content-Length dan Transfer-Encoding, deteksi, remediasi, validasi, dan peluncuran (rollout).
RFC 9112 memperingatkan bahwa perbedaan aturan ketahanan (robustness) di antara penerima dapat menimbulkan risiko request smuggling. OWASP mengaitkan kelas kerentanan ini dengan parsing yang tidak konsisten antara komponen front-end dan back-end. Pertanyaan ini menguji apakah Anda dapat membedah "ketidaksepakatan parser" menjadi aliran bita, penggunaan kembali koneksi (connection reuse), dan batas keamanan, bukan sekadar menghafal akronim serangan.
Hal yang diuji oleh pewawancara
- Memisahkan pembingkaian pesan (message framing), perutean, dan validasi parameter aplikasi.
- Menjelaskan batasan
Content-Length,Transfer-Encoding, dan penurunan versi (downgrade) ke HTTP/1.0 dengan benar. - Mengidentifikasi proxy mana yang mem-parsing, koneksi mana yang digunakan kembali, dan bagaimana bita yang tersisa memengaruhi permintaan berikutnya.
- Menggabungkan penolakan permintaan ambigu, satu parser yang ketat, dan penutupan koneksi.
- Merancang pengujian yang aman, pemantauan, canary, dan rollback tanpa menimbulkan efek samping di produksi.
- Memeriksa lapisan translasi bahkan ketika HTTP/2 atau HTTP/3 digunakan.
Pertanyaan klarifikasi
- Versi HTTP dan middleware apa saja yang ada di jalur tersebut? Asumsikan proxy HTTP/1.1 dan kumpulan backend (backend pool).
- Apakah front end dan back end menggunakan kembali koneksi TCP? Smuggling biasanya bergantung pada penggunaan kembali koneksi atau perbedaan status parser.
- Apakah chunked body dan request body diizinkan? Asumsikan edge publik mengizinkannya tetapi dapat menolak kombinasi yang ambigu.
- Apakah tujuannya penahanan darurat (containment) atau konvergensi parser permanen? Berikan keduanya.
- Bisakah pengujian menggunakan backend terisolasi dan endpoint bebas efek samping? Harus demikian, daripada mengirimkan lalu lintas destruktif ke produksi.
Jawaban tiga puluh detik
Saya akan menggambarkan aliran bita dan penggunaan kembali koneksi dari proxy ke backend. Akar penyebabnya adalah perbedaan aturan yang digunakan penerima untuk menentukan panjang pesan, terutama ketika Content-Length dan Transfer-Encoding muncul bersamaan atau terdapat nilai panjang duplikat yang tidak valid. Edge menolak ambiguitas, mem-parsing dengan ketat, menutup koneksi saat terjadi kesalahan, dan menjaga implementasi proxy serta backend tetap selaras. Saya akan memvalidasi dengan endpoint terisolasi dan perbandingan dua komponen, kemudian memantau lonjakan respons 400 yang tidak normal, reset, kesalahan parser, dan ketidaksesuaian jumlah permintaan selama canary dengan rute yang dapat di-rollback.
Solusi langkah demi langkah
Langkah 1: Petakan batas pesan dan koneksi
Buat daftar apakah klien, CDN, WAF, reverse proxy, dan backend mem-parsing permintaan, menulis ulang header, atau menggunakan kembali koneksi upstream. HTTP/1.1 adalah protokol berbasis aliran bita; setiap penerima menentukan panjang body dari kolom header. Jika dua lapisan tidak sepakat, bita yang tersisa dapat menjadi permintaan baru di lapisan berikutnya.
Jangan mulai dengan muatan serangan (payload). Gunakan contoh aliran bita yang tidak berbahaya yang menunjukkan front end membaca satu permintaan sementara backend membaca dua, sehingga status batas pesan terlihat jelas.
Langkah 2: Jelaskan aturan panjang dan ambiguitas
RFC 9112 mendefinisikan panjang body pesan serta perilaku Content-Length dan Transfer-Encoding. Ketika keduanya muncul bersamaan, penerima tidak boleh secara independen memilih salah satu dan melanjutkan pemrosesan. Perlakukan permintaan tersebut sebagai ambigu dan tolak, biasanya dengan menutup koneksi. Kolom Content-Length duplikat yang bertentangan juga harus ditolak daripada mengambil nilai pertama atau terakhir.
Permintaan HTTP/1.0 yang berisi Transfer-Encoding tidak dapat diperlakukan sebagai semantik chunked normal. Proses permintaan tersebut sebagai kesalahan protokol dan tutup koneksi sesuai ketentuan. Prinsipnya adalah satu aturan ketat untuk setiap penerima, bukan toleransi "kebal" terhadap klien dengan format salah (malformed).
Langkah 3: Jelaskan bagaimana penggunaan kembali memperbesar dampak
Proxy depan dapat membagi satu koneksi klien menjadi beberapa permintaan upstream sementara kumpulan backend menunggu bita tambahan pada koneksi yang digunakan kembali. Jika batasan pesan berbeda, awalan yang disuntikkan tetap berada di buffer dan menjadi awal dari permintaan berikutnya. Cache, rute autentikasi, endpoint administrasi internal, dan permintaan tenant lain dapat terpengaruh.
Oleh karena itu, perbaikannya mencakup CDN, WAF, proxy, dan translasi protokol. Periksa apakah kesalahan parsing meninggalkan koneksi yang masih bisa digunakan kembali, apakah buffer dikosongkan, dan apakah gateway menghasilkan kembali kolom panjang yang konsisten saat menerjemahkan HTTP/2 ke HTTP/1.1.
Langkah 4: Berikan strategi penahanan di edge
Tolak permintaan yang berisi Content-Length dan Transfer-Encoding secara bersamaan, kolom panjang duplikat, pembingkaian chunk yang tidak valid, atau versi yang tidak didukung. Tutup koneksi setelah terjadi kesalahan parsing alih-alih menyerahkan bita yang tersisa ke permintaan berikutnya. Menonaktifkan penggunaan kembali koneksi upstream untuk sementara pada rute yang terdampak dapat menahan risiko, namun akan menambah latensi dan biaya koneksi.
Aturan memerlukan pengecualian eksplisit dan log yang dikategorikan; daftar hitam (blacklist) terpisah di setiap komponen akan menciptakan ketidaksepakatan baru. Lebih utamakan versi parser ketat yang seragam dan matriks kompatibilitas untuk klien yang sah.
Langkah 5: Satukan parsing dan normalisasi header
Selesaikan pembingkaian pada satu batas parsing dan teruskan permintaan terstruktur ke aplikasi. Aplikasi tidak boleh mem-parsing ulang header mentah atau mempercayai "panjang yang telah divalidasi" oleh proxy. Jika proxy menulis ulang permintaan, hapus kolom ambigu dan buat satu nilai panjang kanonikal dari body yang diteruskan; downstream tidak boleh melihat kolom yang usang.
HTTP/2 dan HTTP/3 memiliki lapisan frame yang berbeda, tetapi gateway menuju HTTP/1.1 dapat memunculkan kembali ambiguitas. Audit penggabungan header, buffering body, penanganan koneksi saat error, dan jalur penurunan versi di setiap titik translasi.
Langkah 6: Rancang pengujian yang aman
Di lingkungan terisolasi, tempatkan proxy depan sebelum echo backend yang mencatat ID permintaan, panjang yang di-parsing, dan urutan kedatangan. Cakup pengujian panjang yang bertentangan, duplikat, chunk tidak valid, downgrade HTTP/1.0, penggunaan kembali koneksi, waktu habis (timeout), dan percobaan ulang (retry) proxy. Pastikan (assert) setiap lapisan melihat jumlah permintaan, metode, path, dan panjang body yang sama persis.
Jangan pernah mengirimkan payload yang memiliki efek samping terhadap akun, pesanan, atau cache ke produksi. Gunakan shadow traffic, koneksi sintetis, dan endpoint hanya-baca (read-only); jika jalur riil harus diperiksa, nonaktifkan efek samping dan simpan log tingkat koneksi.
Langkah 7: Pantau, lakukan canary, dan rollback
Pantau kesalahan parser, respons 400/431 yang tidak normal, reset, timeout upstream, anomali batas pesan pada koneksi yang digunakan kembali, dan perbedaan jumlah permintaan antara WAF dan backend. Segmentasikan berdasarkan versi proxy, protokol, tenant, dan path agar satu node edge tidak tertutupi oleh nilai rata-rata.
Jalankan parser baru dalam mode bayangan (shadow) atau dengan persentase kecil terlebih dahulu. Hentikan jika terjadi lonjakan kesalahan parser, kegagalan klien sah, atau kehabisan koneksi. Lakukan rollback pada rute dan versi konfigurasi sambil tetap mempertahankan sakelar penolakan permintaan ambigu yang aman; kompatibilitas tidak boleh mengorbankan keamanan dengan mengizinkan parsing yang permisif.
Langkah 8: Kompleksitas dan komunikasi
Pembingkaian bersifat linear terhadap ukuran pesan saat membaca header dan body. Pengoptimalan penting bukanlah pemangkasan mikrodetik, melainkan memastikan setiap bita diproses oleh satu batas parsing normatif. Cantumkan aturan RFC, versi komponen, kebijakan koneksi, dan matriks pengujian dalam runbook.
Bagi audiens non-keamanan, gunakan analogi dua penerima yang menghitung jumlah halaman dalam amplop yang sama secara berbeda, lalu berikan tindakan yang dapat diverifikasi: tolak ambiguitas, satukan parser, tutup koneksi saat terjadi kesalahan, uji secara terisolasi, dan lakukan canary yang dapat di-rollback.
Contoh jawaban
Request smuggling adalah masalah batasan parser, bukan bug pada satu rute aplikasi tertentu. Front end mungkin berhenti pada Content-Length sementara backend melanjutkan membaca dengan Transfer-Encoding, meninggalkan bita yang dikendalikan penyerang sebagai permintaan berikutnya pada koneksi yang digunakan kembali. Saya akan menginventarisasi setiap parser dan titik translasi, menyelaraskannya dengan perilaku ketat RFC 9112, menolak sinyal panjang yang muncul bersamaan, duplikat, dan chunk tidak valid di edge, serta menutup koneksi setelah terjadi kesalahan parsing.
Saya akan menguji echo backend terisolasi terhadap proxy dengan panjang yang bertentangan, penggunaan kembali koneksi, retry, dan translasi protokol, serta memastikan jumlah permintaan, path, dan panjang body identik. Luncurkan dalam mode shadow dan canary sembari memantau kesalahan parser, reset, kegagalan klien sah, dan ketidaksesuaian jumlah permintaan. Jika terjadi pelanggaran, lakukan rollback pada rute dan versi tetapi tetap tolak permintaan yang ambigu.
Kesalahan umum
- Menyebutkan nama-nama serangan tanpa menjelaskan bita dan penggunaan kembali koneksi.
- Mengatakan "lebih utamakan Content-Length" atau "lebih utamakan Transfer-Encoding" daripada menolak ambiguitas.
- Mengambil nilai
Content-Lengthduplikat pertama atau terakhir. - Hanya memperbaiki aplikasi dan mengabaikan CDN, WAF, proxy, atau lapisan translasi.
- Menguji endpoint destruktif atau gagal memverifikasi kesamaan jumlah permintaan.
- Menggunakan kembali koneksi setelah kegagalan parsing dan membawa bita yang tersisa ke permintaan berikutnya.
- Mengasumsikan HTTP/2 atau HTTP/3 secara otomatis menghilangkan risiko gateway.
- Hanya memantau agregat kesalahan 5xx selama canary alih-alih membaginya berdasarkan protokol dan irisan klien.
Pertanyaan lanjutan
Apa yang harus terjadi jika Content-Length dan Transfer-Encoding ada secara bersamaan?
Tolak permintaan ambigu tersebut di bawah kebijakan parsing yang ketat dan biasanya tutup koneksi. Setiap proxy dan backend harus menerapkan aturan yang sama; satu lapisan tidak boleh memilih kolom yang berbeda lalu melanjutkan penerusan.
Apakah nilai Content-Length duplikat yang bernilai sama juga harus ditolak?
Menolak duplikat adalah kebijakan lintas-komponen yang paling aman kecuali seluruh rantai memiliki satu aturan penggabungan yang terdokumentasi. Selesaikan masalah kompatibilitas dengan daftar izin (allowlist) yang terkontrol dan pengujian, bukan dengan perilaku komponen yang independen.
Bagaimana Anda membuktikan bahwa klien normal tidak terganggu?
Inventarisasi versi protokol klien yang sah, pengkodean body, dan jalur proxy. Putar ulang dan buat simulasi sintetis dalam lingkungan terisolasi, lalu lakukan canary sembari memantau respons 4xx dari klien sah, reset, dan latensi. Lakukan rollback atau upgrade berdasarkan jenis klien alih-alih membuka kembali parsing yang permisif.
Apakah HTTP/2 sepenuhnya kebal?
Pembingkaian biner menghilangkan sebagian ambiguitas HTTP/1.1, tetapi gateway HTTP/2 ke HTTP/1.1 tetap membuat header dan body. Audit translasi, penggunaan kembali koneksi, dan parsing downstream daripada hanya mengandalkan protokol klien.
Mengapa koneksi harus ditutup setelah terjadi kesalahan parsing?
Penerima tidak dapat membuktikan apakah bita yang di-buffer milik permintaan saat ini atau berikutnya. Menutup koneksi akan membuang status yang tidak pasti dan mencegah kesalahan interpretasi pada koneksi yang digunakan kembali; ukur biaya dari rekoneksi tersebut.
Bagaimana Anda membedakan smuggling dari cache poisoning?
Smuggling adalah diskrepansi parsing batas pesan; cache poisoning menyimpan respons atau kunci yang dikendalikan penyerang. Smuggling dapat memfasilitasi terjadinya poisoning, tetapi pertama-tama satukan pembingkaian dan penanganan koneksi, lalu uji kunci cache, perutean, dan otorisasi secara terpisah.
Kolom audit apa saja yang Anda pertahankan?
Catat versi proxy dan backend, protokol, ID koneksi, hasil parsing, alasan penolakan, ringkasan header yang dinormalisasi, ID permintaan, dan status respons. Hindari mencatat body yang sensitif; kolom-kolom ini harus menghubungkan keputusan batasan pesan di setiap lapisan dengan penanganan akhirnya.