Autor del tema
#0
⚠️ YASAL UYARI VE SORUMLULUK REDDİ (DISCLAIMER):
Bu doküman, Mobil Güvenlik Araştırmacıları, Android Geliştiricileri ve Pentesterlar için; Android Intent mekanizmasındaki zafiyetleri anlamak ve güvenli "App Links" yapısını kurmak amacıyla EĞİTİM AMAÇLI hazırlanmıştır.
Burada anlatılan yöntemlerin (Intent Interception, Scheme Hijacking) izniniz olmayan kullanıcı cihazlarında veri çalmak amacıyla kullanılması TCK (Türk Ceza Kanunu) ve KVKK kapsamında suçtur. Bu içeriğin kötüye kullanımından doğacak her türlü yasal sorumluluk uygulayıcıya aittir. Yazar ve Platform yönetimi sorumluluk kabul etmez.
1. Giriş: Android'in "Trafik Polisi" Yok mu?
Android işletim sisteminde uygulamalar birbirleriyle Intent (Niyet) adı verilen mesajlarla konuşur.Örneğin, telefonunuzdaki bir linke tıkladığınızda işletim sistemi bağırır: "Hey! Kim market://details?id=com.example adresini açabilir?"Google Play Store elini kaldırır: "Ben açarım!" ve Android işlemi ona verir.
Sorun şurada başlar: Ya aynı adresi açabileceğini iddia eden iki uygulama varsa? Biri orijinal banka uygulaması, diğeri ise saldırganın yüklediği ve aynı linki dinleyen "El Feneri" uygulamasıysa?
Android, kullanıcıya bir kutucuk (Disambiguation Dialog) açar: "Hangisiyle açmak istersin?". Eğer kullanıcı yanlışlıkla veya kandırılarak (Social Engineering) zararlı uygulamayı seçerse, linkin ucundaki o hassas veri (Token) saldırgana akar. Biz buna Deep Link Hijacking diyoruz.
2. Teknik Derinlik: AndroidManifest.xml Analizi
Bir uygulamanın hangi linkleri dinlediği, AndroidManifest.xml dosyasındaki Intent Filter ayarlarında yazar.Zafiyetli Konfigürasyon Örneği:
XML
123456789<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="superbank" android:host="oauth_callback" />
</intent-filter>
</activity>Burada uygulama superbank://oauth_callback adresini dinliyor. Sorun şu ki; superbank:// şeması (scheme) global olarak rezerve edilemez. Herhangi bir uygulama manifest dosyasına aynı satırı yazıp bu linke talip olabilir.
3. Senaryo 1: OAuth Token Hırsızlığı (Account Takeover)
En yaygın ve en ölümcül senaryodur. Birçok uygulama "Google ile Giriş Yap" veya "Facebook ile Bağlan" kullanır.- Akış Başlar: Kullanıcı orijinal uygulamada "Giriş Yap"a basar. Tarayıcı açılır, kullanıcı şifresini girer.
- Yönlendirme (Redirect): Sunucu, kullanıcıyı uygulamaya geri göndermek için bir URL üretir:superbank://oauth_callback?access_token=S3CR3T_TOKEN_XYZ
- Çalma Anı: Kullanıcının telefonunda saldırganın (önceden yüklettiği) zararlı uygulaması da vardır ve o da superbank:// şemasına abonedir.
- Kapan: Android (eski sürümlerde veya App Links doğrulaması yoksa) kullanıcıya sorar veya yüksek öncelik (Priority) ayarlandıysa direkt zararlı uygulamayı açar.
- Sonuç: Zararlı uygulama açılır, URL'deki access_token'ı okur ve kendi sunucusuna gönderir. Saldırgan artık kullanıcının hesabındadır.
4. Senaryo 2: WebView XSS ve RCE
Bazen deep linkler veri taşımaz, eylem taşır. Uygulama, URL'den gelen parametreleri alıp, içerideki bir WebView (Gömülü Tarayıcı) içinde açıyorsa felaket olabilir.Zafiyetli URL:myapp://open_page?url=javascript:alert(document.cookie)
Eğer uygulama, url parametresini alıp hiçbir filtreleme yapmadan webView.loadUrl() fonksiyonuna sokuyorsa; saldırgan kullanıcıya bu linki tıklattığında (SMS veya WhatsApp üzerinden), uygulamanın içinde JavaScript çalıştırabilir.
Eğer WebView'da setJavaScriptEnabled(true) ve addJavascriptInterface açıksa, bu açık RCE (Remote Code Execution)'ye, yani telefonda komut çalıştırmaya kadar gidebilir.
5. Android App Links vs. Deep Links (Doğrulama Savaşı)
Google bu sorunu çözmek için Android 6.0 ile Verified App Links (Doğrulanmış Uygulama Linkleri) getirdi.Fark şudur:
- Deep Link: myapp:// (Doğrulama yok, herkes kullanabilir).
- App Link: https://www.superbank.com/login (Sadece domain sahibi kullanabilir).
Bypass Yöntemi (Saldırgan Gözüyle):Eğer geliştirici autoVerify="true" yapmayı unutursa veya sunucudaki JSON dosyası hatalıysa, sistem eski usul "Kullanıcıya Sor" moduna düşer. Bu da zafiyetin tekrar açılması demektir. Pentest sırasında ilk kontrol edilen yer burasıdır: .well-known/assetlinks.json dosyası var mı, geçerli mi?
6. Blue Team: Kapıları Nasıl Kilitleriz?
- Custom Scheme Kullanmayın: myapp:// yerine mutlaka standart https:// kullanın.
- App Links Doğrulaması: AndroidManifest.xml içinde android:autoVerify="true" kullanın ve sunucunuza Dijital Varlık Bağlantıları (DAL) dosyasını doğru yükleyin.
- Veri Doğrulama: getIntent().getData() ile gelen veriyi (URL) işlemeden önce mutlaka doğrulayın. Beklenmedik karakterler veya yönlendirmeler var mı?
- Hassas Veri Taşıma: URL parametrelerinde (Query Params) asla Token veya Şifre taşımayın. Bunun yerine kısa ömürlü ve tek kullanımlık "Auth Code" kullanın (PKCE - Proof Key for Code Exchange).
7. Sonuç: Görünmez Tehlike
Deep Link Hijacking, kullanıcının ruhunun duymadığı bir saldırıdır. Ekranda sadece bir anlık "Hangi uygulamayla açayım?" penceresi belirir ve kaybolur. O saniyelik anda, tüm dijital kimlik el değiştirebilir. Mobil dünyanın en büyük "Phishing" vektörlerinden biridir.