flawopen.com/Deserialisasi Java/Keamanan ObjectInputStream
Apakah ObjectInputStream aman untuk data tidak tepercaya?
Biasanya tidak: readObject() membangun kembali objek Java dan dapat menjalankan metode deserialisasi milik kelas. Bayangkan formulir yang lampirannya juga menjalankan petunjuk sendiri. Stream berbahaya dapat mencapai perilaku kelas yang sudah tersedia di aplikasi. Hasilnya bergantung pada kelas, pustaka, jalur, dan batas masukan; tidak setiap pemanggilan mengeksekusi kode.
// Jangan berikan byte kendalian penyerang di sini.
try (var in = new ObjectInputStream(untrustedStream)) {
Object value = in.readObject();
handle(value);
}
// Nonaktifkan pengetikan polimorfik luas untuk masukan tak tepercaya.
ObjectMapper mapper = new ObjectMapper();
OrderRequest value = mapper.readValue(
untrustedBytes, OrderRequest.class
);
validate(value);
Bagaimana cacat dapat dijangkau
API, antrean, cache, atau impor berkas menerima byte yang dikendalikan pengguna. Saat mencapai ObjectInputStream.readObject(), JVM memulihkan objek dari kelas serializable dalam proses. Rantai gadget adalah jalur yang mungkin melalui perilaku kelas tersebut, bukan payload di setiap stream. Oracle mendokumentasikan CVE-2015-4852 sebagai kasus khusus: serangan jaringan tanpa autentikasi melalui WebLogic T3 pada versi yang disebutkan. Ini tidak berarti semua penggunaan ObjectInputStream dapat dijangkau dari jarak jauh.
Jika serialisasi native tidak dapat dihapus
- ✓Utamakan JSON atau Protocol Buffers dengan skema eksplisit; petakan ke DTO tetap lalu validasi bidang dan otorisasi.
- ✓Jika tak terhindarkan, atur
ObjectInputFiltersesuai konteks sebelumreadObject(); izinkan hanya kelas tepat yang dibutuhkan. - ✓Batasi kedalaman, referensi, array, dan byte stream berdasarkan masukan valid yang diukur. Daftar izin kelas saja tidak mencegah kehabisan sumber daya.
- ✓Jangan aktifkan pengetikan polimorfik luas untuk JSON tidak tepercaya; metadata subtipe sembarang dapat membangun objek kembali.
- ✓Perbarui Java dan dependensi, hapus pustaka tak terpakai, dan proses stream lama dengan hak minimum serta batas sumber daya.
Pertanyaan umum
Filter menurunkan risiko dengan daftar izin sempit dan batas sebelum membaca, tetapi bukan sanitizer universal. Kelas yang diizinkan, perilakunya, status filter, validasi aplikasi, dan otorisasi tetap penting. Hindari serialisasi native untuk data kendalian pengguna jika memungkinkan.