FlawOpen

flawopen.com/Deserialisasi Java/Keamanan ObjectInputStream

Apakah ObjectInputStream aman untuk data tidak tepercaya?

Referensi keamanan Java
Penjelasan sederhana

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.

BERISIKO: deserialisasi objek native
// Jangan berikan byte kendalian penyerang di sini.
try (var in = new ObjectInputStream(untrustedStream)) {
    Object value = in.readObject();
    handle(value);
}
LEBIH AMAN: parse tipe data tetap
// 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

Pertanyaan umum

Apakah ObjectInputFilter membuat readObject() aman?

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.

Sumber primer

Lihat juga Deserialisasi tidak aman: risiko dan mitigasi Newtonsoft.Json TypeNameHandling: konfigurasi aman? PHP unserialize() dan input tak tepercaya Python pickle.load(): risiko data tak tepercaya Apakah Ruby YAML.load aman? Versi Psych dan safe_load .NET BinaryFormatter: Risiko dan Migrasi