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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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:
- 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).
- 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_WINDOWprompt!), - stilletjies bykomende runtime permissions verleen deur op die stelsel-dialoë namens die slagoffer te klik.
- 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:
- Stream die geënkripteerde blob vanaf
assets/*.dat. - Dekript dit met ’n hard-coded AES/CBC key + IV ingebed in die Java/Kotlin loader.
- 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:
turbo_screenaktiveer die MediaProjection consent dialog; die Accessibility service klik “Start now” sodat die slagoffer nooit inmeng nie.- Met die resulterende
MediaProjectiontoken skep dit ’nVirtualDisplayondersteun deur ’nImageReader, hou ’nForegroundServicelewendig en onttrek rame op worker-threads. - Frames word as JPEG/PNG gekodeer volgens die operateur-gespesifiseerde
set_qualityparameter (standaard op60wanneer afwesig) en gestuur oor ’n HTTP→WebSocket-upgrade wat die pasgemaakteClayRemoteDesktopuser-agent adverteer. start_desktop/stop_desktopbestuur die vaslegging-threads terwylscreen_tap,screen_swipe,input_text,press_home,press_backenpress_recentsgebare 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_notificationsdumpt alle tans sigbare kennisgewings, insluitend OTP / MFA-boodskappe.- Die
notificationsopdrag skakel ’nnotifications_enabledvlag sodat elke toekomstigeonNotificationPosted()payload in real time na die C2 gestroom word. send_push_notificationlaat 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_smsenretransmishionstuur arbitrêre of hergespeelde boodskappe na aanvallers-beheerde nommers.messsmsiterereer oor die hele kontakte-databasis om phishing-skakels te spam vir wurm-agtige propagasie.make_callinisier stemoproepe wat sosiale-ingenieurswese-werkstrome ondersteun.get_sms_list/get_smsenget_call_log/get_callsdumpt 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_listenumereer geïnstalleerde pakkette (ATT&CK T1418).get_device_inforapporteer model, OS-weergawe en batterystatus (T1426).get_cam/get_cameraneem voorste kamera-stilbeelde, terwylget_keylogger_datalock-PINs plus wagwoorde, view-beskrywings en hints wat uit sensitiewe velde geskraap is, serialiseer.get_proxy_datahaal ’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
- HTTP(S) heartbeat – iterasie oor ’n hard-gekodeerde lys totdat een domein antwoord
POST /app/searchPackageNamemet die aktiewe C2. - WebSocket (port 8282) – bidirectionele JSON-opdragte:
update– push nuwe conf/APKsalert_arr– konfigureer overlay-sjablonereport_list– stuur lys van geteikende pakketnameheartbeat_web– keep-alive
- RTMP (port 1935) – lewendige skerm/video streaming.
- 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)metFLAG_SECUREom tap/overlay-hijacking te voorkom. - Detecteer overlays deur
WindowManager.getDefaultDisplay().getFlags()of dieViewRootImplAPI 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 ListVoorbeeldvloei (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
viewIdResourceNamewanneer 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
- Return of ClayRat: Expanded Features and Techniques
- ClayRat v3 IoCs (Zimperium)
- PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT
- Android accessibility documentation – Automating UI interaction
- The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)
- GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

