Fastjson 1.2.83 masih dapat memicu eksekusi kode jarak jauh tanpa gadget tradisional meskipun AutoType=false, telah direproduksi di lingkungan isolasi JDK 8/17/21/25 + Spring Boot Loader.Penulis artikel, sumber: GCSA
Ringkasan
Dalam sistem pertahanan kerentanan deserialisasi Java tradisional, industri umumnya memiliki celah pemahaman berikut: “AutoType dinonaktifkan secara default berarti aman”, “Mengunci parameter kedua parseObject (tipe target tingkat atas) berarti aman”, “Menghapus semua dependensi Gadget deserialisasi dari Classpath lokal berarti aman”. Namun, perkembangan terbaru dalam serangan dan pertahanan teknis benar-benar menghancurkan sikap optimis semacam ini.
GCSA Global Cybersecurity Alliance hari ini secara eksklusif merilis laporan wawasan teknis ini. Laporan ini mengulas secara mendalam akar penyebab eksekusi kode jarak jauh (RCE) yang dapat dipicu tanpa bergantung pada Gadget tradisional dalam Fastjson 1.2.83, meskipun AutoType=false dalam keadaan default. Saat ini, teknik eksploitasi ini telah berhasil direproduksi secara end-to-end di lingkungan isolasi JDK 8 / 17 / 21 / 25 serta Spring Boot Loader. Kerentanan ini bukanlah "bypass daftar hitam lalu mencari Gadget lokal" secara tradisional, melainkan secara langsung memutarbalikkan logika deteksi metadata Class Fastjson itu sendiri menjadi saluran untuk mengambil dan memberikan otorisasi terhadap Class jarak jauh yang jahat. Berikut adalah isi utama
Organisasi penerbit: GCSA Global Cybersecurity Alliance
Jenis laporan: Wawasan Teknis Eksklusif / Laporan Analisis Mendalam Kerentanan
Tanggal laporan: 2026-07-21
Laporan status: Audit kode sumber dan replikasi di lingkungan terisolasi telah selesai
Nomor kerentanan: Nomor penelitian internal FJ-GETRESOURCE-RCE (tidak sesuai dengan CVE yang telah dipublikasikan)
Fastjson 1.2.83 masih dapat memicu eksekusi kode jarak jauh tanpa gadget tradisional meskipun AutoType=false, telah direproduksi di lingkungan isolasi JDK 8/17/21/25 + Spring Boot Loader. Disarankan untuk segera mengaktifkan SafeMode dan bermigrasi ke Fastjson 2.x.
1. Ringkasan eksekutif
ParserConfig.checkAutoType pada Fastjson 1.2.83 akan mengonversi nilai @type yang dikendalikan pengguna menjadi nama sumber daya class, lalu menyerahkannya ke getResourceAsStream dari ClassLoader saat ini:

Dalam lingkungan ClassLoader fat-jar yang dapat menyelesaikan nama sumber daya URL absolut, penyerang dapat memanfaatkan penggantian titik untuk membangun URL http:, jar:http:, dan jar:file: guna mengunduh class jahat dengan @JSONType dari sisi serangan. Fastjson, setelah mendeteksi anotasi tersebut, akan memanggil loadClass dan langsung mengembalikan class tersebut sebelum melakukan pemeriksaan kelas dasar berbahaya dan kompatibilitas tipe tujuan. Saat class diinstansiasi dan diinisialisasi, kode sewenang-wenang dapat dieksekusi.
Eksploitasi ini tidak bergantung pada gadget deserialisasi tradisional yang sudah ada di classpath target, dan tetap dapat dipicu dalam keadaan default Fastjson AutoType=false. Menetapkan tipe target JSON.parseObject tidak dapat mencegah eksekusi; mengaktifkan SafeMode dapat memblokir jalur eksploitasi normal sebelum akses sumber daya.
Laporan ini telah direproduksi di dalam kontainer Linux terisolasi menggunakan payload JSON yang sama:

2. Peringkat kerentanan

