API & LibraryGüvenlik

Play Integrity API ile Güvenlik Önlemleri

Yazılımlarımızı saldırılara karşı güncel yapılarla güvenliğini sağlamak her daim önemlidir.

Bu makale Google Play Integrity API ile uygulamalarınızı ve oyunlarınızı zararlı saldırılardan korumayı, kötüye kullanımı azaltmayı nasıl sağlayacağımızı açıklayacağım.

Google Play Integrity API, uygulamanın bütünlüğüne, cihazın bütünlüğüne ve lisans bilgilerine ilişkin yararlı sinyallere ek olarak, doğru kullanıldığında mevcut korumaları daha da güçlendirebilen “nonce” adlı basit ama çok kullanışlı bir özelliğe sahiptir.

“Nonce” Nedir?

Kriptografi ve güvenlik mühendisliğinde nonce, güvenli bir iletişimde yalnızca bir kez kullanılan bir sayıdır. Nonce kimlik doğrulama, şifreleme ve hashing gibi alanlarda uygulanır. Play Integrity API, “nonce” sayesinde uygulamanızı yeniden oynatma (replay) saldırıları ve person-in-the-middle (PITM) saldırıları gibi belirli saldırılara karşı daha fazla korur.

1-Projede Bazı Ayarlar

a)  Android Uygulamaları

Projenizin app dizinin altındaki build.gradle dosyasını açmalısınız. Dependencies kod bloklarının arasına aşağıdaki kodu yerleştirerek Play Integrity API kütüphanesini yükleyin.

Play Integrity API’nın diğer versiyonlarına linkten ulaşabilirsiniz.

b) Unity Oyunları

Unity 1.7.0 veya sonraki sürümleri için Google Play eklentilerini yükleyin. 2019.x, 2020.x ve daha yeni sürümlerin tüm sürümleri desteklenir. Unity 2018.x kullanıyorsanız, 2018.4 veya daha yeni sürümünü yükleyin. Unity 2017.x kullanıyorsanız 2017.4.40 veya daha yenisini yükleyin. Unity 5.x ve daha eski sürümlerin desteklenmediğini unutmayın.

2-Nonce Değerini Kullanma

İlk önce oluşturacağınız Nonce aşağıda belirtilen formatta hazırlanmalıdır.

  • String
  • URL-safe
  •  Base64 ile hazırlanmalı ve non-wrapping olmalı
  • Minimum, 16 karakter
  • Maximum, 500 karakter

Nonce oluşturduktan sonra Play Integrity API’sini çağırırız ve nonce alanını uygulama sunucunuz tarafından alınan benzersiz değere ayarlamak için setNonce() methodunu çağırır. setNonce() methodu da IntegrityTokenRequest sınıfında barınmaktadır.

KotlinJavaUnity

3- Nonce Doğrulanması

Kullanılan nonce işlemi sonucunda Play Integrity API’si Google Play’den bir yanıt(response) alır. Yanıt JSON Web Token (JWT) biçimindedir. Örnek yapı aşağıdadır.

Nonce, aşağıdaki şekilde biçimlendirilmiş requestDetails yapısının içinde bulunur.

requestDetails’da gelen Nonce değeri, daha önce API’ye ilettiğiniz değerle tam olarak eşleşmelidir. Ayrıca nonce, Play Integrity API’sinin kriptografik olarak imzalanmış yanıtının içinde olduğundan, yanıt alındıktan sonra değerini değiştirmek mümkün değildir. Bu özelliklerden yararlanarak, uygulamanızı daha fazla korumak için nonce kullanmak mümkündür.

Replay Saldırısını Önleme

Kötü niyetli bir kullanıcının Play Integrity API tarafından korunan bir sunucu-istemci uygulamasıyla etkileşime girmeye çalıştığı, ancak sunucunun bu durumu algılamaması için güvenliği ihlal edilmiş bir cihazla yapmak istediğini düşünelim.

Saldırgan bunu yapmak için önce uygulamayı yasal bir cihaz kullanır ve Play Integrity API’sinin imzalı yanıtını toplar. Daha sonra saldırgan, güvenliği ihlal edilmiş cihazla uygulamayı kullanır, Play Integrity API çağrısını durdurur ve integrity kontrollerini yapmak yerine, önceden kaydedilmiş imzalı yanıtı döndürür.

İmzalı yanıt herhangi bir şekilde değiştirilmediğinden dijital imza iyi görünecek ve uygulama sunucusu, meşru bir cihazla iletişim kurduğunu düşünerek kandırılabilir. Buna replay saldırısı denir.

Saldırıya Karşı Savunma

Replay saldırısına karşı ilk savunma hattı, imzalı yanıttaki timestampMillis alanını doğrulamaktır. Bu alan, yanıtın oluşturulduğu timestamp içerir ve dijital imzanın gerçek olduğu doğrulansa bile şüpheli şekilde eski yanıtları algılamada faydalı olabilir.

Bununla birlikte, her yanıta benzersiz bir değer atamak ve yanıtın önceden ayarlanmış benzersiz değerle eşleştiğini doğrulamak için Play Integrity API’sindeki nonce’den yararlanmak da mümkündür. Uygulama aşağıdaki gibidir:

  1. Sunucu, kötü niyetli kullanıcıların tahmin edemeyecekleri şekilde benzersiz bir değer oluşturur. Örneğin, kriptografik olarak güvenli bir rastgele sayı 128 bit veya daha büyük.
  2. Uygulamanız Play Integrity API’sini çağırır ve nonce alanına, uygulama sunucunuz tarafından alınan benzersiz değeri atar.
  3. Uygulamanız, Play Integrity API’sinin imzalanmış sonucunu sunucunuza gönderir.
  4. Sunucunuz, imzalanmış sonuçtaki nonce alanının daha önce oluşturduğu benzersiz değerle eşleştiğini doğrular ve eşleşmeyen sonuçları reddeder.

Aşağıdaki şema bu adımları göstermektedir:

Kaynaklar

1- https://android-developers.googleblog.com/2022/05/boost-security-of-your-app-with-nonce.html

2- https://developer.android.com/google/play/integrity/overview

 

Bülten
Bültene abone ol

Bültene abone olarak yeni makalelerimden haberdar olun.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir