Insecure Deserialization

Object injection zafiyetleri ve güvenli deserialization teknikleri

Critical Risk

Serialization Nedir?

Serialization, karmaşık veri yapıları (nesneler ve alanları) gibi verileri daha "düz" bir formata dönüştürme işlemidir. Bu format, ardışık bir bayt akışı olarak gönderilebilir ve alınabilir.

Serialization'ın temel amaçları:

Serialization Kullanım Alanları:
  • • Karmaşık verileri belleğe, dosyaya veya veritabanına yazma
  • • Ağ üzerinden veri gönderme (API çağrıları)
  • • Farklı uygulama bileşenleri arasında veri aktarımı
  • • Nesne durumunu kalıcı hale getirme
// PHP Serialization Örneği $user = array( 'username' => 'admin', 'role' => 'administrator', 'is_authenticated' => true ); $serialized = serialize($user); // Çıktı: a:3:{s:8:"username";s:5:"admin";s:4:"role";s:13:"administrator";s:16:"is_authenticated";b:1;}
Önemli Not
Serialization sırasında nesnenin durumu korunur. Yani nesnenin tüm özellikleri ve atanan değerleri, private alanlar dahil olmak üzere serialize edilmiş veri akışında saklanır.
Dil Terminolojisi:
• Ruby: Marshalling
• Python: Pickling
• Java: Serialization
• PHP: Serialize/Unserialize

Deserialization Nedir?

Deserialization, serialize edilmiş bayt akışını orijinal nesnenin tamamen işlevsel bir kopyasına geri dönüştürme işlemidir. Nesne, serialize edildiği andaki durumuyla restore edilir.

// PHP Deserialization Örneği $serialized_data = 'a:3:{s:8:"username";s:5:"admin";s:4:"role";s:13:"administrator";s:16:"is_authenticated";b:1;}'; $user = unserialize($serialized_data); // $user artık orijinal array yapısına sahip
Kritik Güvenlik Riski: Deserialization işlemi sırasında, beklenenden farklı sınıflardan nesneler oluşturulabilir. Uygulama, hangi sınıftan nesne beklendiğine bakmaksızın, mevcut herhangi bir sınıftan nesne deserialize edecektir.
// Güvenli görünen kod $data = $_POST['user_data']; $user = unserialize($data); // TEHLIKE! // Saldırgan farklı bir sınıftan nesne gönderebilir // Örneğin: User sınıfı yerine DatabaseConnection sınıfı
Neden Tehlikeli?
Deserialization işlemi tamamlanmadan önce bile saldırı gerçekleştirilebilir. Nesnenin constructor'ı, destructor'ı veya magic method'ları çalıştırılarak zararlı kod icra edilebilir.

Insecure Deserialization Zafiyeti

Insecure Deserialization, kullanıcı kontrolündeki verilerin güvenli olmayan şekilde deserialize edilmesi durumudur. Bu zafiyet, saldırganların serialize edilmiş nesneleri manipüle ederek zararlı veri enjekte etmesine olanak tanır.

CRITICAL
Zafiyet Türleri:
  • • Object Injection: Beklenmeyen sınıflardan nesneler enjekte etme
  • • Property Manipulation: Nesne özelliklerini değiştirme
  • • Magic Method Abuse: __construct, __destruct, __wakeup gibi metotları kötüye kullanma
  • • Gadget Chain Exploitation: Zincirleme metot çağrıları ile RCE
// Zararlı payload örneği (PHP) O:4:"User":2:{s:8:"username";s:5:"admin";s:8:"is_admin";b:1;} // Normal kullanıcı yerine admin yetkili kullanıcı oluşturur
OWASP Top 10 2017: Insecure Deserialization, OWASP Top 10'da 8. sırada yer alan kritik bir güvenlik zafiyetidir. Remote Code Execution'a yol açabilir.

Zafiyetler Nasıl Oluşur?

Insecure deserialization zafiyetleri genellikle geliştiricilerin kullanıcı kontrolündeki verileri deserialize etmenin ne kadar tehlikeli olabileceğini anlamamasından kaynaklanır.

