Tapjacking

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

Tapjacking est une attaque où une application malveillante est lancée et se positionne au‑dessus d’une application victime. Une fois qu’elle masque visiblement l’application victime, son interface utilisateur est conçue de façon à tromper l’utilisateur pour qu’il interagisse avec elle, tandis qu’elle transmet l’interaction à l’application victime.
En pratique, cela empêche l’utilisateur de savoir qu’il effectue en réalité des actions sur l’application victime.

Détection

  • Recherchez les exported activities dans le Android manifest (une activity avec un intent-filter est exportée par défaut). Si une exported activity est protégée par une permission, l’app attaquante devra posséder la même permission, ce qui limite l’exploitabilité.
  • Vérifiez la version minimum SDK android:minSdkVersion dans AndroidManifest.xml. Si elle est inférieure à 30, des comportements par défaut plus anciens peuvent rendre le tapjacking plus facile à exploiter.
  • À l’exécution, utilisez logcat pour repérer les touches bloquées sur Android 12+: le système enregistre Untrusted touch due to occlusion by <package> lorsque les overlays sont filtrés.

Protection

Blocage par défaut d’Android 12+ et flags de compatibilité

Android 12 (API 31) a introduit “Block untrusted touches” : les touches provenant d’une autre fenêtre UID de type TYPE_APPLICATION_OVERLAY (opacity ≥0.8) sont ignorées. Ceci est activé par défaut. Pendant les tests, vous pouvez le basculer :

# 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

Les fenêtres de confiance (accessibilité, IME, assistant) continuent de recevoir des événements. Les surcouches invisibles ou entièrement transparentes contournent également le blocage, ce que les attaquants tentent d’exploiter en gardant alpha < 0.8.

Gestion de l’occlusion partielle

Les surcouches partielles qui laissent la zone cible visible ne sont pas bloquées automatiquement. Atténuez cela dans les vues sensibles en rejetant les événements portant le drapeau 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

Si android:filterTouchesWhenObscured est défini sur true, la View ne recevra pas d’appuis tactiles chaque fois que la fenêtre de la View est masquée par une autre fenêtre visible.

setFilterTouchesWhenObscured

L’attribut setFilterTouchesWhenObscured défini sur true peut aussi empêcher l’exploitation de cette vulnérabilité si la version d’Android est plus ancienne.
S’il est défini sur true, par exemple, un bouton peut être automatiquement désactivé s’il est masqué :

<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

La version la plus récente d’une application Android effectuant une attaque de Tapjacking (et s’exécutant avant une exported activity de l’application ciblée) se trouve ici : https://github.com/carlospolop/Tapjacking-ExportedActivity.

Suivez les instructions du README pour l’utiliser.

FloatingWindowApp

Un projet d’exemple implémentant FloatingWindowApp, qui peut être utilisé pour se placer au-dessus d’autres activities afin d’effectuer une attaque de clickjacking, se trouve sur FloatingWindowApp (un peu ancien, bonne chance pour construire l’apk).

Qark

Caution

Il semble que ce projet ne soit plus maintenu et que cette fonctionnalité ne fonctionne plus correctement

Vous pouvez utiliser qark avec les paramètres --exploit-apk –sdk-path /Users/username/Library/Android/sdk pour créer une application malveillante afin de tester d’éventuelles vulnérabilités de Tapjacking.\

La mitigation est relativement simple car le développeur peut choisir de ne pas recevoir les événements tactiles lorsqu’une view est recouverte par une autre. En vous référant à l’Android Developer’s Reference :

Parfois, il est essentiel qu’une application puisse vérifier qu’une action est réalisée avec la pleine connaissance et le consentement de l’utilisateur, par exemple l’acceptation d’une demande d’autorisation, l’achat d’un produit ou le clic sur une publicité. Malheureusement, une application malveillante pourrait tenter d’induire l’utilisateur en erreur pour le pousser à réaliser ces actions à son insu, en dissimulant le but réel de la view. En guise de remède, le framework propose un mécanisme de filtrage des touches qui peut être utilisé pour améliorer la sécurité des views qui donnent accès à des fonctionnalités sensibles.

Pour activer le filtrage des touches, appelez setFilterTouchesWhenObscured(boolean) ou définissez l’attribut de layout android:filterTouchesWhenObscured sur true. Lorsqu’il est activé, le framework ignore les touches qui sont reçues lorsque la fenêtre de la view est masquée par une autre fenêtre visible. En conséquence, la view ne recevra pas de touches chaque fois qu’un toast, un dialog ou une autre fenêtre apparaît au-dessus de la fenêtre de la view.


Recent overlay-based malware techniques

  • Hook/Ermac variants utilisent des overlays presque transparents (par ex., faux prompts NFC) pour capturer des gestes et des PIN d’écran de verrouillage tout en transmettant les touches en dessous, distribués via des modules Accessibility-ATS.
  • Anatsa/TeaBot droppers déploient des overlays pour des centaines d’apps bancaires/crypto et affichent des overlays plein écran “maintenance” pour retarder les victimes pendant qu’ATS complète les transferts.
  • Hidden-VNC banking RATs affichent brièvement des overlays de phishing pour capturer des identifiants, puis s’appuient sur un VNC covert plus Accessibility pour rejouer des taps avec moins d’artefacts sur l’appareil.

Conclusion pratique pour les red teams : combinez un overlay avec alpha < 0.8 pour contourner le blocage d’Android 12, puis montez en puissance vers un overlay accessibility plein écran une fois que l’utilisateur active le service. Instrumentez GestureDescription ou un VNC headless pour conserver le contrôle après la capture des identifiants.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Outre le Tapjacking classique, les familles modernes de malware bancaires Android (p. ex. ToxicPanda, BrasDex, Sova, etc.) abusent du Accessibility Service pour placer une WebView overlay en plein écran au-dessus de l’application légitime tout en étant capables de transmettre les entrées de l’utilisateur vers la view en dessous. Cela augmente considérablement la crédibilité et permet aux attaquants de voler des identifiants, des OTP ou même d’automatiser des transactions frauduleuses.

How it works

  1. L’APK malveillant demande la permission très sensible BIND_ACCESSIBILITY_SERVICE, cachant généralement la demande derrière une fausse boîte de dialogue Google/Chrome/visualiseur PDF.
  2. Une fois que l’utilisateur active le service, le malware simule de manière programmatique les taps nécessaires pour accorder des permissions dangereuses supplémentaires (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Une WebView est instanciée et ajoutée au window manager en utilisant le type de fenêtre TYPE_ACCESSIBILITY_OVERLAY. L’overlay peut être rendu totalement opaque ou semi-transparent et peut être marqué comme “through” de sorte que les touches originales soient toujours délivrées à l’activité de fond (ainsi la transaction a réellement lieu pendant que la victime ne voit que le formulaire de 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);

Flux de travail typique utilisés par les banking Trojans

  • Interroger les packages installés (QUERY_ALL_PACKAGES) pour déterminer quelle banking / wallet app est actuellement ouverte.
  • Télécharger un HTML/JS overlay template depuis le C2 qui imite parfaitement cette application spécifique (Logo, colours, i18n strings…).
  • Afficher l’overlay, récolter les credentials/PIN/pattern.
  • Utiliser l’Accessibility API (performGlobalAction, GestureDescription) pour automatiser les virements en arrière-plan.

Détection & Atténuation

  • Auditer la liste des applications installées avec adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Du côté de l’application (bank / wallet) :
  • Activer android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) sur les vues sensibles pour bloquer les services non-Play-Store.
  • Combiner avec setFilterTouchesWhenObscured(true) et FLAG_SECURE.

Pour plus de détails sur l’exploitation des Accessibility Services pour un contrôle total à distance de l’appareil (e.g. PlayPraetor, SpyNote, etc.) voir :

Accessibility Services Abuse

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks