Android App Links gerçek bir güvenlik problemini çözer: işletim sisteminin bir HTTPS alan adı ile cihaza yüklenmiş bir uygulamanın birbirine ait olduğunu doğrulamasını sağlar. Bu durum, ikinci bir kötü niyetli uygulamanın aynı web bağlantısını normal doğrulanmış bağlantı işleme mantığı altında sessizce sahiplenmesini engeller.

Ancak birçok güvenlik değerlendirmesinin çok erken durduğu nokta da tam olarak burasıdır.

Bir verified (doğrulandı) sonucu, yalnızca URL’yi hangi uygulamanın aldığını kanıtlar. URL’nin güvenli olduğunu, açılan ekranın mevcut oturumdaki kullanıcı için uygun olduğunu veya durumu değiştiren (state-changing) bir işlemin sunucu tarafında yetkilendirildiğini kanıtlamaz. Bağlantı doğru uygulamaya ulaşıp yine de yanlış bir eylemi tetikleyebilir.

Bu saha notu, bu kritik ayrımı test etmek için tekrarlanabilir bir metodoloji sunar. Hedef, yüzeysel yapılandırma zayıflığı ile kanıtlanmış güvenlik etkisini birbirinden ayırt etmektir.

Tek bir URL dört bağımsız karardan geçer

“Deep-link güvenliği”ni tek bir kontrolden ibaret görmek asıl başarısızlık modellerini gizler. Anlamlı bir güvenlik değerlendirmesi dört bağımsız kararı birbirinden ayırır:

  1. İlişkilendirme (Association): Bu alan adının bu imzalı uygulamayı açmasına izin var mı? (assetlinks.json)
  2. Rota Ayrıştırma (Parsing): Uygulama yalnızca amaçlanan scheme, host, path ve parametreleri mi kabul ediyor?
  3. Uygulama Durumu (App State): Kullanıcı oturum açmış mı, beklenen hesapta mı ve bu rota için yetkili mi?
  4. Sunucu Yetkilendirmesi (Authorization): Sunucu, hedeflenen nesne üzerindeki okuma veya yazma işlemini bu kullanıcı için onaylıyor mu?
BİR LİNK BİR İSTEKTİR, YETKİ KANITI DEĞİLDİR HTTPS link güvenilmeyen girdi İlişkilendirme domain + imza Rota ayrıştırma path + değerler App durumu kullanıcı + hesap Sunucu izin / ret Kim alıyor? Ne anlama geliyor? Bağlam geçerli mi? Yapılabilir mi? BİR KARARI GEÇMEK BİR SONRAKİNİ KARŞILAMAZ
Android, bir alan adının hangi imzalı uygulamaya ait olduğunu kanıtlayabilir. Ancak uygulamanın ve backend'in hala üç bağımsız güvenlik kararı vermesi gerekir.

Bu ayrım hem test metodolojisini hem de raporlamayı değiştirir: Eksik bir assetlinks.json ilişkilendirmesi araya girme (interception) riski yaratabilir; ancak tek başına hesap ele geçirmeyi kanıtlamaz. Buna karşılık, kusursuz doğrulanmış bir alan adının tehlikeli bir action parametresini doğrudan çalıştırması, platform konfigürasyonu mükemmel olsa dahi çok daha kritik bir zafiyettir.

Doğrulama kasten dar kapsamlı bir soruyu yanıtlar

Bir Android App Link, AndroidManifest.xml dosyasında android:autoVerify="true" ile tanımlanan bir HTTP/HTTPS deep link’tir. Android işletim sistemi https://<host>/.well-known/assetlinks.json dosyasını çeker ve paket adı ile sertifika parmak izini yüklü uygulamayla karşılaştırır. Eşleşme sağlandığında sistem eşleşen linkleri doğrudan o uygulamaya yönlendirir.

Bu süreç yalnızca alan adı ile uygulama arasındaki mülkiyeti doğrular. /transfer/confirm rotasının iş mantığını incelemez, gelen accountId değerinin oturum açmış kullanıcıya ait olup olmadığını denetlemez ya da bir ödemeyi onaylamaz. Bunlar App Links’in eksikliği değil, mimarinin farklı katmanlarına ait kararlardır.

myapp:// gibi özel URL şemaları (custom schemes) ise tamamen farklı bir sınıftır. Digital Asset Links ile bir web alan adına bağlı olmadıkları için, cihaza yüklenen başka herhangi bir uygulama aynı şemayı bildirebilir. Düşük riskli navigasyon için kabul edilebilir olsa da, asla doğrulanmış bir HTTPS linkinin güvenlik varsayımlarını devralamaz.

Bu nedenle ilk sızma testi sorusu “link açılıyor mu” olmamalıdır:

Gözlemlenen davranış gerçekte hangi iddiayı kanıtlıyor?

pm get-app-links cihazın mevcut ilişkilendirme durumunu kanıtlar. Uygulamada bir ekranın belirmesi yönlendirmenin çalıştığını kanıtlar. Ancak yetkilendirilmiş ya da yetkisiz bir eylemi kanıtlamak için mutlaka sunucu yanıtı ve öncesi/sonrası durumu içeren somut kanıtlar gerekir.

