Celah Keamanan Node.js: Menguak Symlink Bypass (CVE-2025-55130) dan Memory Leak (CVE-2025-55131)
Celah Keamanan Node.js: Menguak Symlink Bypass (CVE-2025-55130) dan Memory Leak (CVE-2025-55131)
Node.js merupakan runtime JavaScript paling populer untuk membangun aplikasi backend. Menjaga keamanan runtime ini sangat penting karena ia mengeksekusi kode langsung di tingkat sistem operasi server. Di awal tahun 2026, tim keamanan Node.js merilis pengumuman penting terkait dua celah keamanan berisiko tinggi (high-severity) yang dilacak sebagai CVE-2025-55130 dan CVE-2025-55131.
Kedua celah keamanan ini menargetkan dua komponen yang sangat sensitif: sistem pembatasan akses file (Permission Model) dan alokasi memori internal. Artikel ini akan membahas secara mendalam bagaimana celah ini bekerja dan cara mengamankan aplikasi Node.js Anda.
1. Symlink Bypass pada Permission Model (CVE-2025-55130)
Sejak Node.js versi 20, diperkenalkan sebuah fitur eksperimental bernama Permission Model. Fitur ini memungkinkan developer membatasi akses aplikasi terhadap sistem file menggunakan argumen CLI seperti --allow-fs-read dan --allow-fs-write. Tujuannya adalah untuk sandbox aplikasi agar jika terjadi kebocoran kode, peretas tidak bisa membaca file sensitif seperti /etc/passwd atau file konfigurasi .env.
# Contoh menjalankan Node.js dengan batasan hanya boleh membaca folder public
node --experimental-permission --allow-fs-read=/var/www/html/public app.js
Namun, celah keamanan CVE-2025-55130 merusak sistem proteksi ini. Penyerang dapat mem-bypass batasan sistem file tersebut dengan menggunakan Symbolic Link (Symlink).
Jika aplikasi Anda mengizinkan pengguna mengunggah atau membuat file yang kemudian diproses oleh server, penyerang bisa membuat symlink yang mengarah ke file sensitif di luar folder yang diizinkan (misalnya mengarahkan symlink di dalam `/public` ke `/etc/passwd`). Karena Node.js gagal memverifikasi path asli (real path) dari target symlink secara benar sebelum membacanya, server akan membaca dan mengekspos isi file terlarang tersebut.
2. Kebocoran Memori Sensitif via Uint8Array/Buffer (CVE-2025-55131)
Celah keamanan kedua, CVE-2025-55131, berkaitan dengan kebocoran informasi melalui alokasi memori buffer.
Di Node.js, class Buffer dan Uint8Array digunakan untuk menangani data biner mentah. Biasanya, saat membuat buffer baru, Node.js akan mengalokasikan ruang memori. Jika memori tersebut tidak dibersihkan atau diinisialisasi ulang dengan benar (uninitialized memory), memori tersebut mungkin masih berisi sisa-sisa data dari operasi program sebelumnya, seperti token API, password, atau session cookie milik user lain.
Celah ini terjadi karena adanya kondisi race condition berbasis timeout pada operasi I/O asinkron. Akibat bug ini, buffer memori yang dikembalikan ke program tidak sepenuhnya bersih dan mengandung fragmen data sensitif dari memory space aplikasi. Jika buffer tersebut kemudian dikirimkan kembali ke client atau ditulis ke dalam log aplikasi (application logging), kredensial penting server Anda dapat bocor ke publik tanpa disadari.
Versi Node.js yang Terdampak
Kedua celah keamanan ini berdampak pada beberapa versi rilis aktif Node.js. Berikut adalah daftar versi yang terpengaruh dan versi minimal yang aman:
| Lini Rilis Node.js | Versi Terdampak | Versi Aman (Rekomendasi) |
|---|---|---|
| Node.js v20 (LTS) | < v20.11.1 | v20.11.1 atau lebih baru |
| Node.js v21 | < v21.6.2 | v21.6.2 atau lebih baru |
| Node.js v22 (LTS Terbaru) | < v22.1.0 | v22.1.0 atau lebih baru |
Cara Mengamankan Node.js Anda
1. Update Versi Node.js Segera
Jika Anda menggunakan Node Version Manager (NVM), Anda dapat memperbarui versi Node.js Anda dengan perintah mudah berikut:
# Install versi LTS terbaru (misalnya v20)
nvm install 20
# Gunakan versi baru tersebut
nvm use 20
# Atur sebagai default
nvm alias default 20
2. Hindari Penggunaan Permission Model di Produksi
Ingatlah bahwa Permission Model di Node.js masih berstatus Eksperimental. Dokumentasi resmi Node.js menyarankan untuk tidak mengandalkan fitur ini sebagai satu-satunya benteng pertahanan keamanan di lingkungan produksi. Lebih baik gunakan sandbox tingkat OS seperti container Docker dengan hak akses user non-root.
3. Validasi Path Unggahan File
Jika aplikasi Anda menerima unggahan file, pastikan untuk menolak file bertipe symlink atau gunakan fungsi library untuk mengecek real path sebelum membacanya:
const fs = require('fs');
const path = require('path');
// Selalu resolve path asli untuk mendeteksi symlink luar
fs.realpath(uploadedFilePath, (err, resolvedPath) => {
if (err) throw err;
if (!resolvedPath.startsWith('/var/www/html/public')) {
console.error('Deteksi upaya bypass akses sistem file!');
// Tolak akses...
}
});
Kesimpulan
Celah keamanan CVE-2025-55130 dan CVE-2025-55131 menunjukkan pentingnya menjaga kebersihan kode dalam pengelolaan file dan alokasi memori. Pastikan runtime Node.js di server production Anda diperbarui secara berkala untuk meminimalkan risiko eksploitasi oleh pihak yang tidak bertanggung jawab.
"Dalam dunia pengembangan backend, mengamankan runtime tempat kode berjalan sama pentingnya dengan mengamankan kode logika aplikasi itu sendiri."