Android Accessibility Service Abuse

Reading time: 6 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Overview

AccessibilityService è stato creato per aiutare gli utenti con disabilità a interagire con i dispositivi Android. Sfortunatamente, le stesse API di automazione potenti (navigazione globale, input di testo, invio di gesti, finestre sovrapposte…) possono essere utilizzate dai malware per ottenere il completo controllo remoto del dispositivo senza privilegi di root.

I moderni trojan bancari Android e i Trojan di accesso remoto (RAT) come PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda e molti altri seguono la stessa ricetta:

  1. Ingegnere sociale la vittima per abilitare un servizio di accessibilità malevolo (il permesso BIND_ACCESSIBILITY_SERVICE è considerato "ad alto rischio" e richiede un'azione esplicita da parte dell'utente).
  2. Sfruttare il servizio per
  • catturare ogni evento UI e testo che appare sullo schermo,
  • iniettare gesti sintetici (dispatchGesture) e azioni globali (performGlobalAction) per automatizzare qualsiasi compito desiderato dall'operatore,
  • disegnare sovrapposizioni a schermo intero sopra app legittime utilizzando il tipo di finestra TYPE_ACCESSIBILITY_OVERLAY (nessun prompt SYSTEM_ALERT_WINDOW!),
  • concedere silenziosamente ulteriori permessi di runtime cliccando sulle finestre di dialogo di sistema a nome della vittima.
  1. Esfiltrare dati o eseguire On-Device-Fraud (ODF) in tempo reale mentre l'utente guarda uno schermo perfettamente normale.

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>

Il file XML di accompagnamento definisce come apparirà la finestra di dialogo falsa:

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

Primitivi di automazione UI remota

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

Con solo queste due API, un attaccante può:

  • Sbloccare lo schermo, aprire l'app bancaria, navigare nell'albero dell'interfaccia utente e inviare un modulo di trasferimento.
  • Accettare ogni dialogo di autorizzazione che appare.
  • Installare/aggiornare APK extra tramite l'intento del Play Store.

Modelli di abuso

1. Overlay Phishing (Raccolta di credenziali)

Un WebView trasparente o opaco viene aggiunto al gestore delle finestre:

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

La vittima digita le credenziali nel modulo falso mentre l'app in background riceve gli stessi gesti – non viene mai mostrato alcun avviso sospetto "disegna sopra altre app".

Esempio dettagliato: la sezione Accessibility Overlay Phishing all'interno della pagina Tapjacking.

2. Automazione della frode su dispositivo

Famiglie di malware come PlayPraetor mantengono un canale WebSocket persistente dove l'operatore può emettere comandi di alto livello (init, update, alert_arr, report_list, …). Il servizio traduce questi comandi nei gesti di basso livello sopra, ottenendo transazioni non autorizzate in tempo reale che aggirano facilmente l'autenticazione a più fattori legata a quel dispositivo.

3. Streaming e monitoraggio dello schermo

Combinando l'API MediaProjection con una libreria client RTMP, il RAT può trasmettere il framebuffer live a rtmp://<c2>:1935/live/<device_id>, dando all'avversario una perfetta consapevolezza situazionale mentre il motore di Accessibilità gestisce l'interfaccia utente.


PlayPraetor – flusso di comando e controllo

  1. Heartbeat HTTP(S) – iterare su un elenco hard-coded fino a quando un dominio risponde POST /app/searchPackageName con il C2 attivo.
  2. WebSocket (porta 8282) – comandi JSON bidirezionali:
  • update – inviare nuove conf/APK
  • alert_arr – configurare modelli di overlay
  • report_list – inviare l'elenco dei nomi dei pacchetti mirati
  • heartbeat_web – keep-alive
  1. RTMP (porta 1935) – streaming live di schermo/video.
  2. Esfiltrazione REST
  • /app/saveDevice (impronta)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (credenziali bancarie)

Il AccessibilityService è il motore locale che trasforma quei comandi cloud in interazioni fisiche.


Rilevamento di servizi di accessibilità malevoli

  • adb shell settings get secure enabled_accessibility_services
  • Impostazioni → Accessibilità → Servizi scaricati – cercare app che non provengono da Google Play.
  • Le soluzioni MDM / EMM possono imporre ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) per bloccare i servizi sideloaded.
  • Analizzare i servizi in esecuzione:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Raccomandazioni di indurimento per gli sviluppatori di app

  • Contrassegnare le viste sensibili con android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Combinare setFilterTouchesWhenObscured(true) con FLAG_SECURE per prevenire il dirottamento di tap/overlay.
  • Rilevare overlay interrogando WindowManager.getDefaultDisplay().getFlags() o l'API ViewRootImpl.
  • Rifiutare di operare quando Settings.canDrawOverlays() o un servizio di Accessibilità non fidato è attivo.

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks