# Android Accessibility Service Abuse {{#include ../../banners/hacktricks-training.md}} ## 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. 3. Esfiltrare dati o eseguire **On-Device-Fraud (ODF)** in tempo reale mentre l'utente guarda uno schermo perfettamente normale. --- ## Requesting the permission ```xml ``` Il file XML di accompagnamento definisce come apparirà la finestra di dialogo falsa: ```xml ``` --- ## 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://:1935/live/`, 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 3. **RTMP (porta 1935)** – streaming live di schermo/video. 4. **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 * [PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat) * [Android accessibility documentation – Automating UI interaction](https://developer.android.com/guide/topics/ui/accessibility/service) {{#include ../../banners/hacktricks-training.md}}