Fastjson 1.2.83 masih boleh memicu eksekusi jarak jauh tanpa gadget tradisional dalam keadaan AutoType=false secara lalai, dan telah berjaya disahkan dalam persekitaran isolasi JDK 8/17/21/25 + Spring Boot Loader.Penulis artikel, sumber: GCSA
Ringkasan
Dalam sistem pertahanan kerentanan penjalanan semula Java tradisional, industri secara umum mempunyai kekeliruan berikut: “AutoType dimatikan secara lalai adalah selamat”, “Mengunci parameter kedua parseObject (jenis sasaran tingkat atas) adalah selamat”, “Mengosongkan bergantung Gadget penjalanan semula dari Classpath tempatan adalah selamat”. Namun, perkembangan terkini dalam serangan dan pertahanan teknikal telah mematahkan sikap optimis ini sepenuhnya.
GCSA Alliance Global Cybersecurity hari ini mengeluarkan laporan wawasan teknikal ini secara eksklusif. Laporan ini menganalisis secara mendalam akar punca di bawah yang membolehkan eksekusi jarak jauh kod (RCE) tanpa bergantung pada Gadget tradisional, walaupun Fastjson 1.2.83 berada dalam keadaan AutoType=false. Teknik pemanfaatan ini telah berjaya direplikasi secara end-to-end dalam persekitaran isolasi JDK 8 / 17 / 21 / 25 dan Spring Boot Loader. L celah ini bukanlah "mengelakkan senarai hitam dan mencari Gadget tempatan" seperti biasa, tetapi secara langsung memutarbalikkan logik pengesanan metadata Kelas Fastjson sendiri menjadi saluran untuk mendapatkan dan mengesahkan Kelas jarak jauh jahat. Berikut ialah teks utama
Penerbit: GCSA Global Cybersecurity Alliance
Jenis laporan: Wawasan Teknikal Eksklusif / Laporan Analisis Kedalaman Lelaian
Tarikh laporan: 2026-07-21
Status laporan: Audit kod sumber dan peniruan persekitaran terpisah telah selesai
Nombor lusuh: Nombor kajian dalaman FJ-GETRESOURCE-RCE (tidak sepadan dengan CVE yang telah diumumkan)
Fastjson 1.2.83 masih boleh memicu eksekusi jarak jauh tanpa gadget tradisional walaupun AutoType=false, dan telah berjaya disahkan dalam persekitaran isolasi JDK 8/17/21/25 + Spring Boot Loader. Disarankan untuk segera mengaktifkan SafeMode dan beralih ke Fastjson 2.x.
1. Ringkasan pelaksanaan
Fungsi ParserConfig.checkAutoType pada Fastjson 1.2.83 akan menukar nilai @type yang dikawal pengguna menjadi nama sumber class, dan menghantarkannya ke getResourceAsStream ClassLoader semasa:

Dalam persekitaran ClassLoader fat-jar yang mampu menyelesaikan nama sumber URL mutlak, penyerang boleh menggunakan penggantian titik untuk membina URL http:, jar:http:, dan jar:file: untuk memuat turun class jahat yang mengandungi @JSONType dari pihak serang. Setelah Fastjson mengesan anotasi ini, ia akan memanggil loadClass dan secara langsung mengembalikan class tersebut sebelum pemeriksaan kelas asas berbahaya dan pemeriksaan kesesuaian jenis sasaran. Semasa class diinstansikan dan diinialisasi, kod sewenang-wenangnya boleh dieksekusi.
Eksploitasi ini tidak bergantung pada gadget deserialisasi tradisional yang sudah ada dalam classpath sasaran, dan masih boleh dipicu dalam keadaan lalai Fastjson AutoType=false. Menetapkan jenis sasaran JSON.parseObject tidak dapat menghalang pelaksanaan; mengaktifkan SafeMode boleh menghalang laluan eksploitasi biasa sebelum akses sumber.
Laporan ini telah diperbanyak di dalam kontainer Linux yang dipisahkan menggunakan payload JSON yang sama:

2. Penilaian Lelaian

Tidak disarankan untuk memberikan CVSS 9.8 yang seragam berdasarkan versi komponen sahaja: AppClassLoader biasa adalah kawalan negatif, rantai lengkap JDK moden masih bergantung pada loader yang mampu menerjemahkan dua URL JAR mutlak dan /proc/self/fd. Dalam persekitaran positif laporan ini, kesan kelemahan adalah RCE rangkaian tanpa pengesahan.
3. Lingkungan kesan dan syarat awal
3.1 Lingkup telah disahkan
- Semasa berjalan: Fastjson 1.2.83
- JDK disahkan: 8, 17, 21, 25
- Pengesahan sistem operasi: Linux; macOS juga berjaya mereproduksi JDK 17/21/25 menggunakan /dev/fd
- Pengesahan loader: Spring Boot 2.7.18 classic loader + JDK 8; Spring Boot 3.2.0 loader + JDK 17/21/25
- Pengesahan API: JSON.parse, serta JSON.parseObject dengan jenis atas tetap
3.2 Version Range Description
1.2.68–1.2.83 dalam keterangan luar lebih sesuai sebagai julat ujian yang diketahui, bukan versi di mana kelemahan diperkenalkan. Semakan kod sumber menunjukkan bahawa kod pengesanan sumber class yang menentukan sudah wujud dalam 1.2.67 dan 1.2.68. Laporan ini hanya menyelesaikan pengesahan menyeluruh lintas runtime JDK untuk 1.2.83.
3.3 Menggunakan syarat yang diperlukan
1. Penyerang boleh mengawal JSON yang masuk ke Fastjson, dan @type dalam input akan diproses.
2.SafeMode tidak diaktifkan.
3. ClassLoader Fastjson boleh menterjemahkan nama sumber mutlak yang dibina menjadi URL.
4. Proses yang menjadi mangsa boleh menyambungkan ke perkhidmatan HTTP penyerang.
5. Sistem Linux moden memerlukan /proc/self/fd boleh dibaca, dan loader mampu dianalisis
jar:file:/proc/self/fd/N!...。
1. JDK perlu mampu menciptakan cache sementara JAR jarak jauh yang normal; ini biasanya bermaksud direktori sementara JVM boleh ditulis.
Penyerang tidak perlu:
- Menulis fail ke classpath sasaran
- Target classpath pre-installed with TemplatesImpl, JNDI, C3P0, Commons Collections, and other gadgets
- Nyalakan Fastjson AutoType
- Kawal parameter kedua JSON.parseObject
4. Analisis punca akar
4.1 Nama jenis pengguna dianggap sebagai URL sumber
Lokasi kod sumber:

Kod utama:

Logik ini mengandaikan resource hanyalah laluan classpath biasa, tetapi tidak membatasi protokol, makna laluan mutlak, atau sumbernya. Untuk loader fat-jar tertentu, input berikut akan menjadi URL mutlak selepas penggantian:

Oleh itu, getResourceAsStream memuat sumber rangkaian yang dikawal oleh penyerang melalui pertanyaan metadata tempatan yang melampaui batas.
4.2 @JSONType pada class jarak jauh dianggap sebagai asas kebenaran
Fastjson menggunakan ClassReader ASM sendiri untuk menganalisis kandungan sumber:

Serangan hanya memerlukan kelas jarak jauh yang memiliki anotasi @JSONType Fastjson untuk menetapkan jsonType sebagai true. Pemeriksaan ini dilakukan terhadap byte yang disediakan oleh penyerang, bukan kelas yang telah dimuat oleh classpath yang boleh dipercaya.
4.3 jsonType memicu pemuatan kelas sebenar
Lokasi kod sumber:
TypeUtils.loadClass mencuba secara berturut-turut loader eksplisit, thread context loader, dan Class.forName. Dalam persekitaran positif, thread context loader akan menguraikan semula nama sumber mutlak yang sama, memuat turun class, dan menjalankan defineClass.
4.4 @JSONType Pulang awal untuk melintasi pemeriksaan keselamatan seterusnya
Lokasi kod sumber:
- Pemeriksaan kelas bahaya tidak akan dilaksanakan
- expectClass.isAssignableFrom(clazz) tidak akan dilaksanakan
- Jenis ikatan data tetap tidak boleh menghalang pelaksanaan sebelum inisialisasi kelas
4.5 Kegagalan pembentukan saluran lembut selepas Exception/Error
Lokasi kod sumber:
4.6 Lokasi SafeMode
Pemeriksaan SafeMode berlaku sebelum akses sumber:
5. Penjelasan Mendalam tentang Rantai
5.1 JDK 8: Muat class jarak jauh secara langsung
Bentuk paling ringkas:
JDK 17+ juga akan menyelesaikan permintaan rangkaian, tetapi menolak bahagian laluan kosong dalam nama dalaman,
5.2 Fasa Pertama JDK Moden: Muat turun JAR jauh
Unsur pertama dalam array payload tunggal:
JDK 17+ kemudian menolak nama dalaman jar: http://... pada peringkat pertama, tetapi Fastjson terus menghuraikan array kerana akhiran Exception.
5.3 Tahap Kedua JDK Moden: Buka Semula FD Cache
Elemen calon seterusnya:
Log class-load pertama yang berjaya dalam JDK 17 ialah:
5.4 Mengapa satu payload kompatibel dengan JDK 8 dan JDK moden?
- JDK 8 secara langsung menerima jar tahap pertama: http://... class dan menjalankannya
- Selepas menjalankan arahan class peringkat pertama, ia sengaja melempar RuntimeException("stage-one-stop") untuk menghentikan JDK 8 daripada mencuba FD socket/pipe yang tidak berkaitan
- JDK 17+ gagal pada nama tidak sah sebelum inisialisasi kelas, kemudian kembali secara lembut melalui Exception ke fasa enum FD
6. Lingkungan dan bukti reproduksi
6.1 Hash komponen yang diuji
6.2 Salin segera

Expected output:The script will:
- Compile victim fat jar;
- Hasilkan JAR serangan dengan class khas FD;
- Hasilkan satu payload array JSON;
- Menghidupkan perkhidmatan HTTP penyerang dalam rangkaian Docker yang dipisahkan;
- Mulakan kontainer yang terjejas dengan JDK 8/17/21/25;
- Semak setiap peta kontainer ke /tmp/fastjson-getresource-rce.
6.3 Menghasilkan JAR dan payload secara manual
6.4 Menghantar melalui Burp Suite
Burp hanya bertanggung jawab untuk menghantar JSON ke antaramuka mangsa yang mempunyai titik penyelesaian Fastjson; JAR serangan masih perlu disediakan oleh perkhidmatan HTTP pihak serang.
Permintaan templat:
Jika aplikasi menggunakan jenis atas tetap, array boleh dibungkus mengikut struktur medan, contohnya:
Eksperimen ini menggunakan JSON.parseObject(json, BoundEnvelope.class) untuk menerjemahkan pembungkus di atas, dan hasilnya tetap RCE-OK serta mengembalikan BoundEnvelope dengan betul.
6.5 Ujian sempadan utama