Tidak disarankan untuk memberikan CVSS 9.8 yang seragam hanya berdasarkan versi komponen: AppClassLoader biasa adalah kontrol negatif, rantai lengkap JDK modern juga bergantung pada loader yang mampu menafsirkan dua URL JAR absolut dan /proc/self/fd. Dalam lingkungan positif yang memenuhi laporan ini, efek kerentanan adalah RCE jaringan tanpa otentikasi.
3. Lingkup dampak dan prasyarat
3.1 Lingkup telah dikonfirmasi
- Konfirmasi saat berjalan: Fastjson 1.2.83
- JDK dikonfirmasi: 8, 17, 21, 25
- Sistem operasi dikonfirmasi: Linux; macOS juga berhasil mereproduksi JDK 17/21/25 menggunakan /dev/fd
- loader konfirmasi: Spring Boot 2.7.18 classic loader + JDK 8; Spring Boot 3.2.0 loader + JDK 17/21/25
- API konfirmasi: JSON.parse, serta JSON.parseObject dengan tipe atas yang tetap
Version 3.2 Range Description
Versi 1.2.68–1.2.83 dalam deskripsi eksternal lebih sesuai sebagai rentang pengujian yang diketahui, bukan versi di mana kerentanan diperkenalkan. Pemeriksaan kode sumber menunjukkan bahwa kode deteksi sumber daya class yang menentukan sudah ada di versi 1.2.67 dan 1.2.68. Laporan ini hanya melakukan verifikasi lengkap lintas runtime JDK untuk versi 1.2.83.
3.3 Gunakan kondisi yang diperlukan
1. Penyerang dapat mengontrol JSON yang masuk ke Fastjson, dan @type dalam input akan diuraikan.
2. SafeMode tidak diaktifkan.
3. ClassLoader Fastjson dapat menyelesaikan nama sumber daya absolut yang dibangun menjadi URL.
4. Proses yang menjadi korban dapat terhubung ke layanan HTTP penyerang.
5. Linux moderna memerlukan /proc/self/fd dapat dibaca, dan loader mampu menafsirkan
jar:file:/proc/self/fd/N!...。
1. JDK perlu dapat membuat cache sementara JAR jarak jauh yang normal; ini biasanya berarti direktori sementara JVM dapat ditulis.
Penyerang tidak perlu:
- Menulis file ke classpath target
- Target classpath pre-installed with Gadgets such as TemplatesImpl, JNDI, C3P0, Commons Collections
- Aktifkan Fastjson AutoType
- Kontrol parameter kedua dari JSON.parseObject
4. Analisis Akar Penyebab
4.1 Nama jenis pengguna dianggap sebagai URL sumber daya
Lokasi kode sumber:

Kode inti:

Logika ini mengasumsikan resource hanya sebagai jalur classpath biasa, tetapi tidak membatasi protokolnya, semantik path absolut, atau sumbernya. Untuk fat-jar loader tertentu, input berikut akan menjadi URL absolut setelah penggantian:

Oleh karena itu, getResourceAsStream memuat sumber daya jaringan yang dapat dikendalikan penyerang akibat out-of-bounds dari kueri metadata lokal.
4.2 @JSONType pada class jarak jauh dianggap sebagai dasar otorisasi
Fastjson menggunakan ClassReader ASM miliknya sendiri untuk memparse konten sumber daya:

