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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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:
- 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).
- 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_WINDOWprompt!), - kurban adına sistem diyaloglarına tıklayarak ek runtime izinlerini sessizce vermek.
- 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:
assets/*.dat’den şifreli blob’u stream eder.- Java/Kotlin loader içine gömülü sert kodlanmış bir AES/CBC key + IV ile bunu deşifre eder.
- Düz metin DEX’i uygulamanın private dizinine yazar ve
DexClassLoaderile 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:
turbo_screenMediaProjection onay diyaloğunu tetikler; Accessibility service “Start now” düğmesine tıklayarak kurbanın müdahale etmesini engeller.- Elde edilen
MediaProjectiontokenı ile birVirtualDisplayoluşturur, bunu birImageReaderdestekler, birForegroundServicecanlı tutulur ve frameler işçi thread’lerinde çekilir. - Frameler operatörün sağladığı
set_qualityparametresine göre JPEG/PNG olarak kodlanır (eksikse varsayılan60) ve özelClayRemoteDesktopuser-agent’ını bildiren bir HTTP→WebSocket upgrade üzerinden iletilir. start_desktop/stop_desktopyakalama thread’lerini yönetirkenscreen_tap,screen_swipe,input_text,press_home,press_backvepress_recentscanlı 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
AccessibilityEventiç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.notificationskomutunotifications_enabledbayrağını değiştirir; böylece gelecekteki heronNotificationPosted()yükü gerçek zamanlı olarak C2’ye akıtılır.send_push_notificationoperatö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_smsveretransmishionsaldırgan kontrollü numaralara rastgele veya tekrar oynatılmış mesajlar gönderir.messsmstüm rehber veritabanı üzerinde yineleme yaparak solucan benzeri yayılma için phishing linkleri spam’ler.make_callsosyal mühendislik iş akışlarını destekleyen sesli aramaları başlatır.get_sms_list/get_smsveget_call_log/get_callsgelen 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_listyüklü paketleri sayar (ATT&CK T1418).get_device_infomodel, OS sürümü ve pil durumunu raporlar (T1426).get_cam/get_cameraön kamera stillerini yakalar;get_keylogger_dataise 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_databir 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
- HTTP(S) heartbeat – aktif C2’yi döndürene kadar sabit kodlanmış bir liste üzerinde yineleme yap ve
POST /app/searchPackageNameisteğine cevap veren domain’i seç. - WebSocket (port 8282) – çift yönlü JSON komutları:
update– yeni conf/APK’ları gönderalert_arr– overlay şablonlarını yapılandırreport_list– hedef paket isimleri listesini gönderheartbeat_web– keep-alive
- RTMP (port 1935) – canlı ekran/video akışı.
- 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)ileFLAG_SECURE’i birleştirin. - Overlay’leri
WindowManager.getDefaultDisplay().getFlags()veyaViewRootImplAPI’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Ö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
viewIdResourceNametercih 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
- Return of ClayRat: Expanded Features and Techniques
- ClayRat v3 IoCs (Zimperium)
- PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT
- Android accessibility documentation – Automating UI interaction
- The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)
- GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)
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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


