Güvenli olmayan API kullanımı

OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi

Genel Bakış

Birçok mobil uygulama, özellik sunmak için harici bir API kullanır. Geleneksel olarak, hizmete bağlanan uygulamanın kimliğini doğrulamak için statik bir jeton veya anahtar kullanılır.

Ancak istemci-sunucu ayarı (veya mobil uygulama ve API) bağlamında, hassas verilere ya da hizmetlere erişmek için statik anahtar kullanmak genellikle güvenli bir kimlik doğrulama yöntemi olarak kabul edilmez. Dahili altyapının aksine, bu anahtara erişimi olan herkes harici bir API'ye erişebilir ve hizmeti kötüye kullanabilir.

Örneğin, statik bir anahtarın uygulamadan tersine mühendislik yoluyla elde edilmesi veya bir mobil uygulama harici API ile iletişim kurarken müdahale edilmesi mümkündür. Ayrıca bu statik anahtarın uygulama içinde sabit kodlanma olasılığı da daha yüksektir.

API verileri ve hizmetleriyle ilgili risk, yeterince güvenli kimlik doğrulama ve erişim kontrolleri kullanılmadığında ortaya çıkar.

Statik anahtar kullanıldığında, API'den istekleri yeniden oynatarak veya (yakalanan ya da tersine mühendislik uygulanan) anahtarı kullanarak zaman kısıtlaması olmadan yeni istekler oluşturarak yararlanılabilir.

Etki

Bir geliştirici, yapay zeka veya makine öğrenimi API hizmeti için ödeme yapıyorsa saldırganın bu anahtarı çalması ve hizmetinde borç oluşturması ya da sahte içerik oluşturmak için kullanması nispeten kolay olur.

API'de depolanan tüm kullanıcı verileri, dosyalar veya kimliği tanımlayabilecek bilgiler (PII) serbestçe kullanılabilir ve bu da zararlı sızıntılara yol açar.

Saldırganlar bu erişimi dolandırıcılık yapmak, hizmetleri yönlendirmek ve nadir durumlarda sunucular üzerinde tam kontrol elde etmek için de kullanabilir.

Risk azaltma önlemleri

Durumlu API

Uygulama, kullanıcı girişi sağlıyorsa veya kullanıcı oturumlarını izleyebiliyorsa geliştiricilerin, uygulamalarıyla durum bilgisi içeren entegrasyon için Google Cloud gibi bir API hizmeti kullanmalarını öneririz.

Ayrıca, API hizmeti tarafından sağlanan güvenli kimlik doğrulama, istemci doğrulama ve oturum kontrollerini kullanın. Statik anahtar yerine dinamik jeton kullanmayı da düşünebilirsiniz. Jetonun makul bir süre içinde (genellikle 1 saat) sona erdiğinden emin olun.

Ardından, API'ye erişim sağlamak için kimlik doğrulama işleminde dinamik jeton kullanılmalıdır. Bu yönergelerde, OAuth 2.0 kullanılarak bunun nasıl yapılabileceği gösterilmektedir. Bu yönergelere ek olarak, aşağıdaki özellikleri uygulayarak Android uygulamanızdaki güvenlik açıklarını azaltmak için OAuth 2.0'ı daha da güçlendirebilirsiniz.

Uygun hata işleme ve günlük kaydı uygulayın:

  • OAuth hatalarını düzgün ve görünür bir şekilde ele alın ve hata ayıklama amacıyla bunları günlüğe kaydedin.
    • Saldırı yüzeyinin azaltılması, ortaya çıkabilecek sorunları belirlemenize ve gidermenize de yardımcı olur.
    • Kullanıcıya kaydedilen veya sunulan tüm mesajların net olduğundan ancak saldırgan için faydalı bilgiler içermediğinden emin olun.

Uygulamada OAuth'u güvenli bir şekilde yapılandırın:

  • redirect_uri parametresini hem yetkilendirme hem de jeton uç noktalarına gönderin.
  • Uygulamanızda üçüncü taraf hizmetiyle OAuth kullanılıyorsa kaynaklar arası kaynak paylaşımını (CORS) yapılandırarak uygulamanızın kaynaklarına erişimi kısıtlayın.
    • Bu, yetkisiz siteler arası komut dosyası çalıştırma (XSS) saldırılarını önlemeye yardımcı olur.
  • CSRF saldırılarını önlemek için durum parametresini kullanın.

Güvenlik kitaplığı kullanın:

  • Güvenli OAuth akışlarının uygulanmasını basitleştirmek için AppAuth gibi bir güvenlik kitaplığı kullanmayı düşünebilirsiniz.
    • Bu Android kitaplıkları, daha önce bahsedilen güvenlik ile ilgili en iyi uygulamaların çoğunu otomatikleştirmenize yardımcı olabilir.

Firebase ve Google kimlik jetonları da dahil olmak üzere diğer kimlik doğrulama yöntemleri OpenAPI belgelerinde açıklanmaktadır.

Durumsuz API

API hizmeti, daha önce önerilen korumalardan hiçbirini sunmuyorsa ve kullanıcı girişi olmadan durumsuz oturumlar gerekiyorsa geliştiricilerin kendi ara katman yazılımı çözümlerini sağlaması gerekebilir.

Bu işlem, uygulama ile API uç noktası arasındaki isteklerin "proxy'lenmesini" içerir. Bunu yapmanın bir yolu, JSON Web Jetonları (JWT) ve JSON Web Signature (JWS) kullanmak veya daha önce önerildiği gibi tamamen kimliği doğrulanmış bir hizmet sağlamaktır. Bu, savunmasız statik anahtarın uygulamada (istemci) değil, sunucu tarafında depolanmasını sağlar.

Mobil uygulamalarda uçtan uca durum bilgisi içermeyen bir çözüm sunmakla ilgili doğal sorunlar vardır. En kritik zorluklardan bazıları, istemcinin (uygulama) doğrulanması ve özel anahtarın veya sırrın cihazda güvenli bir şekilde saklanmasıdır.

Play Integrity API, uygulamanın ve isteklerin bütünlüğünü doğrular. Bu, erişimin kötüye kullanılabileceği bazı senaryoları azaltabilir. Anahtar yönetimiyle ilgili olarak, birçok durumda anahtar deposu, özel anahtarların güvenli bir şekilde depolanması için en iyi yerdir.

Bazı mobil uygulamalar, uygulamanın bütünlüğünü kontrol etmek ve güvenli bir değişim kullanarak anahtar sağlamak için kayıt aşaması kullanır. Bu yöntemler karmaşıktır ve bu belgenin kapsamı dışındadır. Ancak bulut anahtar yönetimi hizmeti olası bir çözümdür.

Kaynaklar