Yaygın Yanlış Anlamalar:
  • • "Serialize edilmiş veri okunamazdır" düşüncesi
  • • "Binary format güvenlidir" yanılgısı
  • • "Deserialize sonrası validasyon yeterlidir" hatası
  • • "Sadece beklenen sınıflar deserialize edilir" varsayımı
// YANLIŞ: Deserialize sonrası kontrol $user = unserialize($_POST['data']); // Çok geç! if ($user->role !== 'admin') { // Bu kontrol artık anlamsız } // DOĞRU: Hiç deserialize etmeyin! $safe_data = json_decode($_POST['data'], true); if ($safe_data['role'] !== 'admin') { // Güvenli kontrol }
Dependency Chain Problemi
Modern web siteleri birçok kütüphane kullanır. Her kütüphane kendi bağımlılıklarına sahiptir. Bu, saldırganların kullanabilecekleri sınıfların ve metotların havuzunu büyük ölçüde artırır.
Temel Gerçek: Güvenilmeyen kaynaktan gelen verileri güvenli şekilde deserialize etmek neredeyse imkansızdır. En iyi savunma, deserializasyon yapmamaktır.

Güvenlik Etkileri

Insecure deserialization zafiyetinin etkisi çok ciddi olabilir çünkü saldırganlara geniş bir saldırı yüzeyi sunar.

Potansiyel Saldırı Sonuçları:
  • CRITICAL Remote Code Execution (RCE)
  • HIGH Privilege Escalation
  • MEDIUM Arbitrary File Access
  • MEDIUM Denial of Service (DoS)
  • HIGH Authentication Bypass
// RCE örneği - PHP
// Saldırgan bu payload'ı gönderir:
O:10:"FileWriter":1:{s:8:"filename";s:10:"shell.php";}

// __destruct metodu çalıştığında:
public function __destruct() {
    file_put_contents($this->filename, "<?php system($_GET['cmd']); ?>");
}
// Sunucuda shell.php dosyası oluşturulur!
Gerçek Dünya Örnekleri:
• Apache Commons Collections (Java)
• Ruby on Rails YAML deserialization
• .NET ViewState deserialization
• Python pickle exploits

Sömürü Teknikleri

Insecure deserialization saldırıları çeşitli teknikler kullanılarak gerçekleştirilir:

Gadget Chains
Mevcut sınıflardaki metotları zincirleme şekilde çağırarak istenen sonuca ulaşma tekniği. Saldırgan, uygulamada zaten mevcut olan "gadget"ları kullanır.
// Gadget Chain Örneği class Logger { private $file; private $data; public function __destruct() { file_put_contents($this->file, $this->data); } } class UserPrefs { private $logger; public function __wakeup() { $this->logger->log("User woke up"); } }
Yaygın Magic Methods:
  • • __construct() - Nesne oluşturulduğunda
  • • __destruct() - Nesne yok edildiğinde
  • • __wakeup() - Deserialize sonrası
  • • __toString() - String'e dönüştürülürken
  • • __call() - Olmayan metot çağrıldığında
POP Chain: Property Oriented Programming - PHP'de yaygın kullanılan, nesne özelliklerini kullanarak saldırı zinciri oluşturma tekniği.

PHP Saldırı Örnekleri

PHP'de insecure deserialization saldırılarının en yaygın örnekleri:

// Zafiyet: Kullanıcı verisini doğrudan deserialize etme
<?php
if (isset($_COOKIE['user_data'])) {
    $user = unserialize(base64_decode($_COOKIE['user_data'])); // TEHLIKE!
    echo "Hoşgeldin " . $user->name;
}

// Saldırı payload'ı:
// O:4:"User":2:{s:4:"name";s:15:"<script>alert(1)</script>";s:7:"is_admin";b:1;}
?>
// Daha gelişmiş saldırı - Magic method abuse class FileManager { private $filename; private $content; public function __destruct() { if ($this->filename) { file_put_contents($this->filename, $this->content); } } } // Saldırgan payload'ı: O:11:"FileManager":2:{s:19:"FileManagerfilename";s:9:"shell.php";s:18:"FileManagercontent";s:29:"";}
PHP Object Injection
PHP'de serialize/unserialize kullanımı çok yaygındır. Session verisi, cache, cookie'ler gibi birçok yerde kullanılır. Bu da saldırı yüzeyini genişletir.
PHPGGC Tool: PHP Generic Gadget Chains aracı, yaygın PHP kütüphaneleri için hazır gadget chain'ler sağlar. Penetrasyon testlerinde kullanılır.

