flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection
CVE-2022-31150: injeksi CRLF di Undici
CVE-2022-31150 memungkinkan CR/LF tak tepercaya masuk ke serialisasi permintaan Undici. Pelajari perbaikan upstream dan cara memperbarui.
Permintaan HTTP seperti formulir dengan batas baris tetap: setiap baris berisi satu kolom. Jika teks disalin tanpa diperiksa, baris baru tersembunyi dapat membuat teks berikutnya tampak sebagai kolom baru. Perbaikan Undici memvalidasi nilai header, metode, dan path sebelum menuliskannya.
Konsep Kunci & Istilah
Undici- Pustaka klien HTTP/1.1 untuk Node.js; Node.js juga menyertakan implementasi Undici untuk fetch bawaan.
Injeksi CRLF- Byte carriage return dan line feed yang tidak tepercaya masuk ke field protokol dan dapat mengubah batas baris.
Token HTTP- Kumpulan karakter terbatas untuk elemen protokol seperti nama header dan metode.
Target permintaan- Path dan kueri yang dikirim dalam permintaan HTTP; karakter kontrol tidak boleh mengubah strukturnya.
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-93
Analisis Akar Masalah (Root Cause)
Sebelum diperbaiki, Undici dapat menserialisasi nilai header yang dipengaruhi masukan tak tepercaya dan mengandung karakter kontrol tidak valid ke dalam permintaan HTTP. CR/LF adalah pemisah baris; menerimanya dapat menyisipkan atau merusak baris header. Patch upstream memvalidasi nama sebagai token HTTP, menolak karakter nilai yang tidak valid, memvalidasi token metode, dan melarang karakter kontrol pada path. Pemberitahuan GitHub mencantumkan versi paket sebelum 5.8.0; deskripsi NVD menyebut sebelum 5.7.1. Keduanya menetapkan 5.8.0 sebagai versi yang diperbaiki. Ini adalah injeksi permintaan pada klien; SSRF atau kebocoran kredensial bukan akibat otomatis dan bergantung pada aplikasi serta jalur jaringan.
Alur Serangan Langkah demi Langkah
1. Nilai tak tepercaya
Data aplikasi mencapai header, metode, atau path Undici.
2. Validasi tidak ada
Pada versi terdampak, karakter kontrol tidak valid dapat masuk ke konstruksi permintaan.
3. Batas protokol
Serialisasi HTTP menggunakan batas baris; menerima karakter kontrol dapat menyisipkan atau merusak field.
4. Perbaikan dan pembatasan
Undici 5.8.0 memvalidasi byte header, token metode, dan karakter path sebelum serialisasi; dampak bergantung pada konteks.
Kode Sumber: Rentan vs Aman
// Titik serialisasi terkait di lib/core/request.js sebelum a29a151
function serializeRequest(request, method, path, headers) {
request.method = method;
request.path = path;
for (const [key, value] of Object.entries(headers)) {
// Karakter protokol tidak divalidasi sebelum serialisasi.
request.headers += `${key}: ${value}\r\n`;
}
}
// Pola validasi yang diperkuat dari parser permintaan upstream
const token = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
const invalidFieldValue = /[^\t\x20-\x7e\x80-\xff]/;
const invalidPath = /[^\u0021-\u00ff]/;
function validateRequestTarget(method, path) {
if (!token.test(method)) throw new InvalidArgumentError('invalid request method');
if (invalidPath.test(path)) throw new InvalidArgumentError('invalid request path');
}
function processHeader(request, key, value) {
if (!token.test(key)) throw new InvalidArgumentError('invalid header key');
if (invalidFieldValue.test(value)) throw new InvalidArgumentError(`invalid ${key} header`);
request.headers += `${key}: ${value}\r\n`;
}
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui dependensi npm undici ke 5.8.0 atau lebih baru; untuk fetch bawaan, periksa versi Undici dalam rilis Node.js yang didukung dan patch Node.js.
- ✓Tolak karakter kontrol tidak valid pada nilai header yang tidak tepercaya; jangan diam-diam menghapusnya lalu memproses masukan yang ambigu.
- ✓Gunakan API permintaan terstruktur Undici alih-alih merangkai teks HTTP mentah.
- ✓Tambahkan tes regresi untuk nama dan nilai header, metode, serta path yang berisi karakter kontrol; pastikan ditolak sebelum permintaan dikirim.
- ✓Jika aplikasi menerima tujuan dari pengguna, terapkan juga daftar tujuan yang diizinkan dan kebijakan egress jaringan; ini pertahanan berlapis, bukan perbaikan CVE.
- ✓Periksa lockfile dan dependensi transitif agar salinan Undici yang rentan tidak tersisa.