Payload göndermeden önce rota sözleşmesini (Route Contract) çıkarın

Bir URL’deki her karakteri körü körüne değiştirmek yalnızca gürültü üretir. Kabul edilen her bağlantı için rota sözleşmesini belgeleyerek başlayın:

ÖzellikYanıtlanacak soru
Giriş türüDoğrulanmış HTTPS App Link mi, doğrulanmamış web linki mi, custom scheme mi?
Karşılayıcı (Receiver)Hangi exported activity veya navigation router karşılıyor?
Rota grameriHangi path’ler mevcut ve path segmentleri kaç kez decode ediliyor?
ParametrelerHangi parametreler nesne, hesap, hedef, URL veya eylem seçiyor?
Ön koşullarKullanıcının oturum açmış olması veya belirli bir hesapta bulunması şart mı?
Yan etki (Side effect)Link açıldığında yalnızca gezinme mi yapıyor, veri mi ifşa ediyor, eylem mi tetikliyor?
Sunucu kararıHangi API endpoint’i mülkiyeti, rolü, oturumu ve replay durumunu yeniden denetliyor?
Hata davranışıGeçersiz girdide güvenle duruyor mu, yoksa varsayılan yetkilerle devam mı ediyor?

next, target, destination ve continue parametrelerinin tümü aynı yeteneği temsil ediyor olabilir: yürütmenin bir sonraki adımda nereye gideceğini belirlemek. Parametre isimlerine değil, neyi kontrol ettiklerine odaklanın.

Ayrılması gereken temel hata kalıpları

1. Linkin başka bir uygulama tarafından sahiplenilmesi (Collision)

Custom scheme’lerde ve doğrulanmamış web linklerinde ikinci bir zararlı uygulama aynı rotayı kaydedebilir ve tek kullanımlık bir login token’ını çalabilir.

2. Geçerli bir linkin komut diline dönüşmesi

Link bir gezinme bağlantısı olarak başlar ve zamanla parametre biriktirir: https://mobile.example.test/open?screen=account&account_id=LAB-002&action=confirm Serbest formdaki girdi ayrıcalıklı ekranları, durum değiştiren işlemleri veya rastgele hedefleri katı bir beyaz liste (allowlist) olmadan seçebiliyorsa zafiyet vardır.

3. Public handler’ın iç içe (nested) Intent yönlendirmesi

Bazı router’lar gelen Intent’in extra alanından başka bir Intent nesnesi çıkarır ve doğrudan startActivity() ile başlatır. Bu durum, dışarıya açık olmayan (exported=false) özel bileşenlerin saldırgan tarafından tetiklenmesine yol açan tipik bir Intent Redirection zafiyetidir.

GÜVENSİZ YÖNLENDİRME (INTENT REDIRECTION) Dış çağrıcı extra'yı kontrol eder Public link activity nested Intent'i unwrap eder İç bileşen (private) uygulama yetkisiyle başlar GÜVENLİ YÖNLENDİRME Dış çağrıcı extra sağlar Allowlist doğrulaması hedef bileşen filtrelenir Yalnızca onaylı hedef güvenli parametrelerle çalışır
Açık bir link işleyicisi iç içe bir Intent'i filtrelemeden başlattığında, uygulamanın kendi yetki alanını saldırgana açar. Güvenli yaklaşım hedef bileşeni katı bir allowlist'ten geçirmektir.

Evidence matrix

SinyalNeyi kanıtlarNegatif kontrolSavunmacı doğrulaması
pm get-app-links verified dönüyorAlan adı ile uygulama sertifikasının eşleştiğiniGeçersiz bir alan adı deneyip doğrulanmadığını görünassetlinks.json içeriğini ve HTTPS yanıt başlıklarını denetleyin
İkinci bir uygulamanın aynı şemayı yakalamasıŞemanın korunmadığını ve çakışma riskiniAynı cihazda doğrulanmış bir App Link ile kıyaslayınHassas akışları custom scheme yerine doğrulanmış App Links’e taşıyın
Link üzerinden oturum açıkken doğrudan işlem yapılmasıMobil istemcinin ek bir onay veya sunucu denetimi aramadığınıOturumu kapatıp linki tekrar açın; akış durmalıdırDurum değiştiren eylemler için sunucuda re-auth ve CSRF token zorunlu kılın
Exported activity’nin harici Intent’i iç bileşene iletmesiIntent redirection ve bileşen yetki sızıntısınıYetkisiz bir hedef bileşen adı gönderip reddedildiğini görünGelen Intent’in component adını, flags ve action değerlerini allowlist’ten geçirin

Sonuç

Android App Links mükemmel bir kimlik ve yönlendirme katmanıdır; ancak bir güvenlik doğrulama duvarı değildir. Linkin doğrulanmış olması eylemin onaylandığı anlamına gelmez. Mobil mimaride her derin bağlantı; alan adı sahipliği, güvenli rota ayrıştırma, uygulama oturum durumu ve sunucu seviyesinde yetkilendirme olmak üzere dört bağımsız süzgeçten geçmek zorundadır.

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar26 Şubat 2026

En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.

İnceleme DurumuYazar incelemesi tamamlandı

Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.