Tapjacking

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

Tapjacking è un attacco in cui una applicazione maligna viene lanciata e si posiziona sopra un’applicazione vittima. Una volta che oscura visibilmente l’app vittima, la sua interfaccia utente è progettata in modo da ingannare l’utente facendolo interagire con essa, mentre inoltra l’interazione all’app vittima.
In pratica, sta ciecando l’utente impedendogli di sapere che sta effettivamente eseguendo azioni sull’app vittima.

Rilevamento

  • Cerca attività esportate nel manifest di Android (un’attività con un intent-filter è esportata di default). Se un’attività esportata è protetta da un permesso, l’app attaccante avrà bisogno dello stesso permesso, il che limita la possibilità di sfruttamento.
  • Controlla la versione minima del SDK android:minSdkVersion in AndroidManifest.xml. Se è inferiore a 30, comportamenti predefiniti più vecchi potrebbero rendere il tapjacking più facile da sfruttare.
  • A runtime, usa logcat per individuare tocchi bloccati su Android 12+: il sistema registra Untrusted touch due to occlusion by <package> quando gli overlay vengono filtrati.

Protezione

Android 12+ default blocking & compat flags

Android 12 (API 31) ha introdotto “Block untrusted touches”: i tocchi provenienti da una finestra di un altro UID di tipo TYPE_APPLICATION_OVERLAY (opacità ≥0.8) vengono scartati. Questo è abilitato di default. Durante i test puoi attivarlo/disattivarlo:

# 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

Le finestre attendibili (accessibility, IME, assistant) continuano a ricevere eventi. Overlay invisibili o completamente trasparenti aggirano comunque il blocco, cosa che gli attaccanti cercano di sfruttare mantenendo alpha < 0.8.

Gestione della occlusione parziale

Gli overlay parziali che lasciano l’area target visibile non vengono bloccati automaticamente. Mitiga nelle view sensibili respingendo gli eventi con il FLAG_WINDOW_IS_PARTIALLY_OBSCURED flag:

@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

Se android:filterTouchesWhenObscured è impostato su true, la View non riceverà tocchi ogni volta che la finestra della View è oscurata da un’altra finestra visibile.

setFilterTouchesWhenObscured

L’attributo setFilterTouchesWhenObscured impostato su true può anche prevenire lo sfruttamento di questa vulnerabilità se la versione di Android è più vecchia.
Se impostato su true, ad esempio, un pulsante può essere automaticamente disabilitato se è oscurato:

<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

L’applicazione Android più recente che esegue un attacco Tapjacking (invocando prima un’activity esportata dell’applicazione attaccata) si trova in: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Segui le istruzioni del README per usarlo.

FloatingWindowApp

Un progetto di esempio che implementa FloatingWindowApp, utilizzabile per posizionarsi sopra altre activity per eseguire un clickjacking, si trova in FloatingWindowApp (un po’ datato, buona fortuna a compilare l’apk).

Qark

Caution

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

Puoi usare qark con i parametri --exploit-apk –sdk-path /Users/username/Library/Android/sdk per creare un’applicazione malevola per testare possibili vulnerabilità Tapjacking.\

La mitigazione è relativamente semplice: lo sviluppatore può scegliere di non ricevere eventi touch quando una view è coperta da un’altra. Usando la 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.


Tecniche recenti di malware basate su overlay

  • Hook/Ermac variants usano overlay quasi trasparenti (es., prompt NFC falsi) per catturare gesture e PIN della schermata di blocco mentre inoltrano i tocchi sottostanti, consegnati tramite moduli Accessibility-ATS.
  • Anatsa/TeaBot droppers distribuiscono overlay per centinaia di app banking/crypto e mostrano overlay a schermo intero “maintenance” per rallentare le vittime mentre ATS completa i trasferimenti.
  • Hidden-VNC banking RATs mostrano brevemente overlay di phishing per catturare credenziali, poi si affidano a VNC covert e Accessibility per riprodurre i tap con meno artefatti sul dispositivo.

Takeaway pratico per i red teams: combina un overlay con alpha < 0.8 per bypassare il blocco di Android 12, poi scala a un accessibility overlay a schermo intero una volta che l’utente abilita il servizio. Usa GestureDescription o un headless VNC per mantenere il controllo dopo che le credenziali sono state catturate.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Oltre al classico Tapjacking, le moderne famiglie di malware banking Android (es. ToxicPanda, BrasDex, Sova, ecc.) abusano dell’Accessibility Service per posizionare una WebView overlay a schermo intero sopra l’applicazione legittima pur essendo in grado di inoltrare l’input dell’utente alla view sottostante. Questo aumenta notevolmente la credibilità e permette agli aggressori di rubare credenziali, OTP o persino automatizzare transazioni fraudolente.

How it works

  1. L’APK malevolo richiede il permesso altamente sensibile BIND_ACCESSIBILITY_SERVICE, solitamente nascondendo la richiesta dietro un finto dialog di Google/Chrome/PDF-viewer.
  2. Una volta che l’utente abilita il servizio, il malware simula programmaticamente i tap necessari per concedere permessi pericolosi aggiuntivi (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Una WebView viene instanziata e aggiunta al window manager usando il tipo di finestra TYPE_ACCESSIBILITY_OVERLAY. L’overlay può essere reso totalmente opaco o semi-trasparente e può essere contrassegnato come “through” in modo che i tocchi originali vengano comunque inoltrati all’activity di background (quindi la transazione avviene realmente mentre la vittima vede solo il form di phishing).
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);

Tipico flusso di lavoro usato da banking Trojans

  • Interrogare i pacchetti installati (QUERY_ALL_PACKAGES) per capire quale app banking / wallet è attualmente aperta.
  • Scaricare un HTML/JS overlay template dal C2 che imiti perfettamente quella specifica applicazione (Logo, colours, i18n strings…).
  • Mostrare l’overlay e raccogliere credenziali/PIN/pattern.
  • Usare la Accessibility API (performGlobalAction, GestureDescription) per automatizzare trasferimenti in background.

Rilevamento & Mitigazione

  • Verificare l’elenco delle app installate con adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Dal lato dell’applicazione (bank / wallet):
  • Abilitare android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) sulle view sensibili per bloccare servizi non-Play-Store.
  • Combinarlo con setFilterTouchesWhenObscured(true) e FLAG_SECURE.

Per ulteriori dettagli sull’utilizzo di Accessibility Services per il controllo remoto completo del dispositivo (es. PlayPraetor, SpyNote, etc.) vedi:

Accessibility Services Abuse

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks