Node.js 20 tidak akan mendapatkan pembaruan apa pun pada 11 November 2026. Rilis keamanan yang diluncurkan hanya mencakup versi 26.x, 24.x, dan 22.x, karena Node.js 20 telah mencapai akhir masa pakai (End-of-Life) pada 30 April 2026. Patch terakhir Anda adalah versi 20.20.2 yang dirilis pada 24 Maret. Sejak saat itu, 33 CVE telah diterbitkan tanpa adanya build untuk versi 20.x. Segera beralih ke versi 24 atau 26 minggu ini.
Ke-33 CVE tersebut berasal dari tiga rilis keamanan yang mengabaikan Node.js 20. Rilis keempat tinggal menghitung hari, dan pra-pengumuman resminya menilai kerentanan terparah berada pada tingkat keparahan TINGGI (HIGH) di semua lini versi yang masih didukung.
Ada apa dengan 11 November, dan mengapa Node.js 20 ditinggalkan
Proyek Node.js akan meluncurkan build terbaru untuk 26.x, 24.x, dan 22.x pada atau segera setelah hari Rabu, 11 November 2026. Rincian CVE belum dibuka untuk publik dan akan tetap dirahasiakan hingga build tersebut resmi dirilis. Panduan hitung mundur rilis November kami telah mengulas inventaris runtime serta perintah-perintah penting pada hari rilis patch, sehingga artikel ini tidak akan membahasnya kembali.
Node.js 20 tidak ada dalam daftar karena proyek ini sudah berhenti memeliharanya. Halaman resmi End-of-Life menyatakannya secara gamblang: ketika rilis keamanan baru mengungkap kerentanan, “meskipun kerentanan yang sama berdampak pada lini rilis EOL, tidak akan ada rilis baru untuk versi tersebut.”
Pemberitahuan keamanan tersebut menambahkan satu kalimat penting yang perlu Anda perhatikan: “Versi End-of-Life selalu terdampak setiap kali rilis keamanan diterbitkan.”
Apa saja yang sudah terlewatkan oleh Node.js 20
Tiga rilis keamanan telah diterbitkan sejak Node.js 20 memasuki masa End-of-Life. Tak satu pun menyediakan build untuk 20.x.
| Pemberitahuan | CVE | Tinggi | Sedang | Rendah | Diperbaiki di |
|---|---|---|---|---|---|
| 18 Juni 2026 | 12 | 2 | 6 | 4 | 26.3.1, 24.17.0, 22.23.0 |
| 29 Juli 2026 | 11 | 3 | 5 | 3 | 26.5.1, 24.18.1, 22.23.2 |
| 21 Oktober 2026 | 10 | 4 | 3 | 3 | 26.12.1, 24.22.1, 22.23.4 |
| Total | 33 | 9 | 14 | 10 | Tidak ada build 20.x |
Kode yang disentuh oleh perbaikan-perbaikan ini adalah kode yang dijalankan oleh server API setiap saat:
- Pemeriksaan hostname TLS. Rilis Juni dan Oktober sama-sama memperbaiki celah yang memungkinkan sertifikat diterima untuk host yang salah.
- HTTP/2. Perbaikan berisiko tinggi pada bulan Juli mencakup kerentanan heap use-after-free dan bug kehabisan memori secara remote (remote memory exhaustion).
- DNS. Rilis Oktober memperbaiki masalah
dns.resolve*()yang memotong hostname pada byte NUL, yang dapat mengelabui allowlist. - Kompresi. Rilis Oktober memperbaiki penulisan di luar batas (out-of-bounds write) pada dekoder Brotli yang dapat berujung pada eksekusi kode jarak jauh (remote code execution). Kami mengulasnya dalam pemeriksaan RCE Brotli.
Cermati daftar tersebut dengan baik. Pengembang Node.js tidak lagi mengevaluasi lini rilis yang sudah End-of-Life, sehingga laporan keamanannya hanya mencantumkan versi yang masih didukung. Sebagian dari bug ini mungkin berada pada kode yang bahkan tidak ada di Node.js 20: salah satu CVE di bulan Oktober adalah regresi yang menurut tim pengembang hanya berdampak pada 26.x dan 24.x saja. Jadi, status sebenarnya dari setiap CVE pada Node.js 20 adalah belum ditambal dan belum dinilai (unpatched and unassessed). Tidak ada yang menjamin sistem Anda aman, dan tidak akan ada yang memeriksanya.
Rangkaian kerentanan (bug chains) membuat situasi ini semakin mengkhawatirkan. Perbaikan DNS di bulan Oktober melengkapi perbaikan dari bulan Juni, dan perbaikan di bulan Juli melengkapi perbaikan lain dari bulan Juni. Setiap patch baru dibangun di atas patch sebelumnya yang tidak Anda miliki.

“Tetapi aplikasinya masih berfungsi dengan baik”
Memang. Dan justru itulah masalahnya.
Runtime yang sudah End-of-Life tidak langsung rusak atau berhenti berfungsi. Perintah node -v tetap mencetak versi yang sama, pengujian (test) tetap lolos, dan dasbor pemantauan Anda tetap berwarna hijau. Namun, risiko sebenarnya muncul di tempat-tempat yang tidak Anda pantau:
- Patch itu sendiri adalah peta bagi penyerang. Perbaikan, laporan keamanan, dan commit kode dipublikasikan secara bersamaan, sehingga siapa pun dapat menganalisis apa saja yang diubah pada versi yang didukung dan memeriksa apakah kode rentan serupa ada di Node.js 20.
- Platform Anda mungkin tetap mengizinkan deployment. AWS Lambda telah menandai
nodejs20.xsebagai usang (deprecated) sejak 30 April 2026, tetapi mereka tidak memblokir pembuatan fungsi baru hingga 29 Juli 2027, atau pembaruan hingga 31 Agustus 2027. - Ekosistem paket dan standar audit terus melangkah maju. Tim proyek Node.js memperingatkan bahwa paket-paket populer secara bertahap menghentikan dukungan untuk versi End-of-Life, dan berbagai audit kepatuhan industri melarang penggunaan runtime yang tidak lagi mendapatkan pemeliharaan.
Pilih versi tujuan: Node.js 24 atau 26, jangan 22
Beralihlah ke versi 24 minggu ini jika Anda membutuhkan jalur migrasi tercepat. Pilih versi 26 jika Anda siap menangani penghapusan API yang lebih banyak sekarang dan menginginkan masa dukungan terpanjang. Lewati versi 22: meskipun versi ini mendapatkan patch bulan November, masa dukungannya berakhir pada 30 April 2027—kurang dari enam bulan lagi—sehingga Anda harus mengulangi proyek migrasi ini lagi menjelang musim semi.
| Lini | Status | Terbaru per 5 Nov | Dukungan berakhir | Paling cocok untuk |
|---|---|---|---|---|
| 26.x “Lithium” | Active LTS sejak 28 Okt 2026 | 26.13.0 | 30 Apr 2029 | Layanan yang dapat diuji ulang secara menyeluruh sekarang |
| 24.x “Krypton” | Maintenance LTS sejak 20 Okt 2026 | 24.22.2 | 30 Apr 2028 | Jalur keluar teraman dan tercepat dari versi 20 |
| 22.x “Jod” | Maintenance LTS | 22.23.4 | 30 Apr 2027 | Kurang layak untuk sasaran migrasi saat ini |
Tanggal-tanggal di atas mengacu pada jadwal rilis Node.js. Pastikan kompatibilitas platform Anda sebelum memulai. Di AWS Lambda, misalnya, runtime Node.js 26 masih berstatus public preview dan belum dicakup oleh SLA Lambda, sehingga versi 24 adalah target yang lebih aman untuk lingkungan produksi saat ini.

Langkah migrasi dan potensi perubahan yang merusak (breaking changes)
Seluruh rangkuman pada tabel ini bersumber dari catatan rilis resmi untuk 22.0.0, 24.0.0, 25.0.0, dan 26.0.0, serta panduan migrasi v22 ke v24. Ini adalah poin-poin penting bagi layanan API, bukan daftar perubahan (changelog) secara keseluruhan.
| Diperkenalkan di | Perubahan | Dampaknya pada |
|---|---|---|
| 22 | import ... assert { type: 'json' } dihapus; gunakan with |
Kode ESM yang mengimpor JSON |
| 22 | crypto.createCipher() dan createDecipher() dihapus |
Kode enkripsi lama (legacy) |
| 23 dan 24 | Biner bawaan 32-bit Windows atau 32-bit armv7 Linux ditiadakan; macOS minimal versi 13.5 | Host lama dan perangkat edge |
| 24 | OpenSSL 3.5 pada security level 2: kunci RSA, DSA, dan DH di bawah 2048 bit, kunci ECC di bawah 224 bit, serta RC4 dilarang | mTLS dan sistem upstream lama |
| 24 | tls.createSecurePair dihapus; url.parse() mengalami runtime-deprecation |
Kode jaringan lama |
| 24 | Kepatuhan fetch() lebih ketat, validasi AbortSignal, error pada stream dan pipe kini melempar exception (throw) |
Klien HTTP, proksi |
| 24 | V8 13.6; addon mungkin memerlukan C++20 | Modul native |
| 25 (jika menargetkan 26) | SlowBuffer serta fs.F_OK, R_OK, W_OK, X_OK dihapus; Corepack tidak lagi disertakan |
Utilitas lama, Yarn atau pnpm melalui Corepack |
| 25 (jika menargetkan 26) | Alamat IP sebagai servername TLS dialihkan ke status End-of-Life |
Klien yang terhubung langsung menggunakan alamat IP |
| 26 | Modul _stream_* dan writeHeader() dihapus; module.register() mengalami runtime-deprecation; Undici 8 |
Kode stream lama, loader kustom |
Poin OpenSSL adalah hal yang kerap menimbulkan masalah tanpa disadari. Kode aplikasi Anda tidak mengalami perubahan apa pun, namun proses handshake dengan sistem mitra lama tiba-tiba gagal saat runtime.
Di branch terpisah, perbarui .nvmrc, blok engines, Dockerfile, dan konfigurasi CI Anda ke versi target (untuk instalasi di lingkungan baru, rujuk panduan instalasi Node.js). Kemudian lakukan instalasi ulang agar modul native terkompilasi ulang, pindai API yang telah dihapus, jalankan codemod resmi, lalu jalankan layanan dengan pelacakan depresiasi aktif:
nvm install 24 && nvm use 24
rm -rf node_modules && npm ci
grep -rnE "assert \{ *type|createCipher\(|createDecipher\(|url\.parse\(|fs\.[FRWX]_OK|SlowBuffer|createSecurePair|_stream_[a-z]+|module\.register\(" \
--include="*.js" --include="*.mjs" --include="*.ts" --exclude-dir=node_modules .
npx codemod run @nodejs/import-assertions-to-attributes
npx codemod run @nodejs/crypto-createcipheriv-migration
npx codemod run @nodejs/tls-create-secure-pair-to-tls-socket
npx codemod run @nodejs/fs-access-mode-constants
NODE_OPTIONS="--trace-deprecation" npm start
Tinjau hasil codemod secara manual. Modifikasi untuk createCipher perlu diperhatikan secara seksama: kode hasil generasinya tidak dapat mendekripsi data yang sebelumnya dienkripsi menggunakan API lama, sehingga Anda perlu merencanakan migrasi data bila ada data terkait.
Dokumentasi Node.js belum memiliki panduan resmi untuk migrasi dari versi 24 ke 26, jadi manfaatkan catatan rilis versi 25.0.0 dan 26.0.0 untuk langkah tersebut.
Pastikan perilaku API tetap konsisten di versi baru
Unit test tidak mampu menunjukkan bagaimana stack TLS dan klien HTTP baru menangani lalu lintas data riil. Untuk lonjakan dua atau tiga versi mayor, Anda memerlukan perbandingan langsung sebelum dan sesudah migrasi pada layanan yang aktif—tugas yang sangat ideal untuk diserahkan kepada coding agent Anda.
Apidog CLI memungkinkan Claude Code, Codex, atau Cursor menjalankan test suite Apidog Anda langsung dari terminal. Cukup konfigurasikan sekali:
npm install -g apidog-cli@latest
apidog login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com # pick your agent when prompted
Kemudian berikan prompt berikut kepada agent Anda:
My service runs on Node.js 20 in staging. Run Apidog test suite <suiteId> in project
<projectId> against environment <envId> and save reports to reports/node20. When I
redeploy on Node.js 24, run the same suite into reports/node24. List every request
whose status, body, or TLS behavior changed. Then read the service logs for deprecation
warnings and check each failure against the 22, 24, and 25 release notes: removed APIs,
changed defaults, stricter fetch and AbortSignal handling, OpenSSL key size rejections.
Agent akan menjalankan test suite yang identik di kedua sisi tahapan migrasi:
apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
-r cli,junit --out-dir reports/node20
# redeploy the service on the target line, restart it
apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
-r cli,junit --out-dir reports/node24
Ada dua hal mendasar agar hasil perbandingan tetap akurat:
- Jangan pernah menggunakan flag
-k. Flag tersebut menonaktifkan validasi SSL, yang justru akan menyembunyikan kegagalan TLS yang sebenarnya sedang Anda lacak. - Sertakan panggilan keluar yang dilakukan layanan Anda ke upstream. Penolakan oleh OpenSSL akan tampak sebagai error API pada endpoint yang bergantung pada sistem mitra lama, jadi ujilah jalur-jalur tersebut juga, bukan hanya endpoint
/health.
Begitu migrasi berhasil lolos pengujian, pertahankan langkah ini di pipeline Anda. Rincian alur kerjanya tersedia di panduan CI/CD Apidog CLI, dan penyiapan agent dapat disimak di panduan langkah demi langkah Claude Code.
Jika Anda belum bisa melakukan migrasi minggu ini
Beli build yang telah ditambal. Halaman End-of-Life Node.js mencantumkan tiga mitra resmi melalui OpenJS Ecosystem Sustainability Program. HeroDevs menyediakan layanan Never-Ending Support yang disertai patch keamanan. Endless Lifecycle Support dari TuxCare menyediakan backport perbaikan untuk versi-versi End-of-Life. NodeSource menawarkan asesmen pembaruan serta dukungan teknis. Komunitas proyek menegaskan bahwa ini adalah solusi sementara, dan memang demikian adanya.
Persempit akses menuju proses aplikasi. Langkah-langkah mitigasi berikut membantu menekan eksposur terhadap kategori bug di atas, meski tidak menuntaskan masalah secara permanen:
- Lakukan terminasi TLS dan HTTP/2 pada reverse proxy atau load balancer yang terawat, lalu gunakan HTTP/1.1 standar saat meneruskan ke Node.js di jaringan privat.
- Hentikan proses dekompresi Brotli dari sumber yang tidak tepercaya, baik pada request yang masuk maupun konten yang di-fetch.
- Tolak hostname yang memuat byte NUL atau representasi IP non-standar sebelum masuk ke pemeriksaan allowlist atau pemanggilan ke luar.
- Isolasi layanan: terapkan kredensial berprinsip hak akses terendah (least privilege), batasi lalu lintas egress, dan hindari berbagi rahasia (shared secrets) dengan layanan yang sudah diperbarui.
Dokumentasikan risikonya. Tentukan penanggung jawab, tetapkan tenggat migrasi, dan rancang mitigasi cadangan, agar status “sementara” tersebut benar-benar memiliki kepastian akhir.
FAQ
Apakah Node.js 20 masih didukung? Tidak. Node.js 20 telah mencapai masa End-of-Life pada 30 April 2026. Build terakhirnya adalah 20.20.2 tertanggal 24 Maret 2026, dan pihak proyek tidak akan merilis pembaruan lagi.
Apakah Node.js 20 rentan terhadap bug pada rilis 11 November? Rincian CVE belum dibuka ke publik, sehingga belum dapat dipastikan kerentanan mana saja yang berkaitan. Namun, laporan keamanan resmi menyatakan bahwa versi End-of-Life selalu terdampak setiap kali rilis keamanan diterbitkan, dan pengembang tidak lagi mengevaluasi versi tersebut satu per satu.
Haruskah saya meng-upgrade ke Node.js 22 saja? Tidak disarankan. Versi ini memang menawarkan lonjakan terkecil, tetapi masa dukungannya berakhir pada 30 April 2027. Migrasi ke 24 memberi Anda tambahan dukungan satu tahun, sedangkan versi 26 memberi Anda tambahan dua tahun.
Pilih Node.js 24 atau 26? Pilih 24 jika Anda harus keluar dari versi 20 minggu ini atau platform Anda belum sepenuhnya mendukung 26. Pilih 26 jika Anda dapat menguji ulang seluruh sistem sekarang, karena masa aktifnya berlangsung hingga 30 April 2029.
Saya menggunakan Node.js 25. Apakah hal ini berlaku untuk saya? Ya. Node.js 25 telah memasuki masa End-of-Life pada 1 Juni 2026 dengan 25.9.0 sebagai build penutupnya. Versi ini juga tidak akan menerima patch November, dan Anda hanya terpaut satu versi mayor untuk beralih ke 26.
