Jawaban langsung: CVE-2026-111497, yang juga disebut Node2Shell atau Brotli2Shell, adalah celah out-of-bounds write di decoder Brotli 1.0.3 sampai 1.2.0. Aplikasi yang membuka data Brotli dari luar bisa crash, membocorkan memori, atau menjalankan kode penyerang. CISA KEV memasukkan celah ini ke daftar celah yang sudah dieksploitasi pada 27 Oktober 2026. Update Node.js hari ini ke 22.23.4, 24.22.1, atau 26.12.1.

Node.js bukan satu-satunya produk yang terdampak. Decoder yang sama ada di Bun, paket Python brotli dan brotlicffi, .NET 8 sampai 11, Envoy, Istio, dan paket libbrotli1 di Debian dan Ubuntu.

Kondisi utama: Node.js dari nodejs.org, nvm, dan image Docker resmi membawa decoder sendiri, jadi Anda update Node.js. Node.js dari apt Ubuntu dan Debian memakai library sistem, jadi Anda update libbrotli1. Batas: Langkah sementara di artikel ini hanya mengurangi paparan. Artikel ini tidak memuat kode eksploit.

Kami membaca advisory Node.js 21 Oktober, rilis Brotli 1.2.1, advisory .NET 25 Oktober, advisory PyPI, halaman CVE Ubuntu, tracker Debian, dan CISA KEV pada 30 Oktober 2026, sekitar pukul 20.30 WIB. Perintah di langkah 1 sampai 5 kami jalankan di container podman dengan image resmi Node.js 24.22.0 dan 24.22.1, Ubuntu 24.04, Python 3.13, .NET runtime 8.0.32 dan 8.0.33, serta nginx 1.29 pada tanggal yang sama. Server uji tidak memuat data pelanggan.

Masalah: update Node.js saja belum menutup semua jalur

Celah ini ada di library, bukan di satu aplikasi. Server yang sudah update Node.js bisa tetap rentan lewat Python, .NET, atau library sistem.

Menurut Tenable, Google memasang perbaikan di kode sumber Brotli pada 27 Februari 2026. Node.js dan Google baru merilis versi dengan patch pada 21 Oktober 2026. Sehari kemudian, peneliti menjalankan kode di image Node.js 24.22.0 resmi. Pada 26 Oktober, ELLIO mencatat percobaan eksploitasi ke Node.js 24.22.0 di x86-64.

Ada 2 jebakan lain. Pertama, process.versions.brotli menulis 1.2.0 di Node.js yang rentan dan di Node.js yang sudah ditambal. Uji kami di langkah 1 menunjukkan hasil yang sama dengan catatan ELLIO. Kedua, proses yang berjalan sebelum update tetap memakai decoder lama sampai proses itu di-restart.

Check Point menulis pada 29 Oktober bahwa tim keamanan tidak boleh menutup insiden sesudah patch Node.js saja. Inventaris harus mencakup runtime, paket bahasa, proxy, service mesh, container, dan software yang membawa library Brotli sendiri.

Linimasa 27 Februari sampai 10 November 2026: perbaikan Google, rilis Node.js, CVE terbit, patch distro dan .NET, percobaan serangan ELLIO, CISA KEV, CSA, dan batas patch CISA.
Titik abu-abu: rilis patch. Titik merah: bukti eksekusi kode, percobaan serangan, dan keputusan lembaga keamanan. Percobaan serangan pertama yang dilaporkan datang 5 hari sesudah patch Node.js. Sumber: Tenable, Node.js, Ubuntu, Debian, Microsoft, ELLIO, CISA KEV, dan CSA.

Bulan ini kami juga membahas celah PHP2Shell dan celah GitLab CVSS 10. Pola yang sama muncul lagi: jarak dari patch ke percobaan serangan hanya beberapa hari. Untuk celah ini, jaraknya 5 hari.

Cara kerja: data Brotli yang rusak membuat decoder menulis melewati buffer

Decoder salah membaca data rusak sebagai data yang belum lengkap. Akibatnya, decoder terus menulis ke buffer kecil sampai melewati batasnya.

Bagian ini memakai ringkasan dari advisory resmi. Tujuannya membantu Anda memilih langkah yang tepat, bukan menjelaskan cara menyerang.

Ringkasan dari advisory Node.js

Menurut advisory Node.js 21 Oktober, block switch yang tidak valid dilaporkan sebagai kebutuhan input tambahan, bukan sebagai error format. Decoder streaming terus menambah byte input ke buffer internal 8 byte, lalu menulis melewati ujung buffer itu (CWE-787). CISA menamai celah ini "Google Brotli Unchecked Return Value Vulnerability".

Node.js memberi level High dan menulis bahwa celah ini bisa menjalankan kode dari jarak jauh. Cabang 22, 24, dan 26 terdampak. Cabang 20, 23, dan 25 juga terdampak, tetapi sudah habis masa dukungan dan tidak mendapat patch.

Skor dari setiap lembaga

Skor berbeda per sumber, jadi tulis skor bersama sumbernya. NVD memberi CVSS 3.1 9.8. Google sebagai CNA memberi CVSS 4.0 9.2. Microsoft memberi 8.1 untuk .NET, karena dekompresi Brotli di .NET mati secara default.

Kartu merah CVE-2026-111497 yang sudah dieksploitasi, daftar 6 produk yang membawa decoder Brotli, skor NVD 9.8, dan kotak teal: update runtime dan library, lalu restart.
(1) Kartu merah: celah di decoder dan akibatnya. (2) Kartu amber: produk yang membawa decoder yang sama. (3) Baris skor: setiap lembaga memberi skor sendiri. (4) Kotak teal: hanya update dan restart yang menutup celah. Sumber: Node.js, Google Brotli, Microsoft, NVD, dan CISA KEV.

Status eksploitasi per 30 Oktober

CISA KEV memasukkan celah ini pada 27 Oktober 2026 berdasarkan bukti eksploitasi aktif. ELLIO mencatat 1 request Brotli sekitar 23 MB ke Node.js 24.22.0 pada 26 Oktober, pukul 15.08 UTC. Dalam 50 percobaan di lab ELLIO, rantai penyerang itu belum menghasilkan shell.

Check Point melaporkan bahwa 90,5% event di telemetrinya membawa payload HTTP berkode Brotli, dan 24,5% menyasar endpoint upload. Tenable belum mengonfirmasi aktivitas yang dilaporkan ELLIO secara mandiri. CSA Singapura meminta patch segera pada 30 Oktober 2026.

Siapa yang paling berisiko

Aplikasi yang membuka body request atau respons berkode Brotli dari pihak luar paling berisiko. Server MCPMCPAturan standar yang memungkinkan program AI memakai alat dan data Anda dengan izin yang jelas.Buka glosarium, chatbot, dan backend APIAPIPintu resmi yang dipakai 2 sistem untuk saling mengirim data, tanpa orang menyalin data secara manual.Buka glosarium di Node.js sering memakai Express dan fetch(), jadi masuk kelompok ini.

Tabel ini merangkum Aikido, ELLIO, advisory .NET 25 Oktober, dan Tenable.

Cara aplikasi memakai BrotliRisikoYang Anda update
Express 5 atau body-parser 2 menerima body Content-Encoding: brTinggiNode.js
Koa 3 dengan @koa/bodyparser 6Tinggi, diuji ELLIONode.js
fetch() ke URL dari pengguna, webhookWebhookPesan otomatis yang sebuah sistem kirim ke sistem lain tepat saat sesuatu terjadi, misalnya pesan WhatsApp masuk.Buka glosarium, scraper, atau agen AITinggi, proxy tidak menahanNode.js
zlib.brotliDecompress pada berkas uploadTinggiNode.js
Python requests, urllib3, atau httpx dengan paket brotli terpasangTinggi bila URL dari luarpip brotli atau brotlicffi
ASP.NET Core atau HttpClient dengan dekompresi br aktifBila diaktifkanRuntime .NET, publish ulang NativeAOT
Envoy atau Istio dengan filter decompressor BrotliBila diaktifkanEnvoy atau Istio
Node.js dari apt Ubuntu atau DebianIkut library sistemlibbrotli1, lalu restart
Enam kartu risiko: Express 5, fetch ke URL luar, dan zlib Brotli di upload berisiko tinggi, Python dan .NET bila Brotli aktif, node:http polos rendah, lalu perintah cek.
Kartu merah: aplikasi membuka data Brotli dari luar secara otomatis. Kartu amber: risiko muncul bila paket atau pengaturan Brotli aktif. Kotak bawah: 2 perintah untuk mencari paket dan kode yang membuka Brotli. Sumber: Node.js, Aikido, ELLIO, Microsoft, dan Tenable.

Server node:http polos tidak membuka body Brotli sendiri, menurut Aikido. Tetap update, karena paket di node_modules bisa membukanya tanpa Anda sadari.

Versi yang sudah memuat patch

Update setiap produk ke versi minimum di tabel ini atau versi yang lebih baru di cabang yang sama.

ProdukVersi minimum amanCatatan
Node.js 2222.23.4Binary resmi, nvm, image Docker
Node.js 2424.22.1Binary resmi, nvm, image Docker
Node.js 2626.12.1Binary resmi, nvm, image Docker
Node.js 20, 23, 25Tanpa patchPindah ke 22, 24, atau 26
Bun1.4.4Build ulang executable hasil compile
Google Brotli1.0.10, 1.1.1, 1.2.1Aplikasi yang membawa library sendiri
pip brotli / brotlicffi1.2.1 / 1.2.1.0Setiap virtualenv dan image
.NET 8 / 9 / 108.0.33 / 9.0.22 / 10.0.14Publish ulang aplikasi self-contained dan NativeAOT
Envoy1.36.12, 1.37.8, 1.38.6, 1.39.3Bila decompressor Brotli aktif
Istio1.29.9, 1.30.6, 1.31.2Bila dekompresi Brotli aktif
Tabel versi minimum aman untuk Node.js, Bun, library Brotli, pip, dan .NET, kotak versi libbrotli1 Ubuntu dan Debian, dan catatan bahwa process.versions.brotli tidak berubah.
Kolom teal: versi target. Baris merah: cabang Node.js tanpa patch. Kanan atas: paket distro. Kanan bawah: alasan kenapa versi Brotli di dalam Node.js bukan bukti aman. Sumber: Node.js, Google Brotli, PyPI, Microsoft, Ubuntu, dan Debian.

Untuk paket distro, pakai versi dari halaman CVE Ubuntu dan tracker Debian. Menurut kedua sumber itu, paket nodejs dari apt di Ubuntu 22.04 ke atas dan di Debian memakai library sistem, jadi update libbrotli1 menutup celah di Node.js itu.

Rilislibbrotli1 dengan patch
Ubuntu 22.04 LTS1.0.9-2ubuntu0.1
Ubuntu 24.04 LTS1.1.0-2ubuntu0.1
Ubuntu 26.04 LTS1.2.0-3ubuntu0.1
Debian 12 (bookworm)1.0.9-2+deb12u1
Debian 13 (trixie)1.1.0-2+deb13u1

PHP juga punya jalur. Menurut Tenable, build PHP resmi untuk Windows terdampak lewat ekstensi cURL bila dekompresi otomatis aktif, dengan patch di 8.2.35-1, 8.3.36-1, 8.4.27-1, dan 8.5.12-1. PHP di Linux mengikuti library sistem atau ekstensi PHP brotli, yang ditambal di 0.21.1.

Prasyarat sebelum mulai

  • Akses SSH dengan hak sudo ke server, atau akses docker exec ke container.
  • Daftar semua tempat Node.js, Python, dan .NET berjalan: server, CI runner, image container, dan fungsi serverless.
  • Akses ke repo aplikasi untuk mengubah Dockerfile, package.json, dan requirements.txt.
  • Jadwal restart singkat untuk setiap layanan.
  • Akses baca ke log nginx atau load balancer, journal systemd, dan PM2.

Bila Anda baru memasang Node.js di server, baca dulu panduan install Node.js di Linux. Panduan itu menjelaskan perbedaan Node.js dari apt, NodeSource, dan nvm.

Langkah 1: Cek versi Node.js di setiap server, CI runner, dan container

Simpan skrip ini sebagai cek-node.sh. Skrip membaca versi Node.js dan cara build-nya, lalu membandingkan versi dengan patch untuk cabangnya.

command -v node >/dev/null || { echo "Node.js tidak terpasang di mesin ini."; exit; }
v=$(node -p process.versions.node)
if [ "$(node -p process.config.variables.node_shared_brotli)" = "true" ]; then
  echo "$v: memakai Brotli sistem. Cek libbrotli1 di langkah 2."; exit; fi
case ${v%%.*} in
  22) fix=22.23.4;; 24) fix=24.22.1;; 26) fix=26.12.1;;
  *) echo "$v: cabang tanpa patch. Pindah ke Node.js 22, 24, atau 26."; exit;;
esac
lt() { [ "$1" != "$2" ] && [ "$(printf '%s\n' "$1" "$2" | sort -V | head -1)" = "$1" ]; }
if lt "$v" "$fix"; then echo "$v: RENTAN CVE-2026-111497. Update ke $fix."
else echo "$v: memuat patch Brotli (minimum $fix)."; fi

Jalankan skrip di server, di container yang berjalan, dan di image sebelum deploy.

bash cek-node.sh                                        # server atau CI runner
docker exec -i nama-container bash < cek-node.sh        # container yang berjalan
docker run --rm -i --entrypoint bash node:24.22.0 < cek-node.sh   # image sebelum deploy
Terminal: cek di Node.js 24.22.0 mencetak RENTAN, di 24.22.1 memuat patch, process.versions.brotli menulis 1.2.0 di keduanya, dan Node.js apt Ubuntu memakai Brotli sistem.
Baris 3 dan 4 adalah pelajaran utama: versi Brotli di dalam Node.js sama, walau satu rentan dan satu aman. Uji memakai image resmi node 24.22.0 dan 24.22.1 serta ubuntu 24.04. Sumber: uji Rama Digital di podman, 30 Oktober 2026.

Image berbasis Alpine tidak memuat bash. Untuk image itu, jalankan node -v, lalu bandingkan hasilnya dengan tabel versi. Untuk Bun, jalankan bun --version. Versi di bawah 1.4.4 rentan.

Cek hasil: Output menulis "memuat patch Brotli". Hasil "RENTAN" berarti Node.js harus update hari ini. Hasil "memakai Brotli sistem" berarti Anda lanjut ke langkah 2 untuk libbrotli1.

Langkah 2: Cek libbrotli1, paket Python, dan .NET

Simpan skrip ini sebagai cek-lib.sh. Skrip mengecek library sistem di Debian dan Ubuntu, paket pip brotli dan brotlicffi, dan runtime .NET.

lt() { [ "$1" != "$2" ] && [ "$(printf '%s\n' "$1" "$2" | sort -V | head -1)" = "$1" ]; }
# 1. Library Brotli sistem di Debian dan Ubuntu
. /etc/os-release
case $VERSION_CODENAME in
  jammy) fix=1.0.9-2ubuntu0.1;; noble) fix=1.1.0-2ubuntu0.1;; resolute) fix=1.2.0-3ubuntu0.1;;
  bookworm) fix=1.0.9-2+deb12u1;; trixie) fix=1.1.0-2+deb13u1;; *) fix=;;
esac
cur=$(dpkg-query -W -f='${Version}' libbrotli1 2>/dev/null)
if [ -z "$cur" ]; then :
elif [ -z "$fix" ]; then echo "libbrotli1 $cur: cek advisory distro Anda."
elif dpkg --compare-versions "$cur" lt "$fix"; then echo "libbrotli1 $cur: RENTAN. Update ke $fix."
else echo "libbrotli1 $cur: memuat patch."; fi
# 2. Paket Python brotli dan brotlicffi
for py in python3 python; do command -v $py >/dev/null && break; done
for pkg in brotli:1.2.1 brotlicffi:1.2.1.0; do
  v=$($py -c "import importlib.metadata as m; print(m.version('${pkg%%:*}'))" 2>/dev/null) || continue
  if lt "$v" "${pkg#*:}"; then echo "pip ${pkg%%:*} $v: RENTAN. Update ke ${pkg#*:}."
  else echo "pip ${pkg%%:*} $v: memuat patch."; fi
done
# 3. Runtime .NET
dotnet --list-runtimes 2>/dev/null | while read -r name v rest; do
  case $v in 8.*) fix=8.0.33;; 9.*) fix=9.0.22;; 10.*) fix=10.0.14;; *) continue;; esac
  if lt "$v" "$fix"; then echo "$name $v: RENTAN. Update ke $fix."
  else echo "$name $v: memuat patch."; fi
done
bash cek-lib.sh                                  # server
source .venv/bin/activate && bash cek-lib.sh     # virtualenv Python
docker exec -i nama-container bash < cek-lib.sh  # container
Terminal: skrip cek library mencetak RENTAN untuk libbrotli1 1.1.0-2build2, pip brotli 1.2.0, dan .NET 8.0.32, lalu memuat patch untuk 1.1.0-2ubuntu0.1, 1.2.1, dan 8.0.33.
Setiap pasangan baris membandingkan versi lama dan versi baru dari image resmi yang sama. Uji memakai ubuntu 24.04, python 3.13-slim, dan dotnet/runtime 8.0.32 dan 8.0.33. Sumber: uji Rama Digital di podman, 30 Oktober 2026.

Skrip hanya mencetak baris untuk komponen yang ada di mesin itu. Untuk keluarga RHEL, jalankan rpm -q brotli dan bandingkan dengan advisory distro Anda. Untuk Envoy dan Istio, jalankan envoy --version atau istioctl version, lalu bandingkan dengan tabel versi.

Aplikasi .NET self-contained dan NativeAOT membawa decoder di dalam berkas aplikasinya. Menurut advisory .NET 25 Oktober, update runtime di mesin tidak memperbaiki aplikasi itu. Publish ulang aplikasi dengan paket yang sudah ditambal.

Cek hasil: Setiap baris menulis "memuat patch". Jalankan skrip di setiap virtualenv Python, karena setiap virtualenv punya paket pip sendiri.

Langkah 3: Update, lalu restart setiap proses

Update komponen yang rentan, lalu restart setiap proses yang memakainya. Pakai perintah yang sesuai dengan cara Anda memasang komponen.

# Node.js lewat nvm
nvm install 24.22.1 && nvm alias default 24.22.1
# Dockerfile: FROM node:24.22.1-bookworm-slim, lalu build ulang dengan image dasar baru
docker build --pull -t app:patch .
docker compose up -d --force-recreate
# Library sistem Debian dan Ubuntu
sudo apt update && sudo apt install --only-upgrade libbrotli1
# Paket Python
pip install -U 'brotli>=1.2.1' 'brotlicffi>=1.2.1.0'
# Bun
bun upgrade

Pakai tag image dengan versi lengkap, atau build ulang dengan --pull agar image dasar ikut baru. Aikido mencatat bahwa image dengan tag lama, contohnya node:24.22.0, tetap rentan sampai Anda build ulang. Untuk .NET, pasang runtime 8.0.33, 9.0.22, atau 10.0.14, lalu publish ulang aplikasi self-contained.

Sesudah update library sistem, simpan skrip ini sebagai cek-restart.sh. Skrip mencari proses yang masih memakai library Brotli lama dari memori.

n=0
for m in $(grep -l "libbrotli.*(deleted)" /proc/[0-9]*/maps 2>/dev/null); do
  p=${m#/proc/}; p=${p%/maps}; n=$((n + 1))
  echo "PID $p masih memakai Brotli lama: $(tr "\0" " " < /proc/$p/cmdline)"
done
echo "$n proses perlu restart."
sudo bash cek-restart.sh
sudo systemctl restart nama-layanan   # layanan systemd
pm2 reload all                        # aplikasi PM2
Terminal: apt mengganti libbrotli1 ke 1.1.0-2ubuntu0.1, skrip menemukan 1 proses node yang masih memakai library lama, lalu sesudah restart skrip mencetak 0 proses.
Proses yang berjalan sebelum update tetap memakai decoder lama dari memori. Update paket saja belum menutup celah sampai proses itu di-restart. Sumber: uji Rama Digital di podman, 30 Oktober 2026.
Tangga 6 langkah: update Node.js dan Bun, update library lain, dan restart proses, lalu 3 langkah berlabel belum aman: tolak body br, matikan dekompresi, cek tanda.
(1) sampai (3) Kotak teal: perbaikan yang menutup celah. (4) sampai (6): langkah sementara. Label merah mengingatkan bahwa langkah itu tidak membuat server aman. Sumber: Node.js, Microsoft, Tenable, dan Check Point.

Skrip itu hanya melihat library sistem. Node.js resmi membawa decoder di dalam binary node, jadi restart setiap layanan Node.js sesudah update. Fungsi serverless dan platform hosting butuh deploy ulang agar build memakai runtime baru.

Cek hasil: Ulangi langkah 1 dan 2. Semua baris menulis "memuat patch", dan cek-restart.sh menulis "0 proses perlu restart".

Langkah 4 (opsional): Tolak body Brotli sementara bila belum bisa update

Langkah ini hanya untuk jeda pendek sampai update selesai. advisory Node.js 21 Oktober tidak memberi workaround, dan Tenable menulis bahwa blokir di proxy tidak melindungi respons yang aplikasi ambil dari server luar.

Di nginx, tolak request dengan header Content-Encoding: br. Taruh baris if di blok server yang menerima API dan upload, lalu jalankan sudo nginx -t dan sudo systemctl reload nginx.

server {
    listen 80;
    # Tolak body Brotli sampai semua aplikasi di belakang proxy ditambal.
    if ($http_content_encoding ~* "\bbr\b") { return 415; }
    location / { return 200 "ok\n"; }
}

Di Express, tolak body Brotli sebelum express.json() dan parser lain membukanya.

// Tolak body Brotli sebelum body parser membukanya.
app.use((req, res, next) => {
  if (/\bbr\b/i.test(req.headers['content-encoding'] || '')) return res.status(415).send('Brotli tidak diterima');
  next();
});
app.use(express.json());
Terminal: nginx -t lolos, lalu nginx dan middleware Express 5.3.0 menjawab HTTP 415 untuk Content-Encoding br dan gzip, br, dan HTTP 200 untuk identity.
Body uji bukan data Brotli. Aturan menolak request hanya dari header, sebelum aplikasi membuka body. Uji memakai image nginx 1.29 dan node 24.22.1 dengan Express 5.3.0. Sumber: uji Rama Digital di podman, 30 Oktober 2026.

Di .NET, advisory .NET 25 Oktober meminta Anda membuang entri "br" dari DecompressionProviders dan membatasi AutomaticDecompression. Microsoft juga meminta Anda tidak menambah pengaturan dekompresi baru bila belum ada.

// ASP.NET Core: buang "br" dari DecompressionProviders yang sudah ada.
// HttpClient: buka hanya GZip dan Deflate.
var handler = new HttpClientHandler {
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};

Di Python, Tenable menyarankan copot paket brotli dan brotlicffi sampai versi baru terpasang. Tanpa paket itu, urllib3 dan requests tidak membuka respons Brotli. Di Envoy dan Istio, matikan filter decompressor Brotli untuk 2 arah. Menghapus br dari header Accept-Encoding saja belum menutup jalur.

Cek hasil: Request dengan Content-Encoding: br mendapat HTTP 415. Request tanpa Brotli tetap mendapat HTTP 200.

Langkah 5: Periksa tanda server sudah disentuh

Serangan yang gagal sering membuat proses crash. Serangan yang berhasil bisa tanpa jejak di log. Simpan skrip ini sebagai cek-tanda.sh dan jalankan dengan sudo di server nginx.

log() { zcat -f /var/log/nginx/access.log*; }
echo "IoC ELLIO   : $(log | grep -cE "node2shell-check|94\.154\.43\.7")"
echo "Ditolak 415 : $(log | awk "\$9 == 415" | wc -l)"
echo "Error 5xx   : $(log | awk "\$9 >= 500" | wc -l)"

Lalu cek crash, restart, dan proses anak untuk periode sejak 21 Oktober 2026.

sudo journalctl --since 2026-10-21 | grep -ciE 'node.*(segfault|sigsegv|sigabrt)|core dumped'
coredumpctl list node --since 2026-10-21
pm2 list                                        # kolom ↺ adalah jumlah restart
docker inspect -f '{{.Name}} restart={{.RestartCount}}' $(docker ps -q)
ps -eo pid,ppid,user,etime,cmd --forest | grep -A3 '[n]ode'
Terminal: skrip cek tanda di log nginx mencetak 0 IoC ELLIO, 10 request ditolak 415, dan 0 error 5xx, lalu podman inspect menulis restart=0 untuk proxy dan api.
Angka 10 adalah request uji kami dari langkah 4. Di server Anda, angka 415 menunjukkan berapa body Brotli yang ditahan aturan sementara. Sumber: uji Rama Digital di podman, 30 Oktober 2026.
Dua kolom tanda serangan: di proses dan server, dan di log web dan proxy, lalu kotak merah berisi tindakan bila ada tanda: isolasi, ganti secret, dan bangun ulang.
Kolom amber: crash, restart beruntun, dan proses anak yang aneh. Kolom merah: body Brotli yang besar atau rusak, IoC dari ELLIO, dan pesan error dari versi yang sudah aman. Sumber: ELLIO, Check Point, dan Tenable.

Cari 4 pola dari ELLIO dan Check Point. Pertama, proses node yang crash, restart beruntun, atau core dump baru. Kedua, proses anak seperti sh, bash, atau curl di bawah proses node.

Ketiga, body Brotli yang besar atau rusak, terutama ke endpoint upload dan API. Keempat, IoC dari ELLIO: user agentAgent AIProgram AI yang mengerjakan langkah pekerjaan sendiri, misalnya membaca pesan, menyiapkan balasan, lalu mencatat hasilnya.Buka glosarium node2shell-check, alamat 94.154.43.7, dan error ERR__ERROR_FORMAT_BLOCK_SWITCH di versi yang sudah aman. Error itu menunjukkan bahwa seseorang sedang menguji server Anda.

Cek hasil: Hitungan IoC 0, tidak ada crash atau restart beruntun, dan tidak ada proses anak yang Anda tidak kenal. Bila ada tanda, isolasi server dan simpan log. Batasi akses ke core dump, karena ELLIO menulis bahwa core dump bisa memuat data sesi. Ganti semua secret yang bisa dibaca proses node: isi .env, API key, token database, dan token cloud.

Contoh: 1 malam respons untuk 4 layanan

Simulasi ini memakai data dummy. Nama layanan, waktu, dan hasil bukan data pelanggan.

Waktu (WIB)Layanan dummyYang dicekHasilTindakan
19.00api-toko (Docker node:24.22.0, Express 5)Langkah 1RENTANLangkah 4 di nginx, lalu build ulang ke 24.22.1
19.40bot-wa (nvm Node.js 22.23.3, fetch webhook)Langkah 1RENTANnvm install 22.23.4, pm2 reload all
20.10scraper-harga (Python 3.12, brotli 1.1.0)Langkah 2pip brotli RENTANpip install -U brotli, restart worker
20.30web-lama (Ubuntu 24.04, Node.js dari apt)Langkah 1 dan 2libbrotli1 RENTANapt upgrade, cek-restart.sh, restart 2 layanan
21.00api-tokoLangkah 53 restart beruntun pada 26 OktoberIsolasi, simpan log, ganti secret

Pelajaran dari simulasi: layanan yang mengambil URL dari luar tidak terlindungi oleh aturan nginx. Restart beruntun sebelum patch butuh pemeriksaan, bukan hanya update.

Siapa yang memasang patch

Tanggung jawab patch berbeda per cara hosting. Tabel ini membantu Anda tahu siapa yang harus bergerak hari ini.

Cara hostingPemegang patchYang Anda kerjakan
VPS atau server sendiriTim IT AndaLangkah 1 sampai 5
Container atau KubernetesTim yang mengelola imageGanti image dasar, build ulang, lalu langkah 1 dan 5
Serverless atau platform hostingPlatform dan tim AndaCek pengumuman platform, lalu deploy ulang
Aplikasi yang dikelola vendorVendorMinta bukti versi tertulis, lalu minta hasil langkah 5

Rekomendasi Rama Digital: bila server Node.js Anda memegang token pembayaran, token WhatsApp, atau API key model AI, perlakukan setiap tanda di langkah 5 sebagai insiden. Untuk server MCP, baca juga hak akses, approval, dan audit log server MCP.

Checklist hari ini

  1. Inventaris semua tempat Node.js, Bun, Python, dan .NET berjalan. Pemilik: tim DevOps. Bukti: daftar host, image, dan CI runner.
  2. Cek Node.js dengan langkah 1. Pemilik: admin server. Bukti: output skrip per host dan per image.
  3. Cek libbrotli1, pip, dan .NET dengan langkah 2. Pemilik: admin server. Bukti: output skrip per host dan per virtualenv.
  4. Update dan build ulang image. Pemilik: developer. Bukti: Dockerfile dan lockfile baru.
  5. Restart setiap proses. Pemilik: admin server. Bukti: output cek-restart.sh menulis 0.
  6. Pasang langkah 4 di layanan yang belum bisa update. Pemilik: admin nginx. Bukti: uji HTTP 415.
  7. Periksa tanda dengan langkah 5. Pemilik: admin server. Bukti: output perintah, disimpan bersama log.
  8. Berhenti bila semua komponen menulis "memuat patch" dan langkah 5 bersih. Bila ada tanda, hentikan kerja patch dan mulai respons insiden.

Pertanyaan yang sering muncul

Saya tidak memakai Express. Apakah saya tetap perlu update? Ya. fetch() membuka respons Brotli secara otomatis, dan paket lain di node_modules bisa membuka body Brotli. Update Node.js adalah satu-satunya perbaikan lengkap.

process.versions.brotli menulis 1.2.0. Apakah Node.js saya aman? Belum tentu. Node.js 24.22.0 yang rentan dan 24.22.1 yang aman sama-sama menulis 1.2.0. Cek versi Node.js dengan langkah 1.

Node.js saya dari apt Ubuntu. Apa yang harus saya update? Update paket libbrotli1, lalu restart layanan Node.js. Ubuntu menulis bahwa paket nodejs di 22.04 ke atas memakai library sistem.

Apakah blokir Content-Encoding br di nginx sudah menutup celah? Tidak. Blokir itu menahan body request dari luar. Respons yang aplikasi ambil dari server luar tetap dibuka oleh decoder.

Saya masih memakai Node.js 20. Kapan patch keluar? Tidak ada patch. Node.js 20, 23, dan 25 sudah habis masa dukungan. Pindah ke Node.js 22, 24, atau 26.

Apakah website PHP atau WordPress saya terdampak? Bisa, lewat library sistem atau ekstensi PHP brotli. Update libbrotli1 dan ekstensi brotli ke 0.21.1, lalu restart PHP-FPM.

Bagaimana saya tahu server sudah dibobol? Cari crash, restart beruntun, proses anak yang aneh, dan IoC di langkah 5. Log yang bersih tidak membuktikan server aman.

Langkah berikutnya

Batas yang tetap berlaku: update menutup celah ini, tetapi tidak menghapus akses yang mungkin sudah tertanam sebelum patch. Bila layanan Anda menunjukkan tanda di langkah 5, atau Anda butuh bantuan memeriksa image dan secret sesudah insiden, pakai Vibe Code Rescue untuk audit dan stabilisasi. Untuk 1 kendala yang mendesak hari ini, Jadwalkan sesi 30 menit.

Sumber