FlawOpen

flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection

● CVE-2022-31150 · CVSS 5.3 · Sedang
Riset Keamanan · FlawOpen

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.

💡 Penjelasan Sederhana (ELI5)

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

Langkah 1

1. Nilai tak tepercaya

Data aplikasi mencapai header, metode, atau path Undici.

Langkah 2

2. Validasi tidak ada

Pada versi terdampak, karakter kontrol tidak valid dapat masuk ke konstruksi permintaan.

Langkah 3

3. Batas protokol

Serialisasi HTTP menggunakan batas baris; menerima karakter kontrol dapat menyisipkan atau merusak field.

Langkah 4

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

IMPLEMENTASI RENTAN
// 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`;
  }
}
PERBAIKAN AMAN & KUAT
// 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

Sumber