Serangan hanya memerlukan kelas jarak jauh yang memiliki anotasi @JSONType dari Fastjson untuk mengatur jsonType menjadi true. Pemeriksaan ini dilakukan terhadap byte yang disediakan oleh penyerang, bukan kelas yang telah dimuat oleh classpath yang dapat dipercaya.
4.3 jsonType memicu pemuatan kelas aktual
Lokasi kode sumber:
TypeUtils.loadClass secara berurutan mencoba loader eksplisit, loader konteks thread, dan Class.forName. Dalam lingkungan positif, loader konteks thread akan menafsirkan ulang nama sumber daya absolut yang sama, mengunduh class, dan menjalankan defineClass.
4.4 @JSONType Return early to bypass subsequent security checks
Lokasi kode sumber:
- Danger base class check will not be performed
- expectClass.isAssignableFrom(clazz) tidak akan dieksekusi
- Jenis ikatan data tetap tidak dapat mencegah eksekusi sebelum inisialisasi kelas
4.5 Gagal membentuk saluran lunak setelah Exception/Error
Lokasi kode sumber:
4.6 Lokasi SafeMode
Pemeriksaan SafeMode dilakukan sebelum akses sumber daya:
5. Penjelasan Mendalam tentang Chain
5.1 JDK 8: Muat class jarak jauh secara langsung
Format terpendek:
JDK 17+ juga akan menyelesaikan permintaan jaringan, tetapi menolak segmen path kosong dalam nama internal,
5.2 JDK Modern Tahap Pertama: Unduh JAR Jarak Jauh
Elemen pertama dari array payload tunggal:
JDK 17+ kemudian menolak nama internal jar: http://... pada tahap pertama, tetapi Fastjson terus memproses array karena akhiran Exception.
5.3 Tahap Kedua JDK Modern: Buka Kembali FD Cache
Elemen kandidat selanjutnya:
Log class-load JDK 17 yang pertama kali tercapai adalah:
5.4 Mengapa sebuah payload kompatibel dengan JDK 8 dan JDK modern
- JDK 8 secara langsung menerima jar tahap pertama: http://... class dan mengeksekusinya
- Setelah perintah class tahap pertama dieksekusi, secara sengaja melempar RuntimeException("stage-one-stop") untuk mencegah JDK 8 terus mencoba FD socket/pipe yang tidak relevan
- JDK 17+ gagal pada tahap pertama karena nama ilegal sebelum inisialisasi class, lalu kembali secara lembut melalui Exception ke tahap enumerasi FD
6. Lingkungan dan bukti replikasi
6.1 Hash komponen yang diuji
6.2 Reproduksi satu klik

Expected output:The script will:
- Compile victim fat jar;
- Buat JAR serangan dengan class khusus FD;
- Buat payload berupa array JSON;
- Menjalankan layanan HTTP penyerang di jaringan Docker terisolasi;
- Mulai kontainer yang terpengaruh untuk JDK 8/17/21/25;
- Periksa setiap peta kontainer ke /tmp/fastjson-getresource-rce.
6.3 Membuat JAR dan payload secara manual
6.4 Melalui Burp Suite
Burp hanya bertanggung jawab mengirim JSON ke antarmuka korban yang memiliki titik parsing Fastjson; JAR serangan masih harus disediakan oleh layanan HTTP pihak penyerang.
Request template:
Jika aplikasi menggunakan tipe atas tetap, array dapat dibungkus berdasarkan struktur bidang, misalnya:
Eksperimen ini menggunakan JSON.parseObject(json, BoundEnvelope.class) untuk memparse pembungkus di atas, hasilnya tetap RCE-OK dan mengembalikan BoundEnvelope secara normal.
6.5 Uji batas kunci

7. Perbaikan dan rekomendasi mitigasi7.1 Pilihan terbaik: Pindahkan keluar dari Fastjson 1.x
Prioritaskan migrasi ke Fastjson 2.x yang sedang dipelihara, dan verifikasi ulang semua konfigurasi tipe polimorfik, AutoType, dan mode kompatibilitas. Jangan hanya mengganti JAR tanpa melakukan pengujian regresi.
7.2 Aktifkan SafeMode segera
Konfigurasi kode:
JVM parameters:
Perhatikan: Aplikasi yang mendaftarkan AutoTypeCheckHandler harus diaudit atau dihapus secara bersamaan, karena handler dieksekusi sebelum pemeriksaan SafeMode.
7.3 Batasi entri deserialisasi
- Jangan langsung berikan permintaan yang tidak dapat dipercaya ke JSON.parse/JSON.parseObject
- Tolak segala bentuk metadata jenis khusus di gateway atau pintu masuk aplikasi
- Hanya membatasi tipe Java tingkat atas bukanlah pertahanan yang cukup, karena objek bersarang masih dapat memproses @type, dan jsonType kerentanan ini kembali lebih awal untuk melewati pemeriksaan kompatibilitas
7.4 Aturan sementara WAF/gateway
Blokir sementara permintaan yang kunci JSON setelah didekode sama dengan @type, dan timpa parameter URL, badan permintaan, dan objek bersarang. Jangan hanya mencari "@type" dalam teks biasa, lexer Fastjson akan terlebih dahulu didekode nama bidang, misalnya:
Aturan WAF hanya dapat digunakan sebagai tindakan mitigasi, bukan pengganti pembaruan komponen dan SafeMode.
7.5 Hardening for Outbound and Runtime
- Larang JVM bisnis untuk memulai koneksi HTTP/HTTPS ke alamat eksternal yang tidak diperlukan.
- Terapkan kebijakan jaringan minimal pada kontainer aplikasi.
- Batasikan paparan atau gunakan sandbox kontainer yang lebih ketat untuk /proc/self/fd saat kompatibilitas memungkinkan.
- Mengaudit penanganan nama sumber daya URL absolut oleh ClassLoader, menolak protokol seperti http:, https:, jar:, file:.
- Monitor anomalous jar_cache* activity in the JVM temporary directory.
8. Saran Deteksi dan IOC
8.1 Fitur sisi permintaan
Fokus utama pada nilai @type yang telah didekodekan mencakup:
Munculnya Exception secara terpisah tidak cukup untuk memicu peringatan, harus dikaitkan dan dianalisis bersama dengan format protokol, @type, dan kandidat FD berurutan dalam array.
8.2 Fitur sisi jaringan
- JVM meminta file JAR atau .class tanpa ekstensi dari host yang tidak valid
- Terjadi 1–3 kali pengulangan GET/HEAD selama permintaan analisis yang sama
- Path dalam permintaan mungkin berisi /x, /a.class, atau path setara yang ditentukan oleh penyerang
8.3 Fitur sisi host
- JVM membuat direktori sementara jar_cache*
- Proses Java membuka kembali file dirinya sendiri melalui /proc/self/fd/N
- log class-load muncul seperti:
9. Kesimpulan
Lubang ini bukanlah "bypass daftar hitam lalu cari gadget lokal" tradisional, tetapi mengubah logika deteksi metadata kelas Fastjson itu sendiri menjadi saluran pengambilan kelas jarak jauh dan otorisasi. Pengembalian awal @JSONType menyebabkan kelas yang disediakan penyerang diterima sebelum pemeriksaan kelas dasar berbahaya dan ikatan tipe; saluran lunak kegagalan Exception dan cache sementara JDK jar:http: memperluas primitif pemuatan langsung JDK 8 ke JDK 17/21/25.
Oleh karena itu, semua penilaian umum berikut tidak berlaku:
- "AutoType dinonaktifkan secara default, jadi aman" — tidak benar
- "Menggunakan parameter kedua parseObject secara tetap, sehingga aman" — tidak benar
- "Classpath tidak memiliki gadget yang dikenal, sehingga aman" — tidak benar
- “JKD 17+ akan menolak nama internal http://, jadi paling hanya SSRF” — tidak benar
Dalam deploy yang memenuhi syarat loader yang telah diverifikasi, jaringan, dan file descriptor, masalah ini dapat berkembang dari permintaan JSON tanpa otentikasi menjadi eksekusi kode jarak jauh nyata. Sebaiknya segera bermigrasi ke Fastjson 2.x dan aktifkan SafeMode, serta memperketat batasan keluar dan resolusi sumber daya ClassLoader.
10. Jalur lampiran dan bukti
Sumber dan hak cipta: Laporan ini serta analisis teknis terkait dirilis secara eksklusif oleh GCSA Global Cybersecurity Alliance. Jika ingin mengutip, harap pertahankan seluruh sumber resmi GCSA dan tautan aslinya, serta jangan mengubah secara jahat pandangan inti laporan.
Sumber: GCSA Global Cybersecurity Alliance
Situs web: www.gcsa.org
