Tapjacking

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

Osnovne informacije

Tapjacking je napad u kome se pokreće zlonamerna aplikacija i postavi iznad ciljane aplikacije. Kada vizuelno zakloni ciljnu aplikaciju, njen korisnički interfejs je dizajniran tako da prevari korisnika da interaguje sa njom, dok ona prosleđuje interakciju ciljnoj aplikaciji.
U suštini, to onemogućava korisniku da zna da zapravo izvodi radnje na ciljnoj aplikaciji.

Otkrivanje

  • Potražite exported activities u Android manifestu (aktivnost sa intent-filter je exported po defaultu). Ako je exported activity zaštićena permission-om, zlonamerna aplikacija će trebati isti permission, što ograničava eksploatabilnost.
  • Proverite minimum SDK verziju android:minSdkVersion u AndroidManifest.xml. Ako je niža od 30, starije podrazumevane vrednosti ponašanja mogu olakšati eksploataciju tapjacking-a.
  • U runtime-u, koristite logcat da uočite blokirane dodire na Android 12+: sistem loguje Untrusted touch due to occlusion by <package> kada su overlayi filtrirani.

Zaštita

Android 12+ podrazumevano blokiranje i compat flagovi

Android 12 (API 31) je uveo “Block untrusted touches”: dodiri koji dolaze iz drugog UID prozora tipa TYPE_APPLICATION_OVERLAY (opacity ≥0.8) se odbacuju. Ovo je omogućeno po defaultu. Tokom testiranja možete ga uključiti/isključiti:

# disable blocking for a specific package (for PoC crafting)
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.victim
# re‑enable
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.victim

Pouzdani prozori (accessibility, IME, assistant) i dalje primaju događaje. Nevidljivi ili potpuno providni overlays takođe zaobilaze blokadu, što napadači pokušavaju da iskoriste tako što drže alpha < 0.8.

Rukovanje delimičnim zaklanjanjem

Delimični overlays koji ostavljaju ciljano područje vidljivim nisu automatski blokirani. Ublažite u osetljivim prikazima tako što ćete odbacivati događaje sa oznakom FLAG_WINDOW_IS_PARTIALLY_OBSCURED:

@Override
public boolean onFilterTouchEventForSecurity(MotionEvent event) {
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
return false; // drop tap when anything partially obscures us
}
return super.onFilterTouchEventForSecurity(event);
}

filterTouchesWhenObscured

Ako je android:filterTouchesWhenObscured postavljen na true, View neće primati dodire kad god je prozor prikaza zasenčen drugim vidljivim prozorom.

setFilterTouchesWhenObscured

Atribut setFilterTouchesWhenObscured postavljen na true takođe može sprečiti eksploataciju ove ranjivosti ako je verzija Android-a niža.
Ako je postavljeno na true, na primer, dugme može biti automatski onemogućeno ako je zasenčeno:

<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>

Exploitation

Tapjacking-ExportedActivity

The most recent Android application performing a Tapjacking attack (+ invoking before an exported activity of the attacked application) can be found in: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Follow the README instructions to use it.

FloatingWindowApp

An example project implementing FloatingWindowApp, which can be used to put on top of other activities to perform a clickjacking attack, can be found in FloatingWindowApp (a bit old, good luck building the apk).

Qark

Caution

It looks like this project is now unmaintained and this functionality isn’t properly working anymore

You can use qark with the --exploit-apk –sdk-path /Users/username/Library/Android/sdk parameters to create a malicious application to test for possible Tapjacking vulnerabilities.\

The mitigation is relatively simple as the developer may choose not to receive touch events when a view is covered by another. Using the Android Developer’s Reference:

Sometimes it is essential that an application be able to verify that an action is being performed with the full knowledge and consent of the user, such as granting a permission request, making a purchase or clicking on an advertisement. Unfortunately, a malicious application could try to spoof the user into performing these actions, unaware, by concealing the intended purpose of the view. As a remedy, the framework offers a touch filtering mechanism that can be used to improve the security of views that provide access to sensitive functionality.

To enable touch filtering, call setFilterTouchesWhenObscured(boolean) or set the android:filterTouchesWhenObscured layout attribute to true. When enabled, the framework will discard touches that are received whenever the view’s window is obscured by another visible window. As a result, the view will not receive touches whenever a toast, dialog or other window appears above the view’s window.


Recent overlay-based malware techniques

  • Hook/Ermac variants use nearly transparent overlays (e.g., fake NFC prompts) to capture gestures and lock-screen PINs while forwarding touches underneath, delivered via Accessibility-ATS modules.
  • Anatsa/TeaBot droppers ship overlays for hundreds of banking/crypto apps and show full-screen “maintenance” overlays to stall victims while ATS completes transfers.
  • Hidden-VNC banking RATs briefly display phishing overlays to capture credentials, then rely on covert VNC plus Accessibility to replay taps with fewer on-device artifacts.

Practical takeaway for red teams: mix an alpha < 0.8 overlay to bypass Android 12 blocking, then escalate to a full-screen accessibility overlay once the user toggles the service. Instrument GestureDescription or a headless VNC to keep control after credentials are captured.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Besides classic Tapjacking, modern Android banking malware families (e.g. ToxicPanda, BrasDex, Sova, etc.) abuse the Accessibility Service to place a full-screen WebView overlay above the legitimate application while still being able to forward the user input to the view underneath. This dramatically increases believability and allows attackers to steal credentials, OTPs or even automate fraudulent transactions.

How it works

  1. The malicious APK requests the highly-sensitive BIND_ACCESSIBILITY_SERVICE permission, usually hiding the request behind a fake Google/Chrome/PDF-viewer dialog.
  2. Once the user enables the service, the malware programmatically simulates the taps required to grant additional dangerous permissions (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. A WebView is inflated and added to the window manager using the TYPE_ACCESSIBILITY_OVERLAY window type. The overlay can be rendered totally opaque or semi-transparent and can be flagged as “through” so that the original touches are still delivered to the background activity (thus the transaction really happens while the victim only sees the phishing form).
WebView phishingView = new WebView(getApplicationContext());
phishingView.getSettings().setJavaScriptEnabled(true);
phishingView.loadUrl("file:///android_asset/bank_login.html");

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,  // <-- bypasses SYSTEM_ALERT_WINDOW prompt
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,        // «through» flag → forward touches
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);

Tipičan tok rada koji koriste banking Trojans

  • Pretraže instalirane pakete (QUERY_ALL_PACKAGES) da utvrde koja je banking / wallet aplikacija trenutno otvorena.
  • Preuzmu HTML/JS overlay template sa C2 koji savršeno imitira tu konkretnu aplikaciju (Logo, colours, i18n strings…).
  • Prikažu overlay i prikupe credentials/PIN/pattern.
  • Koriste Accessibility API (performGlobalAction, GestureDescription) za automatizaciju transfera u pozadini.

Otkrivanje i ublažavanje

  • Proverite listu instaliranih aplikacija pomoću adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Sa strane aplikacije (bank / wallet):
  • Omogućite android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) na osetljivim view-ovima da biste blokirali non-Play-Store servise.
  • Kombinujte sa setFilterTouchesWhenObscured(true) i FLAG_SECURE.

Za dodatne detalje o korišćenju Accessibility Services za potpuno daljinsko upravljanje uređajem (npr. PlayPraetor, SpyNote, itd.) pogledajte:

Accessibility Services Abuse

Reference

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