Uygulamalarda dosya yükleme özelliği sayesinde bir çok evrak, resim, video hatta uygulama bileşenleri, uzantılar gibi dosyaların yüklenmesi uygulamaların hem kullanıcılar için daha kullanışlı hale gelmesini sağlarken hemde uygulama sahipleri için ilgili dosyaları işlemede büyük kolaylıklar sağlamakta. Fakat bilindiği gibi bu kullanışlı fonksiyon oldukça esneklik sağlamasına rağmen bir yandan yönetilmesi karmaşık bir güvenlik sorununuda beraberinde getirmektedir. Owasp serilerinden derlenen yazıda bu güvenlik sorunlarıyla ilgili bazı kontrol maddeleri incelenecektir.
Dosya yükleme fonksiyonlarıyla ilgili güvenlik sorunlarına aşağıdaki başlıklarda değinmek önleme yöntemlerini uygulamak için verimli olacaktır.
Zararlı Dosyalar
- Sisteme yüklenen dosyaların ayrıştırılma ve işlenme aşamalarında, bu işlemleri uygulayacak fonksiyonlardaki zafiyetlerin sömürüleceği şekilde kullanılması örneğin: XXE zafiyeti
- Dosyayı dolandırıcılık için kullanmak (örneğin, kariyer formu)
Saldırganlar mevcutta kullanılan bir iletişim formu ya da kariyer sayfasına yükledikleri bir HTML dosyası vasıtasıyla yasal olan bu domainde dışarıya açık ve erişilebilir bir HTML sayfası oluşturabilir. Bu sayede oltalama saldırılarında bu yasal görünen domainde bulunan mevcut sayfa başarılı şekilde kullanılabilir.
- ZIP ya da XML dosyalarının işleyen fonksiyonları hedef alacak şekilde büyük ve iç içe olan dosyaların yüklenmesiyle XML bomb ve Zip bomb saldırıları vasıtasıyla sistem Dos zafiyetine maruz bırakabilir.
- Daha önce kaydedilen zararsız olduğu tahmin edilen bir dosyanın üzerine zararlı dosyanın yazılması
- Yüklenen zararlı dosya yoluyla domaindeki mevcut uygulama üzerinde XSS ve CSRF gibi zafiyetlere yol açılması
Genel Dosya Alımı
Dosya yükleme fonksiyonunun belli kesimlerin kullanımıyla sınırlandırılmaması sebebiyle oluşabilecek güvenlik sorunları aşağıdaki gibidir:
Yüklenen dosyaların gerekli yetki kontrollerinin yapılmaması sonucu ifşa olması
Fonksiyonun yoğun kullanımı sebebiyle DDoS saldırısının meydana gelmesi
Tehlikeli olarak kabul edilebilecek içeriklerin yüklenmesi(Kişisel veri içeren veya telif hakkı içeren dosyalar vb.)
Dosya Yükleme Fonksiyonun Korunması
Uygulamalara yüklenen dosyaların korunması için belirlenen tek bir yöntem yoktur. Yüklenen dosya ve dosyanın kaydedileceği yer gibi konular olduğu için katmanlı savunma yaklaşımı uygulamak daha sıkı bir denetim sağlamayı kolaylaştıracaktır.
Uzantı Kontrolü
Uygulamaya alınması istenen dosyaların uzantıları belirlendikten sonra bu uzantıların filtrelenmesi uygun olan yaklaşımdır. Fakat bazı atlatma teknikleri içinde aşağıdaki yöntemlerin kontrol edilerek gerekli çözümlerin uygulanması gereklidir.
Dosyaya çift uzantı verilmesiyle jpg regex’i atlatılarak php uzantılı dosyanın yüklenmesinin sağlanması
Null bayt eklenmesi ise uzantılar arasına eklendiğinde jpg kısmı kesilir ve php uzantısıyla dosya yüklenmesi
Güvenilir olmayan ve test edilmemiş regexlerin kullanılmasıyla zararlı dosya yüklenmesi
İzin Verilen Dosya Uzantıları
Yalnızca iş akışının sağlanması için gerekli uzantı türlerine izin verilir, diğer uzantılar kabul edilmez.
Örneğin:
İlgili fonksiyonda sadece resim dosyası alınacaksa gereksinimlere uygun olan tek bir türün kabul edilmesine izin verilir,
Özgeçmiş yüklemesi yapılacaksa yalnızca docx ya da pdf dosyalarının yüklenmesine izin verilir,
İhtiyaca göre asgari düzeyde risk barındıran dosya uzantıları belirlenir.
Yasaklanan Dosya Uzantıları
Sisteme zarar verme potansiyeli olan dosyalar incelenebilir. Fakat tek başına bu tür bir kara liste yöntemiyle uzantı engelleme yöntemi zayıf bir koruma yöntemi olacaktır. Bunun yerine beyaz liste yöntemiyle gerekli kısıtların uygulanması uygundur.
Content-Type Header Kontrolü
İçerik tipi kontrolüyle uygulamanın uzantısı istenen formatta dahi gönderilse de bir seviye daha güvenlik kontrolü yapılır. Uygulandığında tamamıyla bir güvenlik sağlanmış olmaz sadece fonksiyonun güvenli kullanımı biraz daha sıkılaştırılmış olunur.
Uygulamaya alınması istenen dosyanın Mime türü belirlenerek White list yaklaşımıyla istenmeyen içerik filtrelenebilir
Dosya İsmi Kontrolü
Dosya adları özel karakterler ve sistemde kullanılan bazı özel isimler kullanılarak tehlike oluşturabilir. Windows için özel karakterler ve dosya isimlerinin kontrolü için linkteki doküman incelenebilir.
Dosyalar sisteme yüklendiğinde,
UUID/GUID ile rastgele diziler oluşturarak dosya isimlerinin verilmesi önemlidir.
Dosya isimleri yoluyla meydana gelebilecek saldırılara karşın izin verilen karakterlerin(tire,nokta, alt çizgi gibi ), dosya isimlerinin ve dosya adları için maksimum uzunluğun kontrol edilmesi önemlidir.
Dosya İçeriğinin Kontrolü
Uygulamaya kabul edilen dosyalar yasadışı içerik barındırabileceği gibi zararlı dosya olarak sisteme yüklenebilir. Dosyanın yüklendiği dizinde bir takım dosyaya ait içerik kontrolleri sağlanır.
Kabul edilen dosya türüne göre özel içerik kontrolleri yapılabilir. Örneğin bir resim dosyası alınıyorsa bu resim dosyasının tekrardan resim oluşturma fonksiyonu kullanılarak bu görüntüye eklenen kötü amaçlı içeriğin yok edilmesi sağlanabilir.
Yeterli kaynak varsa yasa dışı dosyalara karşı otomatize yöntemlerin yanında manuel kontrolünde sağlanması gerçekleştirilebilir.
Endpoint koruması sağlayan ürünler artık genellikle sandbox ve makro kontrolü sağlayan teknolojilere sahiptir. Bunların tercih edilirken yine de kullanım kolaylığı ve fonksiyonalitesi kontrol edilmelidir.
Virus total gibi Api’lar aracılığıyla bilinen zararlı yazılım hashlerine karşı dosyalar taranabilir.
Bazı framework’lerde bulunan ham dosya içeriği ve dosya tipi kontrolleride uygulanmalıdır.
Dosya Yükleme Konumu
Dosyaların saklanması gereken konum güvenlik ve iş gereksinimlerine göre seçilir. Örneğin aşağıdaki maddeler güvenlik önceliğine göre değerlendirebilir.
Dosyaların, kullanıcıların eriştiği uygulamanın tutulduğu sunucudan başka bir yerde depolanması
Dosyaların uygulamanın sunucuda bulunduğu kök dizinin dışında tutulması ve bu dizine yalnızca yönetici haklarına sahip kullanıcının erişebilmesi
Dosyaların sadece yazma izni verilerek uygulamanın bulunduğu kök dizinin içinde tutulması. Eğer okuma iznide gerekiyorsa bu işlemi yapabilecek kullanıcı ve internal Ip adresi tanımlanması.
Dosyaların bu şekilde depolanması yedekleme ve dosya izinleri gibi farklı güvenlik tedbirlerinide göz önünde bulundurmayı gerektirmektedir. Ayrıca dosya sistemleriyle ilgili bu değişiklerin yapılması performansla ilgili konularında ele alınmasını gerektirebilir.
Kullanıcı İzinleri
Dosya yükleme fonksiyonlarına uygulamada iki seviyeli bir kullanıcı doğrulamasıyla erişilmelidir.
Kimlik Denetimi
Dosya yükleme fonksiyonuna uygulamaya daha önce kayıt edilmiş ya da mevcuttaki kayıt sayfası aracılığıyla kayıt olabilen, tanımlanabilir kullanıcılar erişmelidir.
Yetki Düzeyi
Kullanıcının dosyalara erişmek veya bunları değiştirmek için uygun izinlere sahip olması gerekir.
Dosya Sistemi İzinleri
Dosya izinleri aşağıdaki maddelerdeki gibi ayarlanmalıdır:
Dosya izinleri mümkün olan en düşük ayrıcalık seviyesine göre ayarlanmalı.
Dosyaları sadece izin verilen sistem kullanıcıları okuyabilmelidir.
Bir dosyanın uygulamada depolanması için yalnızca yazma yetkisi gerekiyor ve yetiyorsa okuma izni verilmemelidir.
Çalıştırılabilir bir dosya yüklenmişse, çalıştırılmadan önce zararlı dosya olmadığından emin olunması için taranmalıdır.
Yükleme ve İndirme Limitleri
Dosya yükleme fonksiyonuyla sisteme yüklenecek dosyaların boyutunun kontrol edilmesi gereklidir.
Dosya yüklendikten sonra örneğin bir zip dosyasıysa ve bu dosya yüklendikten sonra uygulama tarafından klasöre çıkarılacaksa, bu dosyanın boyut kontrolü yapılmalıdır. Aksi halde dosya üzerinde bir DoS saldırısı meydana getirecektir. Ayrıca zip bomb gibi saldırıların önüne geçilmesi için bu tür dosyaların önceki adımlarda bahsedildiği gibi taranması ve ardından açılması önerilir.
Dosya indirme fonksiyonu içinde yine benzeri şekilde iş akışınıda engellemeyecek şekilde sınırlamalar eklenmelidir. Bu istek sınırlamaları olası bir DoS atağını engelleyecektir.
Genel olarak dosya yükleme fonksiyonlarındaki zafiyetleri önlemek için oluşturulabilecek özet liste aşağıdaki gibidir:
Sadece uygulamada kullanılacak olan dosya izinlerinin listelenmesi. Bu listedeki uzantıların güvenliği tehdit etmeyecek şekilde seçilmesi ve uygulanması,
Uzantıları doğrulamadan önce dosya adının kontrolü, zararlı girdilere karşı ve dosyanın gerçekten istenen formatta olduğunu anladıktan sonra yapılması önemlidir.
Content-Type başlığının doğrulanması, tamamen bu adıma güvenilmemelidir çünkü bu başlık sahte olabilir.
Dosya adının uygulama tarafından oluşturulan farklı bir adla değiştirilmesi,
Dosya adı uzunluğu sınırının belirlenmesi, mümkünse, yalnızca izin verilen karakterlerin kullanıldığı dosya adlarının sisteme yüklenmesi,
Dosya boyutu limiti belirlenmesi,
Yalnızca yetkilendirilmiş kullanıcıların dosya yüklemesine izin verilmesi,
Dosyaları farklı bir sunucuda saklayın. Bu mümkün değilse, dosyaları web kök dizininin dışında saklanması,
Dosya isimlerine direkt ulaşılamaması gibi güvenlik sorunlarına önlem olmak amacıyla tüm dosya adlarının kullanıcı ve dosya adı şeklinde eşleştirilmesi
İçerik kontrolü için antivirüs ve sandbox kontrollerinden dosyaların geçirilmesi,
Kullanılan kütüphanelerin güvenli bir şekilde yapılandırıldığından ve güncel tutulduğundan emin olun.
Saldırganların Csrf zafiyeti yoluyla istenmeyen dosyaları yüklememesi için önlemin alınması
Kaynak: https://github.com/advisories/GHSA-9prm-jqwx-45x9
https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html