Dosya Yükleme Güvenliği: Upload Pipeline’ını Baştan Sona Test Etme
Kısa cevap
Dosya yükleme güvenliği, uzantı filtresi veya antivirüs taramasıyla tamamlanmaz. Güvenli akış; kullanıcı yetkisini, boyut ve tür doğrulamasını, dosya ayrıştırma izolasyonunu, private storage’ı, indirme davranışını ve asenkron tarama sonucunun iş akışına nasıl bağlandığını birlikte korur. Bir dosya yüklenmiş olması onun güvenilir ya da herkese açık olduğu anlamına gelmemelidir.
Upload özelliği web uygulamasıyla dosya parser’ı, object storage, CDN, preview servisi ve arka plan worker’ları arasında veri taşır. Bu nedenle saldırı yüzeyi sadece upload endpoint’i değildir; dosyanın hangi hostta çalıştırıldığı veya gösterildiği ve kimlerin indirebildiği de kapsam içindedir.
Tür ve içerik doğrulaması
Content-Type, dosya adı ve uzantı istemci kontrollüdür. Önce izin verilen iş gereksinimi türlerini açık allowlist ile tanımlayın. URL decode ve Unicode normalizasyonundan sonra dosya adını doğrulayın; çift uzantı, null byte, büyük/küçük harf ve path separator varyantlarını test edin. Dosya signature/magic byte kontrolü ek bir sinyaldir ama tek başına dosyanın güvenli olduğunu kanıtlamaz.
Parser’ın gerçekten açtığı format ve içerik ayrıca doğrulanmalıdır. Örneğin görsel dönüştürme, PDF metin çıkarımı, Office preview veya arşiv açma işlemleri ayrı parser’lar çalıştırır. Bozuk ama geçerli görünümlü dosya, parser’ı aşırı CPU/bellek kullanmaya zorlayabilir. Boyut yanında pixel sayısı, sayfa, entry sayısı, sıkıştırma oranı, nested archive derinliği ve işlem süresi gibi türe özgü limitler belirleyin.
Dosya adına uygulamanın ürettiği rastgele bir storage key atayın. Kullanıcının gönderdiği ad, dosya yolu olarak kullanılmamalı ve response header’larına güvenli şekilde encode edilmelidir. Dosyayı webroot dışında veya ayrı storage hostunda tutun; indirirken kimlik/nesne yetkisi kontrolünü tekrar uygulayın.
Tarama ve durum makinesi
Antivirüs, sandbox veya Content Disarm and Reconstruction (CDR) adımı kullanılıyorsa bunun upload transaction’ına nasıl bağlandığını modelleyin. Dosya “pending scan”, “clean”, “rejected” veya “scan error” gibi açık durumlardan geçmelidir. Tarama servisi kapalıyken dosyanın otomatik temiz kabul edilmesi fail-open davranışıdır. Kullanıcı dosya durumunu, başka bir hesaba ait ID ile değiştirerek veya erken preview isteği göndererek tarama öncesi içeriğe erişememelidir.
Asenkron pipeline’da queue mesajı, storage key ve tenant bağlamının birbiriyle tutarlı olduğunu doğrulayın. Aynı dosya iki worker tarafından işlendiğinde durum geçişi idempotent olmalı; silinen veya reddedilen bir dosya retry sonrası yeniden yayınlanmamalıdır. Tarama sonucu dosya içeriğini dış bir servise gönderiyorsa, gizli müşteri verisinin bu servise aktarımı için açık veri politikası bulunmalıdır.
| Aşama | Güvenlik kontrolü |
|---|---|
| Upload isteği | Kullanıcı ve tenant yetkili; boyut/kota sınırı var |
| Geçici depolama | Public erişim yok; tahmin edilemeyen key |
| Parser/tarama | İzole kaynak, timeout ve format limitleri |
| Preview | Temiz durum ve kaynak sahipliği doğrulanıyor |
| Download | Her istekte yetki ve güvenli content disposition |
| Silme | Storage, cache, thumbnail ve türevler kaldırılıyor |
İndirme, aktif içerik ve cache
Kullanıcı yüklemeleri HTML, SVG, PDF veya ofis dokümanı olarak aynı origin’de açılırsa stored XSS veya aktif içerik riski oluşabilir. Dosyayı uygulamanın kimlik bilgileri taşıyan origin’inden ayrı bir hostta sunmayı, güvenli Content-Disposition ve X-Content-Type-Options davranışını değerlendirin. Inline preview gerekiyorsa aktif içerik dönüştürülmeli veya sandbox edilmiş bir origin’de gösterilmelidir.
CDN ve cache anahtarlarının yalnızca dosya adına göre belirlenmesi tenant’lar arası indirme karışıklığına yol açabilir. Private dosya URL’sinin süresi, paylaşım kapsamı ve iptal sonrası davranışı tanımlı olmalıdır. URL log veya referrer üzerinden sızarsa erişim ne kadar sürer?
Test planı ve retest kanıtı
- İzin verilen formatlar, maksimum boyut, tarama durumları ve download rollerini çıkarın.
- Sahte MIME, çift uzantı, yanlış imza, bozuk dosya ve sınır boyutlarıyla kontrollü test yapın.
- Tenant A dosyasını Tenant B ile preview/download/silme uçlarında deneyin.
- Tarama servisi kesintisi, queue retry, çift worker, gecikmiş sonuç ve silme senaryolarını test edin.
- İçeriğin ayrı origin, cache ve response header davranışını inceleyin.
- Retest’te reddedilen dosyanın hiçbir türevinin erişilebilir kalmadığını kanıtlayın.
Presigned URL ve parçalı yükleme
Object storage’a doğrudan yükleme için presigned URL kullanılıyorsa imzanın bucket yanında yöntem, nesne anahtarı, boyut ve süreyi de sınırladığını doğrulayın. URL’nin başka kullanıcı adına tekrar kullanılması, yükleme bitmeden nesnenin okunması ve content-type metadata’sının sonradan değiştirilmesi senaryolarını test edin. Multipart/resumable akışlarda parça sayısı, toplam boyut, tamamlanmamış yüklemenin ömrü ve terk edilen parçaların temizliği için limit bulunmalıdır.
Karantinadan yayımlamaya geçiş atomik olmalıdır. Tarama sonucu nesnenin aynı storage key ve checksum’una bağlanmalı; temiz bulunan dosya ile kullanıcının indireceği dosya arasında değişiklik yapılamamalıdır. Aksi hâlde tarama sonrası içerik değiştirme açığı oluşur.
Arşiv ve dönüştürme servisleri
ZIP gibi arşiv türlerine iş ihtiyacı varsa çıkarma öncesi toplam açılmış boyutu, dosya sayısını, nested arşiv derinliğini ve path containment koşullarını denetleyin. Symlink veya ../ yollarının dosyaları karantina dizini dışına yazmadığını güvenli test örnekleriyle doğrulayın. Dönüştürme worker’ı en az yetkiyle, ağ erişimi kapalı veya kısıtlı, ayrı geçici dizin ve kaynak limitleriyle çalışmalıdır. Bir dosya işlenemediğinde hata durumu karantinada kalmalı; kullanıcıya ham parser mesajı veya sunucu yolu gösterilmemelidir.
Dosya upload akışlarını web ve API sınırlarıyla birlikte değerlendirmek için web uygulaması güvenlik testimize bakabilirsiniz.
Güvenlik Doğrulaması
Bu riski kendi sisteminizde test ettirdiniz mi?
Eresus Security; sızma testi, AI ajan güvenliği ve kırmızı takım operasyonlarıyla gerçek istismar kanıtı üretir.
Pilot test talep etAI Security Başlangıç Eğitimi
Prompt injection, RAG veri sızıntısı, MCP riskleri ve model dosyası güvenliği için pratik kontrol listesini e-posta ile isteyin.
İlgili Hizmetler
Kapsam Tahmini
Kapsam görüşmesinden önce tahmini çalışma büyüklüğünü öğrenin.
Tahmini çalışma
5–7 gün