Python Zip Slip Açığı ve Korunma

0 Yanıt 0 Görüntülenme
Puanlayanlar
Katılımcılar
Konuyu Açan #1
Giriş ve Temel Kavramlar
Python projelerinde sıkça kullanılan zip dosyalarını işlerken, "zip slip" adı verilen ciddi bir güvenlik açığıyla karşılaşmak mümkündür. Bu açık, kötü niyetli bir kullanıcının zip arşivleri içindeki dosya yollarını manipüle ederek, sistemde istenmeyen dizinlere veya kritik dosyalara erişim sağlamasına imkan tanır. Özellikle, zip arşivleri otomatik olarak açılırken veya içeriği okunurken bu açık devreye girebilir.

Zip Slip Açığının İşleyişi
Zip slip, temel olarak arşivdeki dosya yollarının normalize edilmeden veya uygun kontroller yapılmadan doğrudan dosya sistemine yazılmasıyla oluşur. Örneğin, bir zip dosyası içerisinde aşağıdaki gibi bir giriş yer alabilir:
  • "../../../../etc/passwd" veya "..\\..\\..\\..\\Windows\\system32\\config\\sam" gibi.
    Bu yollar, dizin kırma (directory traversal) saldırıları gerçekleştirerek, hedef sistemde kritik konumlara erişim sağlar. Python'da zipfile modülü kullanılırken bu risk, özellikle path manipülasyonları dikkat edilmeden yapıldığında ortaya çıkar.

    Korunma Yöntemleri ve En İyi Uygulamalar
    Zip slip açığını önlemek için birkaç temel güvenlik önlemi alınabilir:
    [list]
  • Dosya yolunu normalize etme: os.path.normpath() fonksiyonuyla girişleri normalize etmek, dizin kırma girişimlerini tespit etmekte etkilidir.
  • Güvenli listeleme ve filtreleme: Dosya adlarını ve yollarını açmadan önce, belirli güvenlik kriterlerine göre filtrelemek gerekir. Örneğin, sadece belirli alt dizinlere izin vermek veya zararlı karakterleri engellemek.
  • Hedef dizini sınırlandırma: Dosyaların açılacağı veya kopyalanacağı dizini sabit ve kontrol altında tutmak. Bu sayede, arşivdeki herhangi bir giriş, başka bir konuma sızmaya çalışsa bile, izin verilen dizin sınırlarını aşamaz.
  • Kod örneğiyle güvenlik uygulaması:
    KOD
    1234567891011121314151617  
    import os  
    import zipfile  
      
    def safe_extract(zip_path, extract_to):  
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:  
            for member in zip_ref.namelist():  
                # Normalize yol  
                normalized_path = os.path.normpath(member)  
                # Güvenli olmayan karakterleri veya dizin kırma girişimlerini engelle  
                if normalized_path.startswith("..") or os.path.isabs(normalized_path):  
                    continue  
                # Hedef dizini sınırla  
                target_path = os.path.join(extract_to, normalized_path)  
                if os.path.commonpath([extract_to, target_path]) != extract_to:  
                    continue  
                zip_ref.extract(member, extract_to)  
    

    Burada, os.path.normpath() ile yol normalize edilip, dizin kırma girişimleri engelleniyor. Ayrıca, os.path.commonpath() kullanılarak, çıkış dizinini aşan girişler filtreleniyor.

    Sonuç ve Değerlendirme
    Python'da zip slip açığı, uygun önlemler alınmadığında ciddi güvenlik riskleri doğurabilir. Dosya yolu manipülasyonlarına karşı katı kontroller ve güvenlik pratikleri uygulamak, sisteminizi bu tür saldırılardan koruyabilir. Bu nedenle, arşiv içeriğiyle çalışırken her zaman yol temizliği ve sınırlandırma yöntemlerini kullanmak kritik önem taşır.
  • Yanıt vermek için giriş yapmış olmalısınız.

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