Pada 22 September 2026, tim keamanan Vercel merilis pembaruan out-of-band untuk Next.js — sesuatu yang jarang terjadi di luar jadwal rilis rutin. Alasannya serius: sebuah kerentanan kritis bernama CVE-2026-94545 (GHSA-vcvr-r3jv-pc5j) memungkinkan Remote Code Execution (RCE) tanpa autentikasi dan tanpa interaksi pengguna, bersembunyi di salah satu fitur yang paling jarang diperhatikan tim keamanan: generator gambar pratinjau Open Graph. Bagi ekosistem web Indonesia, di mana Next.js kini menjadi pilihan arus utama untuk company profile, situs e-commerce, hingga produk SaaS — sebagaimana dicatat blog teknis Biznetgio sebagai framework yang dianggap "paket lengkap untuk React production" — kerentanan ini layak dibedah tuntas, bukan sekadar ditambal lalu dilupakan.
Apa itu next/og dan ImageResponse?
Hampir setiap kali sebuah tautan dibagikan di WhatsApp, X, atau LinkedIn, platform tersebut menampilkan kartu pratinjau berisi judul, deskripsi, dan gambar. Next.js menyediakan modul bawaan bernama next/og dengan komponen ImageResponse untuk menghasilkan gambar Open Graph (OG) itu secara dinamis — misalnya judul artikel blog atau nama produk yang dirender otomatis menjadi gambar, tanpa desainer perlu membuatnya manual satu per satu.
Di balik layar, ImageResponse mengandalkan pustaka pihak ketiga bernama Satori untuk mengubah markup JSX (mirip komponen React biasa) menjadi dokumen SVG, yang kemudian dirasterisasi menjadi gambar PNG. Proses inilah yang menjadi akar masalah.
Anatomi kerentanan: ketika SVG lupa "mencuci tangan"
Menurut advisori resmi Vercel dan Satori, versi Satori sebelum 0.33.5 gagal melakukan escaping yang benar terhadap nilai yang disisipkan ke dalam keluaran SVG. Dalam praktiknya, developer sering menulis kode seperti ini — mengambil parameter dari URL untuk ditampilkan sebagai judul gambar OG:
// route.tsx — pola umum yang berisiko
import { ImageResponse } from 'next/og';
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const title = searchParams.get('title') ?? 'Judul Default';
return new ImageResponse(
(
<div style={{ fontSize: 64, color: 'white' }}>
{title}
</div>
)
);
}
Secara desain, nilai title di atas berasal dari input yang sepenuhnya dikendalikan pengunjung — siapa pun bisa mengubah parameter di URL. Karena Satori tidak membersihkan karakter khusus dengan benar sebelum menyisipkannya ke dokumen SVG, sebuah nilai yang dirancang khusus dapat "kabur" dari konteks teks biasa dan diinterpretasikan sebagai markup SVG yang hidup. Pada implementasi Node.js dari ImageResponse, markup yang lolos ini dapat memicu eksekusi kode pada proses server — bukan sekadar merusak tampilan gambar.
Yang membuat kerentanan ini bernilai CVSS v4 9.5 (kritis) bukan hanya dampaknya, melainkan juga betapa mudahnya dieksploitasi: serangan dapat dilakukan sepenuhnya dari jarak jauh, tanpa perlu login, dan tanpa perlu korban mengklik apa pun. Rute gambar OG memang sengaja dibuat publik dan bisa diakses tanpa autentikasi — karena crawler media sosial (WhatsApp, Facebook, X) perlu mengambilnya tanpa proses login. Itulah kenapa fitur yang terkesan kosmetik ini justru menjadi permukaan serangan dengan kompleksitas rendah.
Sejauh laporan yang beredar per akhir September 2026, belum ada konfirmasi eksploitasi aktif di alam liar, namun kode proof-of-concept sudah dipublikasikan di GitHub tak lama setelah advisori dirilis — jendela antara disclosure dan eksploitasi nyata umumnya sangat singkat untuk kerentanan sekritis ini, sehingga menunggu bukan strategi yang bijak.
Ada satu lapisan lagi yang membuat kasus ini menarik dari sudut pandang manajemen rantai pasok perangkat lunak (software supply chain): Satori bukan bagian dari kode inti Next.js, melainkan dependensi pihak ketiga yang dipakai next/og di balik layar. Artinya, tim yang rajin memantau CVE untuk paket next saja bisa saja melewatkan advisori ini bila hanya memindai nama paket tingkat atas, karena akar masalah sesungguhnya berada dua atau tiga lapis lebih dalam di pohon dependensi. Pola ini konsisten dengan tren yang berulang sepanjang 2026: kerentanan kritis semakin sering muncul bukan dari kode yang ditulis tim internal, melainkan dari dependensi transitif yang jarang diaudit satu per satu.
Versi terdampak dan cara menambal
Next.js versi 16.2.0 hingga sebelum 16.3.6 terdampak RCE ini, khusus pada implementasi ImageResponse berbasis Node.js. Implementasi berbasis Edge runtime menggunakan jalur rendering berbeda dan tidak terdampak oleh celah RCE ini. Next.js 15.x juga tidak rentan terhadap RCE-nya, namun tetap mendapat pembaruan 15.5.26 sebagai pengerasan tambahan.
Untuk Next.js 16.x:
npm install next@16.3.6
Untuk Next.js 15.x (hardening):
npm install next@15.5.26
Bila pembaruan langsung belum memungkinkan — misalnya karena proses pengujian regresi internal — Vercel menyarankan mitigasi sementara: alihkan rute ImageResponse yang terdampak untuk berjalan di Edge runtime, yang tidak menggunakan jalur rendering Node.js yang rentan:
export const runtime = 'edge'; // mitigasi sementara sebelum upgrade
Penting dicatat: validasi input semata tidak cukup sebagai solusi permanen, karena kegagalan escaping terjadi di dalam logika internal Satori saat menyusun SVG, bukan semata di kode aplikasi. Upgrade dependensi tetap menjadi langkah wajib, bukan opsional.
Kenapa ini relevan untuk developer dan perusahaan di Indonesia
Next.js telah menjadi salah satu framework JavaScript favorit di kalangan developer Indonesia untuk membangun company profile, toko online, hingga aplikasi SaaS modern, sebagian besar karena kemudahan setup dan fitur produksi yang sudah tersedia dari awal (routing, server-side rendering, optimasi gambar). Fitur next/og khususnya populer di kalangan tim pemasaran digital karena memungkinkan pembuatan kartu pratinjau media sosial otomatis untuk setiap artikel blog atau halaman produk — sesuatu yang sangat umum dipakai UMKM digital dan startup lokal untuk mendongkrak click-through rate dari media sosial.
Masalahnya, rute OG image sering kali berada di luar radar tim keamanan karena dianggap sekadar "fitur tampilan", bukan permukaan serangan. Ditambah lagi, banyak proyek menahan versi dependensi (version pinning) demi stabilitas dan baru memperbarui saat ada kebutuhan fitur baru — pola yang berulang kali muncul dalam insiden-insiden yang sudah dibahas di blog ini, mulai dari zero-day WordPress hingga Magento. Tim yang tidak memantau advisori keamanan framework secara aktif berisiko menjalankan versi rentan selama berbulan-bulan tanpa disadari.
Situasi ini diperparah oleh kenyataan bahwa banyak tim produk di Indonesia mendelegasikan urusan konten kartu pratinjau sepenuhnya kepada tim pemasaran atau agensi eksternal, yang menambahkan parameter judul/deskripsi dinamis ke URL gambar OG tanpa berkoordinasi dengan tim engineering yang memahami implikasi keamanannya. Akibatnya, saluran komunikasi antara siapa yang "memakai" fitur dan siapa yang "bertanggung jawab menambalnya" sering terputus — celah organisasi yang sama berbahayanya dengan celah teknis itu sendiri.
Dimensi hukum: dari bug kosmetik ke kewajiban notifikasi
RCE yang berhasil dieksploitasi berarti penyerang berpotensi memperoleh akses penuh ke proses server aplikasi — termasuk kredensial basis data, sesi pengguna, dan data pribadi pelanggan yang diproses aplikasi tersebut. Bila hal ini terjadi pada layanan yang menyimpan data pribadi, Pasal 46 UU Pelindungan Data Pribadi (UU PDP No. 27/2022) mewajibkan pemberitahuan tertulis kepada subjek data dan otoritas terkait paling lambat 3x24 jam sejak insiden diketahui. Kewajiban ini sejalan dengan tenggat kepatuhan penuh PP 33/2026 pada 16 Januari 2027 yang semakin dekat.
Di sisi lain, pihak yang secara sengaja mengeksploitasi kerentanan ini untuk mengakses sistem tanpa hak berpotensi dijerat Pasal 30 UU ITE tentang akses ilegal. Bagi tim keamanan internal atau konsultan yang melakukan pengujian, penting memastikan pengujian kerentanan ini dilakukan hanya pada lingkungan milik sendiri atau dengan otorisasi tertulis yang jelas dari pemilik sistem.
Panduan mitigasi
Berikut langkah konkret yang bisa segera diambil tim engineering:
- Perbarui segera ke Next.js 16.3.6 (jalur 16.x) atau 15.5.26 (jalur 15.x), lalu jalankan uji regresi singkat pada rute yang memakai
ImageResponse. - Audit seluruh rute OG image di proyek Anda — termasuk yang dibuat tim pemasaran atau melalui template pihak ketiga, karena penggunaan
next/ogkerap tidak terdokumentasi rapi di luar tim inti. - Terapkan mitigasi Edge runtime sementara pada rute yang belum sempat ditambal, sambil menunggu jadwal deployment berikutnya.
- Periksa log akses rute OG image untuk pola permintaan anomali (payload SVG tak lazim, parameter dengan karakter kontrol) sejak pertengahan September 2026.
- Tinjau kebijakan pembaruan dependensi — aktifkan Dependabot/Renovate dan pantau langsung buletin keamanan resmi Vercel (security@vercel.com) alih-alih menunggu siklus rilis rutin.
- Siapkan playbook notifikasi insiden yang selaras dengan tenggat 3x24 jam UU PDP, khususnya bagi organisasi yang aplikasinya memproses data pribadi pelanggan dalam jumlah besar.
Kerentanan CVE-2026-94545 adalah pengingat bahwa permukaan serangan modern tidak selalu terletak di halaman login atau formulir input yang jelas terlihat. Fitur "kecil" seperti generator gambar pratinjau media sosial, yang dirancang untuk publik dan tanpa autentikasi, bisa menjadi pintu masuk paling mulus bagi penyerang justru karena jarang dicurigai. Bagi tim web Indonesia yang terus memperluas adopsi Next.js, disiplin memantau advisori keamanan framework inti sama pentingnya dengan menulis fitur baru itu sendiri.

