SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama
SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama

Tüm Kayıtlar

Kategori Güvensiz Deserializasyon / Veri Bütünlüğü
Tipik Önem Derecesi Kritik
OWASP A08:2021 – Yazılım ve Veri Bütünlüğü Hataları
CWE CWE-502: Güvenilmeyen Verinin Deserializasyonu
Diğer adları Nesne Enjeksiyonu, Güvensiz Seri Açma, Serializasyon Zafiyeti
Etkilenen sistemler Java, PHP, Python, Ruby, .NET web uygulamaları; serileştirilmiş nesne kabul eden API'lar; önbellekleme katmanları; mesaj kuyrukları
Yaygın formatlar Java serileştirilmiş akışları, PHP serialize(), Python pickle, .NET BinaryFormatter, YAML, XML (XStream), JSON (tür ipuçlarıyla)

Genel Bakış

Serializasyon, bellekteki bir nesneyi depolanabilir ya da iletilebilir hale getirmek için bayt akışına veya yapılandırılmış metne dönüştürme işlemidir. Deserializasyon ise bunun tersidir: bir nesneyi bu gösterimden yeniden oluşturmak. Güvensiz deserializasyon; bir uygulama, saldırgan tarafından sağlanan ya da etkilenen verileri bütünlüğünü doğrulamadan veya izin verilen nesne türlerini kısıtlamadan deserialize ettiğinde ortaya çıkar.

Deserializasyon işlemi nesne yeniden oluşturma sırasında yapıcı çağrılarını, özellik ayarlayıcılarını ve sihirli metodları tetikleyebildiğinden, serileştirilmiş yükü kontrol eden bir saldırgan çoğunlukla uygulamanın hedeflediğinin çok ötesine geçen sonuçlar elde edebilir — en ağır senaryoda sunucu üzerinde uzaktan kod yürütme (RCE).

Nasıl Çalışır?

Saldırı yüzeyi büyük ölçüde çalışma ortamına ve serializasyon formatına bağlıdır; ancak genel mekanizma tutarlıdır:

  1. Saldırgan kontrolündeki serileştirilmiş veri uygulamaya girer — çerezler, POST gövdesi, HTTP başlıkları, API yükleri, mesaj kuyrukları veya paylaşılan önbellekler aracılığıyla.
  2. Uygulama doğrulama yapmadan deserialize eder — kriptografik imzayı kontrol etmeden, izin verilen sınıfları kısıtlamadan veya alan değerlerini temizlemeden nesneleri yeniden oluşturur.
  3. Araç zincirleri (gadget chain) tetiklenir — saldırgan, nesne grafiği JVM/CLR/yorumlayıcıda hâlihazırda yüklü olan ve bir arada saldırgan tarafından sağlanan komutları yürüten sınıflardan geçen bir yük oluşturur. ysoserial (Java), phpggc (PHP) ve pwnlib (Python) gibi araçlar araç zinciri keşfini ve yük oluşturmayı otomatikleştirir.
  4. Etki gerçekleşir — mevcut araç zincirine bağlı olarak RCE, rastgele dosya okuma/yazma, SSRF, hizmet engeli veya kimlik doğrulama atlatma söz konusu olabilir.

Dile özgü notlar:

  • Java: ObjectInputStream.readObject() klasik giriş noktasıdır. Yaygın kütüphanelerde (Apache Commons Collections, Spring Framework vb.) onlarca araç zinciri mevcuttur.
  • PHP: unserialize(), saldırgan kontrolündeki sınıflar üzerinde __wakeup(), __destruct() ve __toString() sihirli metodlarını tetikler.
  • Python: pickle.loads(), yalnızca bir uygulama hatası değil tasarım düzeyinde bir risk olan __reduce__ protokolü aracılığıyla rastgele Python kodu yürütür.
  • .NET: BinaryFormatter, NetDataContractSerializer ve tür adı çözümlemesi etkin Newtonsoft.Json'daki TypeNameHandling bilinen saldırı yüzeyleridir; Microsoft, BinaryFormatter'ı .NET 5+ sürümlerinde kullanımdan kaldırmıştır.
  • YAML/XML: Tür etiketlerini çözümleyen ayrıştırıcılar (PyYAML yaml.load(), XStream) rastgele sınıfları örnekleyebilir.

İş Etkisi

Başarılı bir sömürü, sunucunun tamamen ele geçirilmesine yol açabilir. Somut sonuçlar şunlardır:

  • Uzaktan kod yürütme: Saldırganlar işletim sistemi düzeyinde erişim kazanarak veri sızdırma, fidye yazılımı dağıtma veya sunucuyu bir pivot noktası olarak kullanabilir.
  • Kimlik doğrulama ve yetkilendirme atlatma: Değiştirilmiş oturum nesneleri veya rol alanları, geçerli kimlik bilgileri olmaksızın yönetici ayrıcalıkları tanıyabilir.
  • Veri bütünlüğü ihlali: Saldırganlar, iş nesnelerini (fiyatlar, miktarlar, kullanıcı kimlikleri gibi) kalıcı hale getirilmeden önce değiştirebilir.
  • Hizmet engeli: Derin iç içe geçmiş veya döngüsel nesne grafikleri, yeniden oluşturma sırasında bellek veya CPU tükenmesine neden olabilir.
  • Yasal yükümlülük: Sunucu ele geçirilmesi genellikle GDPR, HIPAA, PCI DSS ve benzeri düzenlemeler kapsamında ihlal bildirim yükümlülüklerini, ilgili para cezalarını ve itibar zararını beraberinde getirir.

Nasıl Düzeltilir?

  1. Güvenilmeyen verileri deserialize etmekten tamamen kaçının — rastgele nesneler örnekleyemeyen yalnızca veri formatlarını (tür ipuçları içermeyen düz JSON, Protocol Buffers, MessagePack) tercih edin.
  2. Bütünlük doğrulaması uygulayın — serileştirilmiş yükleri HMAC veya dijital imzayla imzalayın ve deserializasyondan önce imzayı doğrulayın. İmzası eşleşmeyen yükleri reddedin.
  3. Deserialize edilebilir türler için katı izin listesi uygulayın — Java'da ObjectInputStream'i, açık bir beyaz listede bulunmayan sınıfları reddeden özel bir resolveClass() ile sarın (örn. Apache Commons IO'nun ValidatingObjectInputStream'i veya JEP 290 seri filtre mekanizması). .NET'te Newtonsoft.Json'da TypeNameHandling.None kullanın ve BinaryFormatter'dan kaçının.
  4. Kullanımdan kaldırılmış serileştiricileri yükseltin veya değiştirin — .NET'te BinaryFormatter'dan, güvenilmeyen veriler için Python'da pickle'dan ve güvenli yükleyici kullanmadan yaml.load()'dan (yaml.safe_load() kullanın) uzaklaşın.
  5. Deserializasyonu korumalı bir bağlamda çalıştırın — başarılı bir saldırının etkisini sınırlamak için deserialize eden süreci düşük yetkili bir hesap, konteyner veya işletim sistemi düzeyinde korumalı alan (seccomp, AppArmor) içinde izole edin.
  6. Bağımlılıkları güncel tutun — araç zincirleri çoğunlukla üçüncü taraf kütüphanelerin zafiyetli sürümlerine dayanır. SCA araçlarını kullanarak bağımlılıkları düzenli olarak denetleyin ve güncelleyin.
  7. Deserializasyon olaylarını kaydedin ve izleyin — aktif tarama girişiminin göstergesi olabilecek beklenmedik sınıf örneklemesi, olağandışı büyük yükler veya deserializasyon hatalarında uyarı oluşturun.
  8. Güvenlik testi yapın — penetrasyon testlerine deserializasyon saldırı yüklerini dahil edin ve maruziyeti doğrulamak için kontrollü ortamlarda ysoserial veya phpggc gibi araçları kullanın. Sensagraph, web uygulamalarındaki güvensiz deserializasyon göstergelerini otomatik olarak tespit eder.

Referanslar

Sıkça sorulan sorular

Serializasyon, bellekteki bir nesneyi depolanabilir veya iletilebilir bir formata (örn. bayt akışı veya JSON dizesi) dönüştürür. Deserializasyon ise ters işlemdir: özgün nesneyi bu gösterimden yeniden oluşturmak. Güvenlik riski deserializasyon tarafında yer alır; zira nesne yeniden oluşturma sırasında saldırganın yönlendirebileceği kod (yapıcılar, sihirli metodlar) yürütülebilir.

Python'un pickle protokolü, serileştirilmiş verinin __reduce__ metodu aracılığıyla rastgele Python opkodları gömmesine olanak tanır. pickle.loads() kötü amaçlı bir yük işlediğinde, konak sistemde herhangi bir Python ifadesini yürütebilir. Bu, yalnızca bir uygulama hatası değil, formatın temel bir tasarım özelliğidir; bu nedenle pickle güvenilmeyen kaynaklardan gelen verileri deserialize etmek için hiçbir zaman kullanılmamalıdır.

Araç zinciri, uygulamanın sınıf yolunda veya kütüphane setinde hâlihazırda bulunan ve birbirine zincirlenerek tehlikeli bir yan etki — genellikle uzaktan kod yürütme — üretebilen sınıf ve metodların bir dizisidir. Saldırganlar, herhangi bir yeni kod eklemeksizin yürütmeyi bu sınıflar üzerinden yönlendiren serileştirilmiş yükler oluşturur.

Tür meta verisi veya polimorfik tür işleme içermeyen düz JSON, nesne oluşturma mantığı yerine veriyi temsil ettiğinden genellikle güvenlidir. Ancak Newtonsoft.Json'da TypeNameHandling Auto veya All olarak yapılandırılmış ya da varsayılan tipleme etkin Jackson gibi tür adı çözümlemesiyle yapılandırılmış JSON kütüphaneleri, ikili serializasyon formatlarıyla aynı nesne örnekleme risklerini yeniden gündeme getirir.

Tespit yaklaşımları şunları içerir: statik analiz (harici giriş işleyen ObjectInputStream.readObject(), unserialize() veya pickle.loads() gibi tehlikeli deserializasyon çağrılarının belirlenmesi), hazırlanmış yüklerle dinamik test (Java için ysoserial, PHP için phpggc) ve deserializasyon sırasında sınıf örneklemesini izleyen çalışma zamanı enstrümantasyonu. Sensagraph gibi otomatik tarama platformları, web uygulamalarındaki bu zafiyetin yüzey düzeyi göstergelerini tespit edebilir.

Ağırlıklı olarak sunucu tarafında bir risk olmakla birlikte, istemci tarafı JavaScript ortamları da eval(), özel dönüştürücü işlevli JSON.parse() veya yürütülebilir davranışa sahip nesneler örnekleyen kütüphaneye özgü formatlar kullanarak verileri deserialize etmeleri durumunda etkilenebilir. En yüksek önem derecesindeki senaryolar — özellikle uzaktan kod yürütme — sunucu tarafında gerçekleşir.