7. Perbaikan dan cadangan penyelesaian7.1 Pilihan utama: Pindah keluar dari Fastjson 1.x
Pindah utama ke Fastjson 2.x yang sedang diselenggarakan, dan semak semula semua konfigurasi jenis polimorfik, AutoType, dan modus kompatibiliti. Jangan hanya menggantikan JAR tanpa menjalankan ujian regresi.
7.2 Aktifkan SafeMode segera
Konfigurasi kod:
Parameter JVM:
Perhatian: Aplikasi yang mendaftarkan AutoTypeCheckHandler harus disemak atau dihapus secara serentak, kerana handler dieksekusi sebelum pemeriksaan SafeMode.
7.3 Hadkan entri penjaluran semula
- Jangan teruskan permintaan tidak boleh dipercayai terus kepada JSON.parse/JSON.parseObject
- Tolak sebarang jenis metadata khas di gateway atau pintu masuk aplikasi
- Hanya menetapkan jenis Java teratas bukanlah pertahanan yang mencukupi, kerana objek bersarang masih boleh memproses @type, dan jsonType dalam kelemahan ini kembali awal untuk melangkau semakan kekompatiban
7.4 Peraturan sementara WAF/gateway
Tangkap sementara permintaan yang kunci JSON setelah didekod sama dengan @type, dan timpa parameter URL, badan permintaan, dan objek bersarang. Jangan hanya mencari "@type" dalam teks biasa, lexer Fastjson akan didekod terlebih dahulu nama medan, contohnya:
Peraturan WAF hanya boleh digunakan sebagai langkah pengekangan, bukan pengganti pemutakhiran komponen dan SafeMode.
7.5 Penguatan Semasa Keluar dan Semasa Beroperasi
- Larang JVM perniagaan membuka sambungan HTTP/HTTPS ke alamat luar yang tidak perlu.
- Mengaplikasikan strategi jaringan minimum kepada kontainer aplikasi.
- Menghadkan paparan atau menggunakan kotak pasir kontena yang lebih ketat apabila kompatibiliti membenarkan /proc/self/fd.
- Mengaudit pemrosesan nama sumber URL mutlak oleh ClassLoader, menolak format protokol seperti http:, https:, jar:, file: dst.
- Monitor anomalous jar_cache* activity in the JVM temporary directory.
8. Cadangan Pengesanan dan IOC
8.1 Ciri-ciri sisi permintaan
Fokus utama pada nilai @type yang telah didekod mengandungi:
Kehadiran Exception secara berasingan tidak mencukupi untuk menghasilkan amaran; ia perlu dianalisis secara berkaitan dengan format protokol, @type, dan calon FD berterusan dalam array.
8.2 Ciri-ciri sisi rangkaian
- JVM meminta fail JAR atau .class tanpa sambungan daripada hos yang tidak sah
- 1–3 kali ulangan GET/HEAD berlaku semasa permintaan analisis yang sama
- Laluan permintaan mungkin mengandungi /x, /a.class, atau laluan setara yang ditentukan oleh penyerang
8.3 Ciri sisi hos
- JVM membuat direktori sementara jar_cache*
- Proses Java membuka semula fail sendiri melalui /proc/self/fd/N
- log class-load muncul serupa:
9. Kesimpulan
Lubang ini bukanlah "bypass senarai hitam kemudian cari gadget tempatan" yang tradisional, tetapi mengubah logik pengesanan metadata kelas Fastjson sendiri menjadi saluran pengambilan kelas jarak jauh dan kuasa. Pengembalian awal @JSONType menyebabkan kelas yang disediakan penyerang diterima sebelum pemeriksaan kelas asas berbahaya dan ikatan jenis; saluran lembut kegagalan Exception dan cache sementara JDK jar:http: memperluaskan primitif pemuatan langsung JDK 8 ke JDK 17/21/25.
Oleh itu, semua penilaian umum berikut tidak berlaku:
- "AutoType dimatikan secara lalai, jadi selamat" — tidak benar
- “Menggunakan parameter kedua tetap untuk parseObject, maka selamat” — tidak benar
- "Classpath tidak mempunyai gadget yang diketahui, maka selamat" — tidak benar
- “JKD 17+ akan menolak nama dalaman http://, jadi paling banyak hanya SSRF” — tidak benar
Dalam pelaksanaan yang memenuhi syarat loader yang telah disahkan, rangkaian, dan descriptor fail, isu ini boleh berkembang daripada permintaan JSON yang tidak disahkan menjadi eksekusi jarak jauh sebenar. Pemindahan ke Fastjson 2.x perlu diutamakan, dan SafeMode perlu diaktifkan segera, serta memperketat sempadan keluar dan penyelesaian sumber ClassLoader.
10. Laluan lampiran dan bukti
Hak cipta dan pengisytiharan pemindahan: Laporan ini dan analisis teknikal berkaitan diterbitkan secara eksklusif oleh GCSA Global Cybersecurity Alliance. Jika ingin memindahkan, pastikan untuk mengekalkan sumber rasmi GCSA dan pautan asal secara lengkap, dan jangan mengubah suai pandangan utama laporan dengan niat jahat.
Sumber: GCSA Alliance Global Keselamatan Cyber
Laman web rasmi: www.gcsa.org
