Python'da Güvensiz YAML Serileştirme Açıkları ve Korunma Yöntemleri

0 Yanıt 0 Görüntülenme
Puanlayanlar
Katılımcılar
Konuyu Açan #1
Python Unsafe YAML Deserialization Açıkları

YAML, okunabilirliği yüksek ve yapısal verileri temsil etmede oldukça kullanışlı bir formattır. Ancak, Python projelerinde özellikle PyYAML gibi kütüphaneler kullanılırken dikkat edilmesi gereken kritik bir güvenlik açığı söz konusudur: Güvensiz YAML deserialization. Bu açık, özellikle kullanıcıdan alınan veya dışarıdan gelen YAML verilerinin doğrudan yaml.load() fonksiyonuyla işlenmesiyle ortaya çıkar.

İşte bu açığın temel noktaları ve detayları:

  • Güvensiz yaml.load() kullanımı: PyYAML'de yaml.load() fonksiyonu, varsayılan olarak tüm YAML içeriğinin Python nesnelerine dönüştürmesine izin verir. Bu da, özellikle kötü niyetli bir kullanıcının özel nesneleri veya komutları içeren YAML verisi göndermesi halinde, kodunuzu çalıştırabilir hale getirir. Bu durumda, örneğin !!python/object/apply: gibi yapılar kullanılarak tehlikeli fonksiyonların tetiklenmesi mümkündür.


  • Tehlikeli nesne ve komutlar: YAML içeriği, Python'un özel nesne ve fonksiyonlarına referans verebilir. Özellikle !!python/object/apply: veya !!python/name: gibi etiketler, zararlı kodların çalıştırılmasına olanak sağlar. Örneğin, bu yapılar kullanılarak sistem komutları veya dosya işlemleri tetiklenebilir.


  • Örnek saldırı senaryosu: Kötü niyetli bir kullanıcı, aşağıdaki gibi bir YAML verisi gönderebilir:

!!python/object/apply:os.system ["rm -rf /"]

Bu, os.system fonksiyonunu tetikler ve sistemde zararlı bir komut çalıştırabilir.

  • Güvenli alternatifler: PyYAML'de yaml.safe_load() fonksiyonu, sadece temel veri tiplerini (dize, sayı, liste, sözlük) yükler ve nesne oluşturma gibi tehlikeli işlemleri engeller. Bu nedenle, kullanıcıdan gelen YAML verilerini işlerken mutlaka safe_load() tercih edilmelidir.


  • En iyi uygulamalar:
  • Kullanıcıdan alınan YAML verilerini asla doğrudan yaml.load() ile yüklemeyin.
  • Güvenli hale getirilmiş safe_load() fonksiyonunu kullanın.
  • Eğer nesne yükleme gerekiyorsa, tamamen kontrolünüz altında ve güvenli bir ortamda özel deserialization işlemleri geliştirin.
  • Ayrıca, Python ortamınızı ve kütüphanelerinizi güncel tutarak bilinen açıkların kapatıldığından emin olun.


Sonuç olarak, YAML deserialization işlemlerinde güvenlik en az kodun doğru çalışması kadar kritiktir. Güvenli olmayan yaml.load() kullanımı, büyük çaplı güvenlik açıklarına yol açabilir ve sisteminizin kontrolünü kaybetmenize neden olabilir. Güvenli kod yazma pratikleri ve uygun fonksiyon tercihleri, bu tarz açıkların önüne geçmek için temel unsurlardır.

Yanıt vermek için giriş yapmış olmalısınız.

Bu konuyu görüntüleyen kullanıcılar (Toplam: 1, Üyeler: 1, Misafirler: 0)
Toplam: 1 (üyeler: 1, misafirler: 0)
0 alıntı seçildi