Intent Yönlendirme Güvenlik Açığı Düzeltmesi

Bu bilgi, uygulamasında/uygulamalarında Intent Yönlendirme Güvenlik Açığı bulunan geliştiriciler içindir.

Neler oluyor?

Uygulamalarınızdan biri veya birkaçı, kötü amaçlı uygulamaların gizli uygulama bileşenlerine veya dosyalarına erişmesine izin verebilecek Intent Yönlendirme sorunu içeriyor. Uygulamalarınızla ilgili sorunu düzeltmek için lütfen aşağıda ayrıntılı bir şekilde anlatılan adımları inceleyin. Play Console hesabınızda gösterilen son tarihlerden sonra, düzeltilmemiş güvenlik açığı içeren tüm uygulamalar Google Play'den kaldırılacaktır.

Yapılması gerekenler

  1. Play Console hesabınızda oturum açıp Uyarılar bölümüne gidin. Burada hangi uygulamaların etkilendiğini ve bu sorunları çözmeniz gereken son tarihleri görebilirsiniz.
  2. Etkilenen uygulamalarınızı aşağıda açıklanan adımları uygulayarak güncelleyin.
  3. Etkilenen uygulamalarınızın güncellenmiş sürümlerini gönderin.

Uygulamanız, yeniden göndermenizin ardından tekrar incelenir. Bu işlem birkaç saat sürebilir. Uygulama incelemeden başarıyla geçerek yayınlanırsa başka bir işleme gerek yoktur. Uygulama incelemede başarısız olursa yeni uygulama sürümü yayınlanmaz ve bir e-posta bildirimi alırsınız.

Ek bilgiler

Güvenilmeyen Intent kullanarak bir bileşeni başlatmak (örneğin, startActivity çağrısı yapmak) veya veriler döndürmek (örneğin, setResult çağrısı yapmak) hem tehlikelidir hem de kötü amaçlı uygulamaların aşağıdaki sorunlara yol açmasına neden olabilir:

  1. Uygulamanızdan hassas dosyaların veya sistem verilerinin (SMS mesajları gibi) çalınması
  2. Zararlı bağımsız değişkenlerle uygulamanızın gizli bileşenlerinin başlatılması.

Uygulamanızın, doğrulamadan veya temizlemeden güvenli olmayan Intent'ler üzerinden startActivity, startService, sendBroadcast veya setResult çağrısı yapmaması önemlidir.

Bu güvenlik açığını aşağıdaki yöntemlerden birini kullanarak engellemenizi öneririz:

1. Seçenek: Çıkarılan Intent'in yönlendirildiği etkilenmiş uygulama bileşenini gizli yapın.

Etkilenmiş uygulama bileşeninin diğer uygulamalardan Intent alması gerekmiyorsa Manifest dosyasında Android: exported = ”false” yaparak söz konusu uygulama bileşenini gizli hale getirebilirsiniz.

2. Seçenek: Çıkarılan Intent'in güvenilir bir kaynaktan olduğundan emin olun.

Kaynak etkinliğin güvenilir olduğunu, getCallingActivity gibi yöntemlerle doğrulayabilirsiniz. Örneğin:

 // kaynak Etkinliğin güvenilir paketten olup olmadığını kontrol edin
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // iç içe yerleştirilmiş Intent'i ayıklayın
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // iç içe yerleştirilmiş Intent'i yönlendirin
   startActivity(forward);
 }

Not:

  • getCallingActivity() işlevinin null olmayan bir değer döndürüp döndürmediğini kontrol etmek güvenlik açığını önlemeye yetmez. Kötü amaçlı uygulamalar bu işlev için null değer sağlayabilir.
  • Google Play Hizmetleri SMS Retriever Auth söz konusu olduğunda bir yayın alıcıyı SEND_PERMISSION ile korumak Intent'in, Play Hizmetleri'nden gelmesini sağlar.

3. Seçenek: Yeniden yönlendirilecek Intent'in zararlı olmadığından emin olun.

Yönlendirilen Intent'in aşağıdakileri yapmadığını doğrulamanız gerekir:

  1. Hiçbir uygulamanızın gizli bileşenine gönderilmemeli,
  2. Harici bir uygulamanın bileşenine gönderilmemeli. Yönlendirmenin harici bir uygulamayı hedeflemesi amaçlanıyorsa Intent'in, uygulamanızın gizli içerik sağlayıcılarından birine veya sistem verilerine URI izni vermediğinden emin olun.

Uygulamalar, yönlendirmeden önce Intent'i işlemek için hangi bileşenin kullanılacağını resolveActivity gibi yöntemlerle kontrol edebilir. Örneğin:

 Intent intent = getIntent();
 // iç içe yerleştirilmiş Intent'i ayıklayın
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // bileşen adını alın
 ComponentName name = forward.resolveActivity(getPackageManager());
 // paket ve sınıf adlarının istenildiği gibi olup olmadığını kontrol edin
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // iç içe yerleştirilmiş Intent'i yönlendirin
   startActivity(forward);
 }

Uygulamalar bir Intent'in URI izni sağlayıp sağlamadığını getFlags gibi yöntemlerle kontrol edebilir. Örneğin:

 // iç içe yerleştirilmiş Intent'i ayıklayın
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // işaretleri alın
 int flags = forward.getFlags();
 // iç içe yerleştirilmiş Intent'in URI izinleri sağlamadığından emin olun
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // iç içe yerleştirilmiş Intent'i yönlendirin
   startActivity(forward);
 }

Ayrıca uygulamalar, verilmiş URI izinlerini removeFlags kullanarak kaldırabilir. Örneğin:

// güvenilmeyen Intent
Intent intent = getIntent();
// güvenilmeyen Intent'te verilmiş URI izinlerini kaldırın
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // güvenilmeyen Intent'i iletin
 setResult(intent);

Uyarıları Anlama ve Bir Önleme Seçeneği Belirleme

Play Console uyarısı, uygulamanızın güvenilmeyen bir Intent kullanarak startActivity, startActivityForResult, startService, sendBroadcast veya setResult çağrısı yaptığını bildirir. Geriye doğru gidip güvenilmeyen Intent'in nereden geldiğini bulmak için yöntemlerin çağrılarına bakarak en uygun önleme seçeneğini belirleyebilirsiniz. Örneğin, 1. Seçenek için hangi bileşenin gizli hale getirileceğini belirlemek üzere geriye doğru gidin.

Yardıma hazırız

Güvenlik açığı hakkında teknik sorularınız varsa “android-security” etiketini kullanarak sorularınızı Stack Overflow'da yayınlayabilirsiniz. Bu sorunu çözmek için uygulamanız gereken adımlarla ilgili sorunuz olursa geliştirici destek ekibimize ulaşabilirsiniz.

Bu size yardımcı oldu mu?

Bunu nasıl iyileştirebiliriz?
false
Ana menü
120267871303286368
true
Yardım Merkezinde Arayın
true
true
true
true
true
5016068
false
false