flawopen.com/ReDoS/JavaScript RegExp
Apakah JavaScript RegExp rentan terhadap ReDoS?
Bayangkan petugas mencoba semua cara membagi tumpukan formulir saat tanda terakhir hilang: pola ambigu dapat membuat mesin regex memeriksa ulang karakter yang sama berkali-kali. Jalur RegExp V8 yang umum dapat melakukan backtracking seperti ini; batasi input dan gunakan pola dengan biaya yang dapat diperkirakan. Di Node, pencocokan sinkron berjalan pada thread event loop sehingga callback lain dalam proses tertunda. V8 mendokumentasikan mesin eksperimental tanpa backtracking yang diaktifkan lewat flag dan memiliki batasan pola; jangan anggap fitur ini aktif pada Node produksi.
// Pengulangan bersarang ambigu pada data permintaan
const re = /^(\w+\s?)*$/;
app.post('/search', (req, res) => {
const q = req.body.q;
if (!re.test(q)) return res.sendStatus(400);
res.sendStatus(200);
});
// Batasi input dan terima hanya tata bahasa field
app.post('/search', (req, res) => {
const q = req.body.q;
if (typeof q !== 'string' || q.length > 128)
return res.sendStatus(400);
// Contoh tata bahasa: karakter kata ASCII dan spasi
if (!/^[\w ]{1,128}$/.test(q))
return res.sendStatus(400);
res.sendStatus(200);
});
Mengapa Node.js memperbesar dampak ReDoS
Pencocokan regex sinkron berjalan pada thread JavaScript yang menangani callback dalam proses Node.js. Jika pola memerlukan waktu lama pada input yang hampir cocok atau gagal, event loop tidak dapat menjalankan callback lain atau memproses permintaan sampai pencocokan selesai. Worker, beberapa proses, atau replika dapat mempertahankan sebagian kapasitas, tetapi proses yang terdampak tetap dapat macet.
Dampak bergantung pada keterjangkauan, kompleksitas pola, batas input, dan topologi deployment. Penyerang harus mencapai pencocokan rentan dengan input yang memicu jalur mahal. Perlakukan ini sebagai risiko ketersediaan proses terdampak; gangguan seluruh layanan bergantung pada worker, replika, routing, dan health check.
Kasus nyata npm: CVE-2026-83606 pada xmldom
Advisory yang ditinjau untuk @xmldom/xmldom melaporkan CWE-1333 pada parsing processing instruction: grammar rentan memungkinkan grup whitespace greedy dan grup data lazy memakai whitespace yang sama. Jika penutup ?> tidak ada, parser mencoba banyak pembagian dan waktunya tumbuh kuadratik. Versi 0.9.0-beta.9 sampai 0.9.10 terdampak; 0.9.11 mencegah separator mengembalikan whitespace ke grup data. Advisory membatasi masalah pada jalur paket berscope 0.9.x; versi 0.8.x dan paket tanpa scope tidak dinyatakan terdampak.
Pemindaian dependensi membantu, tetapi bukan bukti keamanan regex
npm audit melaporkan advisory yang diketahui dan cocok dengan dependensi pada pohon proyek; alat ini tidak menganalisis setiap regex dalam source atau menemukan ReDoS yang belum dipublikasikan. Perbarui dependensi langsung dan transitif, tinjau jalur pemanggilan terdampak, dan periksa terpisah pola yang memproses teks dari pengguna.
npm audit --omit=dev
Audit mencakup advisory yang diketahui, bukan semua risiko regex. Tinjau laporan sesuai deployment dan periksa secara terpisah apakah input tidak tepercaya dapat mencapai pencocokan mahal serta apakah ukurannya dibatasi.
Pertanyaan umum
API RegExp tidak menyediakan timeout per pencocokan. Gunakan pola sederhana dan batasi input sebelum pencocokan. Jika pencocokan kompleks diperlukan, isolasikan pada worker atau proses anak dengan tenggat penghentian yang dapat ditegakkan; ini membatasi dampak, bukan membuat polanya efisien.
Ya. Pencocokan sinkron yang bermasalah dapat membekukan main thread halaman sampai selesai dan memblokir UI. Batasi input, sederhanakan pola, dan hindari pencocokan mahal pada setiap ketikan.
Perlakukan pola dari pengguna sebagai input yang dapat membebani matcher. Jangan menerima pola arbitrer di server tanpa batas ketat dan isolasi. Jika hanya perlu pencarian literal, escape input sebagai regex literal atau gunakan API pencarian string; escaping tidak menggantikan batas ukuran.
Referensi dan perbaikan
- Advisory GitHub — CVE-2026-83606 pada @xmldom/xmldom
- xmldom — catatan rilis 0.9.11
- Node.js — jangan memblokir event loop (ReDoS)
- V8 — mesin RegExp non-backtracking dan batasannya
- npm — audit dependensi
- CWE-1333 — kompleksitas regex tidak efisien