Kimlik doğrulama yetmez: ASP.NET Core'da IDOR ve kaynak aitliği
Bir geliştirici kendi güvenlik testinde, bir endpoint'in kaydın kullanıcıya ait olup olmadığını kontrol etmediği bir IDOR açığı buldu. Yazı, [Authorize] ile kaynak aitliği arasındaki farkı ve kontrolü hafızaya değil koda bağlamanın yollarını anlatıyor.
Kilit noktalar
- [Authorize] kimliği doğrular; kaynak aitliğini ayrıca kontrol etmek gerekir.
- Rol ve permission kontrolü ile kaynak aitliği iki ayrı kontroldür ve ikisi de geçmelidir.
- IDepartmentScoped gibi marker interface ile sahiplik seviyesi tip düzeyinde tanımlanır.
- Kaydı getirme ve aitlik koşulu tek WHERE sorgusunda birleştirilmelidir.
- Body'deki CompanyId gibi sahip alanları token'daki değerle ezin; istemci değerine güvenmeyin.
- Token'daki departman listesi süresi dolana kadar sabit kalır; token ömrünü kısa tutun.
Bir geliştirici kendi güvenlik testinde IDOR açığı buldu: bir endpoint, id'sini bilen herhangi bir oturum açmış kullanıcıya kaydı döndürüyordu, çünkü aitlik kontrolü her controller'a elle yazılmıştı ve birinde unutulmuştu. Kimlik doğrulama doğru çalışıyordu. Ancak [Authorize] yalnızca isteği atanın tanınan biri olduğunu söyler, kaydın ona ait olduğunu söylemez. Yazar bu sınıf açığı OWASP API listesindeki BOLA riskiyle ilişkilendiriyor.
Önerilen çözüm, sahiplik kuralını geliştiricinin hafızasına bırakmamak. Entity'ler IDepartmentScoped gibi marker interface'lerle sahiplik seviyesini tip düzeyinde tanımlıyor; generic bir guard kaydı ve aitlik koşulunu tek bir WHERE sorgusunda birleştiriyor. Yazar ayrıca global query filter'ın tek başına yeterli olmadığını, token'daki departman listesinin ise süresi dolana kadar sabit kaldığını belirtiyor.
Gerçek dünyada kullanımı
- Birden fazla şirket ve departmana bağlı kurumsal kart ya da fatura yönetim API'si.
- Kaynak id'si alan ve her action'da sahiplik kontrolü gerektiren çok kiracılı (multi-tenant) bir backend.
- Mikroservis ve mesaj tüketicisi (consumer) ile çalışan, mesajdaki kaynak id'sini doğrulaması gereken sistemler.
Neden önemli
Yeni eklenen her endpoint kaydı aitlik kontrolü olmadan getirirse IDOR açığı yeniden oluşur. Kontrolü veri erişim çağrısının içine koymak, ekip büyüdükçe bu hatayı önler.
Benzer haberler
- ASP.NET Core Web API'de sık yapılan 6 hata ve yerine kullanılacak desenlerDEV Community: #aspnetcore23 Eki
- React, .NET 10 ve Microsoft Foundry ile güvenli bir kurumsal chatDEV Community: #dotnet1 gün önce
- ASP.NET Core'da authentication ve authorization: ne zaman hangisi, güvenle nasıl yayına alınırDEV Community: #aspnetcore1 gün önce