Deserialization vulnerability adalah celah keamanan kritis yang terjadi ketika aplikasi mempercayai dan memproses data input serial tanpa validasi yang memadai. Kondisi ini memungkinkan penyerang memanipulasi objek berseri (serialized objects) untuk mengeksekusi kode berbahaya secara sewenang-wenang di server (Remote Code Execution atau RCE), melakukan bypass autentikasi, atau melancarkan serangan Denial of Service (DoS).
Dalam arsitektur perangkat lunak modern, proses serialisasi mengubah struktur data kompleks atau objek memori menjadi format linear—seperti JSON, XML, YAML, atau format biner khusus bahasa pemrograman—agar mudah disimpan atau dikirimkan melalui jaringan. Deserialization adalah kebalikannya, yakni merekonstruksi format tersebut kembali menjadi objek aktif di dalam memori aplikasi. Ketika data yang diterima dari pengguna tidak diverifikasi integritasnya, objek berbahaya yang disisipkan dapat memicu eksekusi fungsi destruktif saat proses rekonstruksi berlangsung.
Mekanisme Kerja dan Skenario Serangan
Cerah keamanan ini sangat erat kaitannya dengan bagaimana suatu bahasa pemrograman menangani fungsi '__wakeup()', 'readObject()', atau metode destruktor serupa. Penyerang biasanya memanfaatkan rantai gadget (gadget chains)—kumpulan potongan kode yang sudah ada di dalam aplikasi atau pustaka pihak ketiga (dependencies)—yang dipicu secara berurutan setelah objek berhasil dideserialisasi.
| Bahasa / Format | Fungsi Rentan Utama | Dampak Utama | Contoh Vektor Serangan |
|---|---|---|---|
| Java | ObjectInputStream.readObject() | Remote Code Execution (RCE) | Apache Commons Collections exploit chains |
| PHP | unserialize() | Object Injection & File Deletion | Memanipulasi properti objek untuk memanggil magic methods |
| Python | pickle.load() | Arbitrary Command Execution | Menggunakan fungsi __reduce__ pada modul pickle |
| Node.js | node-serialize / eval() | Remote Code Execution | Menyisipkan IIFE (Immediately Invoked Function Expression) |
Contoh Celah Keamanan pada Kode (PHP)
Berikut adalah contoh implementasi kode rentan di mana fungsi unserialize() menerima masukan langsung dari parameter HTTP tanpa melalui filter:
<?php
class UserSession {
public $username;
public $isAdmin = false;
function __destruct() {
if ($this->isAdmin) {
// Mengeksekusi perintah berbahaya jika properti dimanipulasi
eval($this->username);
}
}
}
// Menerima data serial dari cookie pengguna tanpa validasi
$cookieData = $_COOKIE['session'];
$userObj = unserialize($cookieData);
?>
Jika penyerang mengirimkan string objek berseri buatan sendiri di mana nilai isAdmin diatur menjadi true dan username berisi perintah sistem berbahaya, aplikasi akan mengeksekusi perintah tersebut secara otomatis ketika objek dihancurkan (trigger destruct).
Strategi Mitigasi dan Pencegahan
Menambal celah deserialization membutuhkan pendekatan pertahanan berlapis (defense-in-depth) karena memblokir satu titik masuk saja seringkali belum cukup untuk mengamankan seluruh sistem yang kompleks.
- Hindari Format Biner yang Tidak Aman: Jangan pernah menggunakan mekanisme serialisasi bawaan bahasa (seperti Java Native Serialization atau Python Pickle) untuk memproses data yang bersumber dari pengguna atau pihak luar yang tidak tepercaya.
- Gunakan Format Data Netral: Beralihlah menggunakan format pertukaran data berbasis teks seperti JSON atau Protocol Buffers yang secara desain tidak mendukung eksekusi kode otomatis saat proses parsing.
- Terapkan Tanda Tangan Kriptografi (HMAC): Jika serialisasi mutlak diperlukan untuk penyimpanan state lokal, pastikan data diberi tanda tangan digital menggunakan kunci rahasia server untuk mendeteksi manipulasi sebelum proses deserialisasi dijalankan.
- Gunakan Safe Unpickling / Whitelisting: Batasi kelas atau tipe objek apa saja yang diizinkan untuk dibuat kembali (whitelist) selama proses deserialisasi berlangsung.
- Pembaruan Pustaka Pihak Ketiga: Selalu perbarui dependencies dan framework untuk menutup celah dari known gadget chains yang sering dieksploitasi oleh peretas.
Mitos vs Fakta Deserialization Vulnerability
| Mitos | Fakta Lapangan |
|---|---|
| "Enkripsi data sudah cukup untuk mengamankan proses deserialization." | Enkripsi hanya melindungi kerahasiaan data di jalur transit, tetapi tidak mencegah serangan jika kunci enkripsi bocor atau jika aplikasi memproses data setelah didekripsi. |
| "Bahasa pemrograman modern sudah otomatis aman dari celah ini." | Sebagian besar bahasa modern menyediakan fungsi parsing objek secara instan. Jika pengembang salah menggunakannya dengan data tak tepercaya, celah tetap terbuka. |