Spring4Shell CVE-2022-22965, Celah RCE di Spring Framework
Spring4Shell memungkinkan eksekusi kode jarak jauh di aplikasi Spring MVC di Tomcat. Cek syarat terdampak, versi perbaikan, dan cara memeriksa proyekmu.
Jawaban singkat
Spring4Shell (CVE-2022-22965) adalah celah RCE lewat data binding di Spring Framework 5.3.0 sampai 5.3.17 dan 5.2.19 ke bawah. Eksploit yang dikenal butuh JDK 9+, Tomcat, dan deploy WAR. Perbaikannya ada di 5.3.18 dan 5.2.20, atau Spring Boot 2.6.6 dan 2.5.12.
Daftar isi
Spring4Shell (CVE-2022-22965) adalah celah eksekusi kode jarak jauh (RCE) di Spring Framework, kerangka kerja Java yang sangat banyak dipakai untuk aplikasi web dan API. Lewat fitur data binding, penyerang bisa memanipulasi properti internal aplikasi sampai akhirnya menulis file berbahaya ke server dan menjalankannya.
Kenapa ini penting dibahas lagi beberapa tahun kemudian? Karena aplikasi Java di perusahaan sering berumur panjang. Sistem internal yang dibangun dengan Spring 5.x lalu jarang disentuh masih banyak berjalan, dan celah yang sudah masuk katalog celah yang dieksploitasi seperti ini tetap jadi target pemindaian otomatis.
CVE-2022-22965
Kritis · CVSS 9.8- Produk terdampak
- Spring Framework
- Versi terdampak
- 5.3.0 sampai 5.3.17, 5.2.19 dan sebelumnya
- Versi aman
- 5.3.18, 5.2.20
- Status
- Patch tersedia
- Diumumkan
- 31 Maret 2022
Apa yang terjadi pada Maret 2022?
Menurut kronologi resmi tim Spring, celah ini dilaporkan peneliti dari AntGroup FG pada Selasa malam, dua hari sebelum rilis perbaikan. Tim Spring menyelidiki dan menyiapkan perbaikan, tapi rincian celah lebih dulu bocor ke internet sebelum rilis resmi siap.
Pada 31 Maret 2022, Spring Framework 5.3.18 dan 5.2.20 dirilis, disusul Spring Boot 2.6.6 dan 2.5.12 yang memakai Framework 5.3.18. CVE-2022-22965 diterbitkan di hari yang sama. Pada 1 April 2022, tim Spring mengumumkan bahwa Apache Tomcat merilis versi 10.0.20, 9.0.62, dan 8.5.78 yang menutup jalur serangan dari sisi Tomcat. CISA memasukkannya ke katalog Known Exploited Vulnerabilities pada 4 April 2022.
Nama "Spring4Shell" muncul dari komunitas karena kemiripannya dengan Log4Shell beberapa bulan sebelumnya. Meski namanya mirip, cara kerja dan cakupannya berbeda.
Bocornya rincian sebelum perbaikan siap membuat banyak tim keamanan bekerja dalam ketidakpastian selama beberapa hari. Sempat beredar kebingungan apakah celah ini sama dengan celah lain di ekosistem Spring yang diumumkan berdekatan. Pelajarannya, saat ada kabar celah besar, rujuk dulu pengumuman resmi vendor sebelum mengambil keputusan berdasarkan unggahan media sosial.
Siapa yang terdampak?
Eksploit yang dipublikasikan butuh semua syarat berikut terpenuhi sekaligus:
- Memakai JDK 9 atau lebih baru.
- Berjalan di Apache Tomcat sebagai servlet container.
- Dikemas dan dideploy sebagai WAR.
- Memakai dependensi
spring-webmvcatauspring-webflux. - Versi Spring Framework 5.3.0 sampai 5.3.17, atau 5.2.19 ke bawah.
Aplikasi Spring Boot yang dijalankan sebagai JAR mandiri (cara bawaan Spring Boot) tidak rentan terhadap eksploit spesifik ini. Namun tim Spring menegaskan sifat celahnya lebih umum, jadi bisa ada jalur eksploitasi lain. Karena itu, update tetap dianjurkan walaupun aplikasimu tidak memenuhi semua syarat di atas.
Bagaimana cara celah ini bekerja?
Spring MVC punya fitur data binding: parameter dari permintaan HTTP otomatis diisikan ke objek Java. Kalau formulir mengirim nama=Budi, Spring memanggil setNama("Budi") pada objek tujuan.
Masalahnya, binding ini bisa merambat ke properti bertingkat, termasuk class, lalu ke classLoader. Di JDK 9 ke atas, ada jalur baru lewat class.module.classLoader yang lolos dari perlindungan lama. Di Tomcat, jalur ini bisa mencapai pengaturan komponen pencatat log akses, sehingga penyerang bisa mengubah lokasi dan isi file log menjadi file JSP berisi web shell di folder aplikasi. Setelah itu, cukup panggil file tersebut lewat browser untuk menjalankan perintah di server.
Ringkasan perbaikan
| Situasi | Tindakan utama | Catatan |
|---|---|---|
| Spring Framework 5.3.x | Naikkan ke 5.3.18 atau lebih baru | Perbaikan resmi |
| Spring Framework 5.2.x | Naikkan ke 5.2.20 atau lebih baru | Perbaikan resmi |
| Spring Boot 2.6.x / 2.5.x | Naikkan ke 2.6.6 / 2.5.12 atau lebih baru | Sudah membawa Framework 5.3.18 |
| Belum bisa update Spring | Update Tomcat ke 10.0.20, 9.0.62, atau 8.5.78 | Solusi taktis, bukan pengganti update Spring |
| Tidak bisa update keduanya | Atur disallowedFields atau turun ke Java 8 | Solusi darurat sesuai panduan tim Spring |
Bagaimana dengan solusi darurat disallowedFields?
Bagi aplikasi yang belum bisa diupdate, tim Spring menyarankan menolak pola parameter seperti class.* dan *.class.* secara global lewat @ControllerAdvice yang mengatur WebDataBinder. Ada catatan penting: controller yang punya @InitBinder sendiri bisa menimpa pengaturan global ini. Jadi solusi ini perlu dicek ke seluruh controller, dan sebaiknya hanya dipakai sampai update bisa dijalankan.
Langkah praktis untuk tim IT
- Inventaris aplikasi Java. Catat semua aplikasi yang memakai Spring, cara deploy (JAR atau WAR), versi JDK, dan versi Tomcat. Sering kali aplikasi lama buatan vendor justru yang terlupa.
- Cek versi dependensi, termasuk dependensi turunan. Aplikasi bisa memakai Spring lewat pustaka lain tanpa tercantum langsung di
pom.xml. - Update dan uji. Naikkan Spring Framework atau Spring Boot ke versi yang sudah diperbaiki. Bila ada lompatan versi besar, uji di lingkungan staging dulu.
- Periksa tanda penyusupan. Cari file
.jspyang tidak dikenal di folder aplikasi Tomcat dan perubahan aneh pada konfigurasi log akses, terutama di server yang terbuka ke internet sejak 2022. - Pasang pemantauan. WAF bisa membantu memblokir pola permintaan berisi
class.module.classLoader, tapi tetap anggap ini lapisan tambahan.
Celah seperti ini juga pengingat untuk membuat jadwal patch management yang mencakup pustaka aplikasi, bukan hanya sistem operasi. Untuk menentukan prioritas, kamu bisa memakai skor CVSS dan status di katalog KEV CISA. Bandingkan juga dengan pelajaran dari Log4Shell, celah Java lain yang dampaknya jauh lebih luas.
Pertanyaan yang sering diajukan
Apakah Spring4Shell sama dengan Log4Shell?
Tidak. Log4Shell ada di pustaka logging Log4j dan bisa dipicu oleh teks apa pun yang dicatat ke log. Spring4Shell ada di data binding Spring Framework dan butuh kombinasi syarat tertentu agar eksploit yang dikenal berhasil.
Aplikasi saya Spring Boot JAR di Java 17, apakah aman?
Eksploit yang dipublikasikan tidak bekerja pada JAR mandiri. Namun tim Spring menyatakan bisa ada jalur lain, jadi tetap update ke versi yang sudah diperbaiki.
Apakah CVE-2022-22963 sama dengan Spring4Shell?
Bukan. CVE-2022-22963 adalah celah terpisah di Spring Cloud Function yang diumumkan di waktu berdekatan, sehingga keduanya sempat tertukar di pemberitaan awal.


