WAF ve Antivirüs Dosya Yükleme Saldırıları Neden Görmüyor
WAF ve Antivirüs Dosya Yükleme Saldırılarını Neden Görmez, Yük Bir Açık Değil Bir Özelliktir
Kurumların çoğu dosya yüklemeyi "çözülmüş" bir konu sayar. Önde bir WAF, ortada bir antivirüs tarayıcı, uygulamada uzantı ve MIME kontrolü, sonda bir storage bucket. Sonra popüler bir framework'te kritik bir upload zafiyeti açıklanır ve tüm varsayım çöker — çünkü dosya zararlı değildir; dosyayı render eden yazılımın, kimsenin kastetmediğinden çok daha fazlasına gücü yeter.
Temel değerlendirme: Tehlikeli upload mimarisi nadiren saklanan nesneyle ilgilidir. Mesele, saldırganın kontrol ettiği baytları dosya, ağ ve süreç yetenekleri olan bir ayrıştırıcıdan geçiren sunucu tarafı dönüştürme motorundadır: optimizasyon araçları, thumbnail üreticileri, PDF ve Office render'ları, video transcoder'ları. WAF taşımayı inceler, antivirüs bilinen-kötü içeriği inceler. İkisi de kendi dönüştürücünüzün kusursuz biçimli bir dosyayla neler yapabildiğini incelemez. Bu kör nokta yapısal bir eksikliktir, kural tuning'iyle kapanmaz.
İki Farklı Araç, İki Farklı Başarısızlık
WAF ile antivirüsü aynı şey saymak, kapsama iddiasının şişirilmesinin ana sebebidir. İkisi de alakasız sebeplerle kaçırır.
WAF bir taşıma denetleyicisidir. İstek metnini imzalarla eşleştirir, hız sınırı uygular, IP itibarına bakar, kodlama-normalizasyon yapar. Analiz birimi HTTP isteğidir. Multipart gövde kabul edilip geçici dosyaya yazıldıktan sonra WAF işini bitirmiştir. Uygulamanızın o dosyayı, 200'e yakın format işleyicisine sahip bir dönüştürücüye vereceğini bilmez. "MSL betiğine mutlu bir dosya yolu referansı veren SVG" gibi bir kural yoktur, çünkü eşleşen şey bir string değil — başka bir sürecin içindeki davranış zinciridir.
Antivirüs bir içerik eşleştiricidir. "Bu baytları ya da bu biçimde bir baytı daha önce gördüm mü?" sorusuna cevap verir. Format istismarı yükü genellikle zararlı yazılım değildir: geçerli bir imaj kapsayıcısı, hukuki bir vektör dokümanı ya da başlık alanı iç tamponu taşıran bir sıkıştırma akışıdır. Temiz bir dosyayı "temizlemek" antivirüsün tasarım gereği yapmadığı işidir. Üstelik çoğu zaman nesne dinlenirken veya teslim edilirken çalışır, ayrıştırma sırasında değil; yani istismar tetiklenirken tarayıcı boştadır.
Sonuç: aynı kontrol denetim listesinde iki kez görünür ama hiçbiri bu sınıfı engellemez. Kapsama cümlesi "bilinen-kötü içeriği ve bilinen-kötü istek örüntülerini tespit ediyoruz" diye yazılmalı; "upload istismarını engelliyoruz" diye değil.
Dönüştürücü Aslında Neyi Açıyor?
Medya araçları onlarca yıl format ekleyerek büyüdü; her format kendi davranışını taşıdı. Yetenek bazında gruplayalım:
Format kodlayıcıları. Görüntü ve doküman araçları format başına bir işleyici kaydeder. Bazı işleyiceler düşmanca girdi için hiç tasarlanmadı ve dosyanın içindeki direktifleri yorumlar: dosya yeniden adlandırabilen, taşıyabilen, yazabilen yerleşim/betik formatları; harici referans gömabilen vektör formatları; yol metadata'sı taşıyan kapsayıcılar. Tek bir kabul edilen yükleme tipi, motor nesneyi çözerken iç referansları izlediği için düzinelerce ikincil ayrıştırıcıyı dolaylı olarak devreye sokabilir.
Delegate'ler. Motorlar, yerel olarak işlemedikleri formatlar için çoğunlukla uzman kütüphanelere dışarıdan çağrı yapar: doküman rasterizasyonu, font render, raw kamera formatları, video akışları. Her delegate, kendi yüzeyi ve kendi yetkileri olan ayrı bir binary'dir. Sarmalayıcıyı yamalamak delegate'i yamalamaz.
Protokol işleyicileri. Dönüştürücüler sıklıkla bayt değil referans kabul eder: vektör dokümanında veya CSS'te uzak görsel URL'i, arşiv üyesi, stil sayfası konumu. Bu, imaj hattınızı alışılmadık parmak izine sahip bir SSRF istemcisine çevirir — içerideki metadata servislerine ulaşabilir ve çoğu zaman cevabı render edilmiş bir artefaktın içine kodlayarak dışarı taşıyabilir.
Çıktı adlandırması. Çıktı yolu, geçici dosya adları ve cache anahtarları sıklıkla saldırganın etkileyebildiği değerlerden türetilir (orijinal dosya adı, istenen dönüşüm adı, türetilen kimlik). Buradaki path traversal klasik anlamda bir upload açığı değildir; yüklemenin saldırgan kontrollü olması sayesinde erişilebilir hale gelen bir dosya adlandırma açığıdır.
Kaynak sınırları. Açılma oranı (decompression ratio), tuval boyutları, tile sayıları, özyineleme derinliği saldırı düğmeleridir. Küçük bir dosya devasa bir ayrılmaya dönüşebilir. Bu sınıf, bir imaj yüklemeyi kilitleri durduran bir servis kesintisine ya da bir ayrıştırma yolunun çalıştığını kanıtlayan zamanlama oracle'ına çevirir.
Bu Sınıf Pratikte Üç Biçimde Beliriyor
- Format güdümlü okuma. Ayrıştırıcı, hedeflenen nesnenin dışındaki baytları (config dosyası, anahtar, içerideki bir servisin cevabı) dahili kılınmaya ikna edilir ve bunlar render çıktısına gömer. Dışa aktarım kanalı çıktının kendisidir; ek ağ erişimi gerekmez.
- Format güdümlü yazma. Ayrıştırıcı, saldırganın seçtiği yola saldırganın kontrol ettiği baytları yazmaya ikna edilir. Web uygulamalarında bir yazma primitifi + erişilebilir ve çalıştırılabilir bir konum eşittir kod çalıştırma. Framework seviyesindeki "kritik" uyarılar bu biçimden çıkar.
- Hattaki SSRF. Motora bir referans verilir ve motor itaatle çekir. Çekme işlemi bir dönüşüm süreci içinde gerçekleştiği için, genellikle web katmanınızdan farklı bir ağ konumu ve farklı bir çıkış politikası vardır. Tam da bu yüzden, istek doğrulamanızın engellemek için tasarlandığı yerlere ulaşır.
Üçü de WAF'ı atlar çünkü istek biçimce geçerlidir. Üçü de antivirüsü atlar çünkü dosya biçimce geçerlidir. Zafiyet, ayrıştırıcıya verilmiş yetki devridir.
Değerlendirmede Nasıl Kanıtlanır
Kanıtsız iddia gürültüdür; ekipler bu bulguları haklı olarak yeniden test eder. Yöntem:
- Farklılaştırılmış ayrıştırma. Mantıksal olarak aynı imajı, motora ulaşan her kabul edilen girdi tipinden gönderin. Davranış kapsayıcıya göre değişiyorsa ikincil ayrıştırıcılar kapsamdadır ve yüzey, ürün sahibinin düşündüğünden büyüktür.
- Canary okuma. Ayrıştırıcıyı, içeriği gizli olmayan ama doğrulanabilir bir dosyaya yöneltin ve bu içerik render artefaktında, metadata'sında ya da yanıt boyutunda beliriyor mu bakın. Beliriyorsa bir dahil etme (inclusion) primitifi vardır.
- Kör doğrulama. Dönen bir şey yoksa, ayrık bir DNS/HTTP kanalında out-of-band callback kullanın ve isteği web katmanına değil dönüşüm işçisine atfedin. Callback hem primitifi hem ağ konumunu kanıtlar.
- Sınırlı yazma. Yetkili testte asla web shell bırakılmaz. Benzersiz adlandırılmış etkisiz bir dosyayı öngörülebilir bir yola yazın, indiğini kanıtlayın, servis edilip edilmediğine ve çalıştırılıp çalıştırılamadığına bakın, sonra silin. Kanıt gereksinimi "ihlal" değil, **"sınırsız yazma primitifi"**dir.
- Politika parmak izi. Motorun sürümünü ve etkin politikasını sorgulayın: hangi formatlar açık, hangi delegate'ler çözülebilir, ağ izni var mı, dosya sistemi salt-okunur mu bağlanmış. Bulgu, varsayılanlara dair varsayımdan değil artefaktın kendisinden üretilmeli.
- Asenkron etki alanı. Arka plan işçisiyle işlenen yüklemeler işçinin bağlamında test edilmeli. İstek/yanıt sürecinde zararsız bir yol, dönüştürücüde imtiyazlı olabilir.
Sertleştirme, Güvenilirlik Sırasıyla
1. Kapsayıcıya güvenmeyi bırakın. Sihirli bayt (magic bytes) ve başarılı çözme ile doğrulayın; sonra yalnızca çözülmüş içeriği var sayın. Uzantı, bildirilen MIME ve content-sniffing kütüphanesinin çıktısı ipucudur, yetkilendirme değil.
2. Pikseli ayrıştırıp kanonik formata yeniden kodlayın. Bu sınıftaki en güvenilir kontrol şudur: imajı ham piksele çözün, geri kalan her şeyi atın ve yeni bir dosya üretin. Bu tek adım gömülü direktifleri, metadata'yı, harici referansları ve ikincil format yüklerini imha eder. Vektör ve doküman formatları bu kısayolu kullanamaz; onlar daha izole bir şeritte işlenmelidir.
3. Render etmediğiniz şeyi kapatın. Bir-iki format çözmek üzere yapılandırılmış bir motor, varsayılan kurulumdan bir büyüklük mertebesi daha küçük yüzeydir. Efor/etki oranı çok yüksek bir konfigürasyon kontrolüdür ve her yükseltmeden sonra yeniden doğrulanmalı; çünkü yükseltmeler rutin olarak delegate'leri tekrar açar.
4. İşçiyi izole edin. Ayrı host ya da container, kimlik bilgisi yok, salt-okunur kök dosya sistemi, dışa ağ çıkışı yok, CPU/bellek/duvar saati/çıktı boyutu sınırları, düşürülmüş yetenekler (capabilities), bağımsız mount'ta geçici çalışma alanı. Ayrıştırıcının bir gün istismar edileceğini varsayın ve komşuları ona göre tasarlayın.
5. Çıktı yolunu siz üretin. Dosya adları ve storage anahtarları sunucu tarafında üretilir, asla kullanıcı girdisinden türetilmez. Kaçınılamaz bir ön ek zorlayın ve normalizasyon sonrası çözümlenmiş yolu doğrulayın.
6. Depolama ile çalıştırmayı ayırın. Yüklemeler özel object storage'a düşer, servis edilen bir document root'a asla. Dosyalar diske yazılıyorsa o konum çalıştırılamaz, statik servis edilemez olmalı; Content-Disposition ve kısıtlayıcı content type ile sunulmalıdır.
7. Asenkron geçişi kapılayın. Kuyruğa girmiş dosya taranmamış ve doğrulanmamıştır. Uygulama durumu "kabul edildi"ni "güvenli"yle eşdeğer tutmamalı; önizlemeler güven ima eden bir durumdan üretilmemeli.
8. Ölçün ve sürüm sabitleyin. Her motor ve delegate'in tam sürümünü ve etkin politikasını kaydedin. Sürüm gözetimi olmayan bir upload kontrolü, her base-image güncellemesinde sessizce geriye gider.
Karar Tablosu
| Durum | Risk | Öncelikli aksiyon |
|---|---|---|
| Dönüştürücü web süreciyle aynı yetkide çalışıyor | Uzaktaki dosya yazma uygulama ihlaline dönüşür | Her şeyden önce dönüşümü izole işçiye taşı |
| Upload kontrolü olarak WAF + antivirüs söylenmiş | İkisi de ayrıştırma davranışını görmez | Yeniden kodlama, delegate kapatma, izolasyon ekle |
| Ofis/PDF/SVG render ediliyor | En yüksek yetenekli ayrıştırıcılar stack'te | Hattı ayır, çıkışı kapat, ayrı çıktı bucket'ı kullan |
| Kullanıcıdan URL alan bir form var | Hattaki SSRF ve iç port keşfi | Yönlendirme sonrası çözülen IP'ye göre allow-list, link-local kapat |
| Özellik uzun süredir kamuya açık | Dahil etme ve yazma primitifleri varsay | Logları sakla, diskte benzersiz adlı artefaktları ara, çıkış loglarını incele |
Kontrol Listesi
- Tür doğrulaması sihirli bayt ve başarılı çözme ile yapılıyor.
- İmajlar kanonik formata yeniden kodlanıyor; gömülü direktifler hayatta kalamıyor.
- Yalnızca gerekli format işleyiceleri açık, her yükseltme sonrası doğrulanıyor.
- Delegate'ler sürümleriyle envanterlenmiş, gereksizler kaldırılmış.
- Dönüşüm, kimlik bilgisi ve ağ çıkışı olmayan izole işçide çalışıyor.
- Salt-okunur kök FS, ayrı scratch mount, CPU/bellek/süre/çıktı limitleri tanımlı.
- Dosya adı ve storage anahtarları sunucu tarafından üretiliyor, normalizasyon sonrası kontrol var.
- Yüklenen nesneler özel storage'da, servis edilen document root'ta değil.
- Kuyruk durumu, uygulama modelinde "doğrulanmış" durumundan ayrışıyor.
- Motor sürümü ve etkin politika deployment artefaktı olarak kaydediliyor.
- Kör ayrıştırma yolları için out-of-band doğrulama mevcut.
- Kapanan her bulgu için retest kriteri yazılı.
Ne Zaman Dış İnceleme Gerekir?
Üç koşul birlikteyse: yüklemeler kimliği zayıf ya da çok geniş bir kitleye açıksa, dosyalar üçüncü taraf bir medya/doküman motorundan geçiriliyorsa ve ekipte kimse motorun açık formatlarını ve delegate'lerini sayamıyorsa. Bu kombinasyon, ayrıştırıcıya verilen yetkinin hiç incelenmediği anlamına gelir; sınıf zaten tam olarak buradadır. Eresus Security bu yolu uçtan uca test eder; üretilmiş artefaktı, etkilenen işçi bağlamını, hangi yetki sınırının başarısız olduğunu ve retest kriteriyle birlikte verir. Yakın disiplinler: dosya yükleme pipeline testi, web uygulaması sızma testi ve API güvenliği testi.
Sıkça Sorulan Sorular
İyi bir WAF kural seti zararlı yüklemeleri durdurmaz mı?
WAF bariz taşıma katmanı ihlallerini durdurur: aşırı büyük gövde, bozuk multipart çerçeveleme, query parametresindeki bilinen istismar stringleri, şüpheli istek hızı. Fakat "bu PNG yapısal olarak geçerli ama render'ı scratch dizininin dışına dosya yazmaya yönlendiriyor" ifadesini kuramaz; çünkü kötücül kısım meşru bir format özelliğidir ve başka bir süreç tarafından tüketilir. İstek kabul edildikten sonra WAF'ın saldırı modeli biter.
Her yüklemeyi antivirüsten geçiriyorsam kapsanmış olur muyum?
Bilinen-kötü içerik için evet. Ayrıştırıcı istismarı, kaynak tükenmesi, çıktı adlandırmasındaki path traversal ve motorun başlattığı sunucu taraflı istekler için hayır — hiçbiri bir tarayıcıya zararlı gibi görünmez. Antivirüsü saklayın, ama depolayıp dağıttığınız içerik için bir filtre olarak; ayrıştırma izolasyonunun yerine değil.
Sadece format ve delegate kapatmak yeterli mi?
Yüzeyi ciddi ve ucuza küçültür, bu yüzden listede yüksekte durur. Yine de tek başına yeterli değildir: kalan işleyici ve delegate'ler, sürecin sahip olduğu yetki, dosya sistemi görüşü ve ağ konumuyla çalışmaya devam eder. Sonucu sınırlandıran şey izolasyondur.
Otomatik tarayıcılar bu sınıfı güvenle bulur mu?
Tarayıcılar ucuz sinyallerde işe yarar: doğrulama eksikliği, aşırı boyutlu yükleme, storage izin hataları, URL alanındaki bariz SSRF. Bu sınıfta zayıftır, çünkü kanıt format-specific yük üretimi, render artefaktına erişim ve çoğu zaman asenkron işçi sınırında out-of-band atıf gerektirir. Bu manuel ve kanıta dayalı bir testtir.
Sonraki Adım
Sırayla WAF'ın tek başına yetmediği yer, sonra taşıma tarafındaki kör noktalar için HTTP metot varyansı ve WAF atlatma ve depolama, önizleme, indirme yetkilendirmesi için upload pipeline'ının uçtan uca testi okunmalıdır.
AI 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 Araştırmalar
WAF (Web Application Firewall) Bizi Hacklenmekten Neden Tek Başına Korumaz?
Şirketiniz pahalı bir Cloudflare veya F5 WAF kullanıyor olabilir. Peki WAF, iş mantığı (business logic) hatalarında neden tamamen kördür? Manuel sızma...
Application SecurityDosya Yükleme Güvenliği: Upload Pipeline’ını Baştan Sona Test Etme
Dosya upload akışlarında doğrulama, parser izolasyonu, depolama, indirme yetkisi, tarama ve asenkron pipeline riskleri için uygulamalı rehber.
Web SecurityRFC 10008 HTTP QUERY Metodu: WAF ve Reverse Proxy’ler İçin Yeni Test Yüzeyi
RFC 10008 ile standartlaşan HTTP QUERY metodunun safe/idempotent semantiğini, gövdeli istek davranışını ve WAF, cache, CSRF, CORS ile proxy zincirinde doğrulanması gereken kontrolleri inceliyoruz.
Uygulama GüvenliğiDAST Bulgusunda Önem Derecesi Yetmez: HTTP Kanıtı ve OAST Callback’leri
Bir DAST bulgusunu doğrulamak için istek, yanıt, kapsam ve bant dışı kanıtları nasıl inceleyeceğinizi anlatan uygulamalı rehber.
İlgili Hizmetler
Kapsam Tahmini
Kapsam görüşmesinden önce tahmini çalışma büyüklüğünü öğrenin.
Tahmini çalışma
5–7 gün