Dalam ekosistem pengembangan perangkat lunak backend, ekspresi reguler (Regular Expression atau Regex) adalah perkakas klasik yang diandalkan jutaan pengembang untuk memvalidasi format masukan data pengguna: memeriksa apakah alamat email memiliki tanda at dan domain yang sah, memastikan kata sandi memenuhi kombinasi alfanumerik, atau membersihkan tag berbahaya dari formulir komentar. Karena mesin regex telah terintegrasi secara bawaan di hampir semua bahasa pemrograman modern, pengembang kerap menyalin pola ekspresi rumit dari forum diskusi daring tanpa pernah menguji kompleksitas waktu eksekusinya.
Namun di balik kepraktisan pencocokan pola teks tersebut, tersimpan salah satu vektor serangan penolakan layanan paling mematikan bagi lingkungan runtime berbasis utas tunggal seperti Node.js: kerentanan Regular Expression Denial of Service (ReDoS). Berbeda dengan serangan penolakan layanan terdistribusi (DDoS) konvensional yang menuntut ribuan mesin botnet untuk membanjiri lalu lintas jaringan dengan gigabita data, serangan ReDoS dapat dilancarkan oleh satu penyerang amatir hanya dengan mengirimkan satu baris teks pendek berukuran kurang dari lima puluh karakter melalui formulir web biasa.
Terjebak dalam Labirin Komputasi Eksponensial
Akar malapetaka ReDoS bermuara pada cara kerja mesin pencocokan pola ekspresi reguler konvensional berbasis algoritma Nondeterministic Finite Automaton (NFA) dengan pelacakan balik (backtracking):
- Fenomena Pelacakan Balik Bencana (Catastrophic Backtracking): Ketika sebuah pola regex mengandung pengelompokan yang tumpang tindih dengan pengulangan ganda—seperti pola
^(a+)+$atau validasi email yang ceroboh—mesin NFA akan mengevaluasi setiap kemungkinan kombinasi karakter saat menemukan string masukan yang hampir cocok namun diakhiri oleh karakter yang salah (misalnyaaaaaaaX). Jumlah langkah komputasi yang dibutuhkan mesin regex untuk memastikan ketidakcocokan tersebut melonjak secara eksponensial: string dengan tiga puluh karakter dapat memicu miliaran langkah evaluasi yang memakan waktu puluhan menit kalkulasi prosesor murni. - Pembekuan Total Siklus Event Loop Node.js: Karena Node.js menjalankan kode JavaScript dalam satu utas utama (single-threaded event loop), eksekusi regex yang terjebak dalam pelacakan balik eksponensial akan menyedot seratus persen daya satu core CPU dan memblokir thread tersebut secara penuh. Selama operasi regex berjalan, server Node.js tidak dapat memproses permintaan HTTP lain, tidak dapat mengeksekusi callback basis data, dan tidak dapat mengirimkan respons ke pengguna sah mana pun (server freezing).
- Efek Rantai Kelumpuhan pada Infrastruktur Klaster: Jika penyerang menyisipkan string beracun tersebut ke dalam parameter pencarian yang diproses oleh banyak instansi server di balik load balancer, seluruh replika pod server akan membeku satu per satu dalam hitungan detik. Layanan pelanggan ambruk total tanpa ada peringatan lalu lintas data yang mencurigakan di firewall jaringan.
Menegakkan Ketahanan Validasi Melalui Mesin Pencocok Linear
Mencegah serangan ReDoS menuntut disiplin penulisan pola dan pemanfaatan mesin pencocok berbasis waktu linear:
- Gunakan Mesin Regex Berbasis Deterministic Finite Automaton (DFA): Gantikan mesin regex bawaan dengan pustaka pencocokan pola berbasis automata terhingga deterministik (seperti RE2 dari Google). Mesin DFA menjamin bahwa waktu pencocokan string selalu berjalan dalam kompleksitas waktu linear O(N) terhadap panjang teks masukan, secara matematis mengeliminasi risiko pelacakan balik bencana tanpa memandang seberapa jahat struktur teks yang dikirimkan penyerang.
- Audit Pola Regex Menggunakan Perkakas Penganalisis ReDoS: Sebelum memasukkan pola ekspresi reguler baru ke dalam repositori kode produksi, jalani audit otomatis menggunakan perkakas analisis statis (seperti
safe-regexatau plugin ESLint anti-ReDoS). Hindari penulisan klausa pengulangan bersarang (nested quantifiers) dan pastikan setiap cabang disjungsi memiliki karakter batas yang tegas dan tidak ambigu. - Terapkan Batasan Waktu Eksekusi dan Pemangkasan Panjang Input: Jangan pernah memproses string teks masukan pengguna yang belum dipotong panjang maksimalnya. Terapkan validasi awal yang membatasi panjang teks maksimal (misalnya maksimal dua ratus lima puluh karakter untuk alamat email) dan bungkus operasi regex dengan mekanisme batas waktu (execution timeout) ketat agar thread dilepaskan secara paksa jika kalkulasi melebihi lima puluh milidetik.
Keamanan sistem enterprise tidak hanya diuji dari ketebalan enkripsi data di cakram penyimpanan, melainkan dari kehati-hatian insinyur memperlakukan setiap baris kode pencocokan teks di gerbang masukan. Menolak pola regex yang rapuh adalah benteng esensial demi menjaga ketersediaan layanan publik Anda tetap prima.