Java Deserialization Saldırıları

Java'da deserialization saldırıları tarihsel olarak çok yaygın ve etkili olmuştur:

// Java Deserialization ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); MyObject obj = (MyObject) ois.readObject(); // TEHLIKE! // Apache Commons Collections exploit örneği Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] { String.class, Class[].class }, new Object[] { "getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] { Object.class, Object[].class }, new Object[] { null, new Object[0] }), new InvokerTransformer("exec", new Class[] { String.class }, new Object[] { "calc.exe" }) };
Ünlü Java Zafiyetleri:
• Apache Commons Collections (CVE-2015-4852)
• Spring Framework (CVE-2016-1000027)
• Jenkins (CVE-2016-0792)
• WebLogic Server (CVE-2016-0638)
ysoserial Tool
Java deserialization exploit'leri için en ünlü araç. Çeşitli kütüphaneler için hazır payload'lar içerir.

Korunma Yöntemleri

Insecure deserialization saldırılarından korunmak için alınabilecek güvenlik önlemleri:

En İyi Savunma: Güvenilmeyen kaynaklardan gelen verileri hiç deserialize etmeyin! Bunun yerine JSON gibi güvenli formatlar kullanın.
Korunma Stratejileri:
  • • Avoid Deserialization: Mümkünse hiç deserialize etmeyin
  • • Digital Signatures: Veri bütünlüğünü kontrol edin
  • • Integrity Checks: Checksums, HMAC kullanın
  • • Isolated Environment: Sandbox'ta çalıştırın
  • • Input Validation: Type checking yapın
// GÜVENLI: JSON kullanımı $safe_data = json_decode($_POST['data'], true); if (json_last_error() !== JSON_ERROR_NONE) { die('Invalid data format'); } // GÜVENLI: Digital signature kontrolü $signature = hash_hmac('sha256', $data, $secret_key); if (!hash_equals($signature, $_POST['signature'])) { die('Data integrity check failed'); }
HMAC Doğrulama
Serialize edilmiş verinin değiştirilmediğini doğrulamak için HMAC (Hash-based Message Authentication Code) kullanın. Ancak bu yöntem bile %100 güvenli değildir.

En İyi Güvenlik Uygulamaları

Güvenli kod geliştirme için takip edilmesi gereken en iyi uygulamalar:

Geliştirici Rehberi:
  • • Kullanıcı girdilerini asla doğrudan deserialize etmeyin
  • • JSON, XML gibi text tabanlı formatları tercih edin
  • • Deserialize etmek zorunsa, whitelist yaklaşımı kullanın
  • • Güçlü type checking uygulayın
  • • Minimal yetkiler prensibi uygulayın
  • • Güvenlik araçları ile düzenli test yapın
// GÜVENLI DESERIALIZE EXAMPLE function safe_unserialize($data, $allowed_classes = []) { return unserialize($data, [ 'allowed_classes' => $allowed_classes ]); } // Sadece belirli sınıfları izin ver $user = safe_unserialize($data, ['User', 'UserPreferences']);
Kod İncelemesi: Kodunuzu unserialize(), pickle.loads(), readObject() gibi anahtar kelimeler açısından tarayın.
Güvenlik Araçları
• SAST: Static Application Security Testing
• DAST: Dynamic Application Security Testing
• Burp Suite: Deserialization tespiti
• OWASP ZAP: Automated scanning

Güvenlik Özeti

Temel Kurallar
1. Never Trust: Kullanıcı verisine asla güvenmeyin
2. Avoid Deserialization: Mümkünse deserialize etmeyin
3. Use Safe Formats: JSON, XML tercih edin
4. Validate Everything: Tüm girdiları kontrol edin
5. Monitor & Log: Anomalileri izleyin
6. Regular Updates: Kütüphaneleri güncel tutun

"Güvenlik, tesadüf değil tasarımla gelir." - Security by Design