OWASP API Top 10:2023 – Broken Object Property Level Authorization: Verinin Görünmeyen Tehlikesi
Modern uygulamalar kullanıcı dostu arayüzler sunarken, arka planda dönen API çağrıları büyük bir sorumluluğu da beraberinde getiriyor: doğru veriyi doğru kullanıcıya sunmak. Ancak bu süreçte yapılan küçük bir ihmal, büyük bir güvenlik açığına dönüşebilir. OWASP API Top 10:2023 listesinde üçüncü sırada yer alan Broken Object Property Level Authorization, yani nesne özellikleri düzeyinde kırık yetkilendirme, bu tip kritik açıklardan biri. Serimizin ikinci bölümünde bu konuyu detaylıca ele alıyoruz.

Bu tür bir açık, sadece nesnenin tamamına değil, nesne içindeki her bir özelliğe yönelik ayrı ayrı yetkilendirme kontrollerinin yapılmaması durumunda ortaya çıkar. Yani, kullanıcıların yalnızca erişim hakkı olan alanları görmesi veya değiştirebilmesi gerekirken, sistem buna dair bir kontrol gerçekleştirmiyorsa tehlike çanları çalıyor demektir. Sıklıkla, istemci tarafındaki arayüzler sadece yetkili alanları gösterse de, arka planda çalışan API bu alanlara erişimi engellemediğinde hassas veriler istem dışı olarak açığa çıkabilir.
Gerçek hayatta bu açık kendini farklı şekillerde gösterebilir. Örneğin, bir kullanıcı API’ye gönderdiği bir POST ya da PUT isteğinde isAdmin: true gibi bir alanı manuel olarak ekleyebilir ve eğer sistem bu bilgiyi doğrulamadan işlerse, o kullanıcıya yönetici yetkileri verilmiş olur. Bir başka örnekte, kullanıcıya yalnızca e-posta adresi dönmesi gerekirken, API yanıtı içerisinde passwordHash, userRole veya createdBy gibi oldukça hassas bilgiler de yer alabilir. Bu durum, sadece gizliliği ihlal etmekle kalmaz, sistemin bütünlüğünü de tehdit eder.
Bu zafiyetin en kritik yanı, çoğu zaman fark edilmemesidir. Çünkü istemci tarafı sadece görünmesi gereken alanları sunduğu için geliştirici veya test ekipleri, arka planda dönen API yanıtlarını göz ardı edebilir. Ancak bu alanlara manuel yollarla ulaşan bir kişi, aslında istemcide görünmeyen, fakat API tarafından döndürülen tüm bilgileri görüntüleyebilir, hatta bazılarını değiştirebilir. Kötü niyetli biri için bu, sistemdeki ayrıcalıklı rolleri manipüle etmek veya kullanıcıların gizli verilerini toplamak anlamına gelebilir.

Bu tip açıklardan korunmanın yolu, hem tasarımda hem de test süreçlerinde veri seviyesinde yetkilendirme bilincini yerleştirmekten geçer. Her bir veri alanı için kullanıcı rollerine göre erişim kontrolü yapılmalı, yani field-level authorization titizlikle uygulanmalıdır. Backend tarafında, yalnızca yetkili kullanıcıya gerekli alanlar döndürülmeli, diğer tüm bilgiler filtrelenmelidir. Bu amaçla DTO (Data Transfer Object) yapıları kullanılarak verinin sunum katmanı ayrıştırılabilir.
Elbette güçlü bir test süreci de bu güvenliğin olmazsa olmazıdır. Farklı kullanıcı rolleriyle API’yi test etmek, manuel olarak ekstra alanlar göndererek sistemin bunları nasıl işlediğini gözlemlemek, yanıtlarda istemci tarafında görünmeyen ama API tarafından döndürülen alanlar olup olmadığını incelemek son derece kritik adımlardır. Bu süreç, manuel testlerle desteklenebileceği gibi, Postman, APIStrike gibi araçlarla sürekli ve otomatik bir şekilde de sürdürülebilir.
Unutulmaması gereken temel ilke şudur: Sisteminize hangi veriyi vereceğiniz kadar, hangi veriyi vermeyeceğiniz de güvenlik açısından belirleyicidir. Veri sızıntıları çoğu zaman sistemin ihlal edilmesiyle değil, fazladan sunulan bilgilerin kötüye kullanılmasıyla gerçekleşir. Bu nedenle veri seviyesindeki yetkilendirme, modern API mimarilerinde göz ardı edilmemesi gereken bir güvenlik katmanıdır.