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 obscurcit visiblement l’application victime, son interface utilisateur est conçue de manière à tromper l’utilisateur pour qu’il interagisse avec elle, tout en transmettant l’interaction à l’application victime.
En effet, cela aveugle l’utilisateur sur le fait qu’il effectue réellement des actions sur l’application victime.

Détection

Pour détecter les applications vulnérables à cette attaque, vous devez rechercher des activités exportées dans le manifeste android (notez qu’une activité avec un intent-filter est automatiquement exportée par défaut). Une fois que vous avez trouvé les activités exportées, vérifiez si elles nécessitent une permission. Cela est dû au fait que l’application malveillante aura également besoin de cette permission.

Vous pouvez également vérifier la version SDK minimale de l’application, en vérifiant la valeur de android:minSdkVersion dans le fichier AndroidManifest.xml. Si la valeur est inférieure à 30, l’application est vulnérable au Tapjacking.

Protection

Android 12 (API 31,32) et supérieur

Selon cette source, les attaques de tapjacking sont automatiquement empêchées par Android à partir d’Android 12 (API 31 & 30) et supérieur. Donc, même si l’application est vulnérable, vous ne pourrez pas l’exploiter.

filterTouchesWhenObscured

Si android:filterTouchesWhenObscured est défini sur true, la View ne recevra pas de touches chaque fois que la fenêtre de la vue est obscurcie par une autre fenêtre visible.

setFilterTouchesWhenObscured

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

<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 dernière application Android effectuant une attaque Tapjacking (+ invocation avant une activité exportée de l’application attaquée) peut être trouvée ici : https://github.com/carlospolop/Tapjacking-ExportedActivity.

Suivez les instructions du README pour l’utiliser.

FloatingWindowApp

Un projet exemple implémentant FloatingWindowApp, qui peut être utilisé pour se superposer à d’autres activités afin d’effectuer une attaque clickjacking, peut être trouvé dans 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 les éventuelles vulnérabilités de Tapjacking.\

L’atténuation est relativement simple car le développeur peut choisir de ne pas recevoir d’événements tactiles lorsqu’une vue est recouverte par une autre. En utilisant la Référence des développeurs Android:

Parfois, il est essentiel qu’une application puisse vérifier qu’une action est effectuée avec la pleine connaissance et le consentement de l’utilisateur, comme accorder une demande de permission, effectuer un achat ou cliquer sur une publicité. Malheureusement, une application malveillante pourrait essayer de tromper l’utilisateur pour qu’il effectue ces actions, à son insu, en dissimulant le but prévu de la vue. En remède, le framework offre un mécanisme de filtrage des touches qui peut être utilisé pour améliorer la sécurité des vues qui fournissent un accès à des fonctionnalités sensibles.

Pour activer le filtrage des touches, appelez setFilterTouchesWhenObscured(boolean) ou définissez l’attribut de mise en page android:filterTouchesWhenObscured sur true. Lorsqu’il est activé, le framework rejettera les touches reçues chaque fois que la fenêtre de la vue est obscurcie par une autre fenêtre visible. En conséquence, la vue ne recevra pas de touches chaque fois qu’un toast, un dialogue ou une autre fenêtre apparaît au-dessus de la fenêtre de la vue.


Phishing par superposition d’accessibilité (variante de Trojan bancaire)

En plus du Tapjacking classique, les familles de logiciels malveillants bancaires Android modernes (par exemple, ToxicPanda, BrasDex, Sova, etc.) abusent du Service d’accessibilité pour placer une superposition WebView en plein écran au-dessus de l’application légitime tout en étant capable de transmettre l’entrée utilisateur à la vue 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.

Comment ça fonctionne

  1. L’APK malveillant demande la permission très sensible BIND_ACCESSIBILITY_SERVICE, cachant généralement la demande derrière un faux dialogue Google/Chrome/visualiseur PDF.
  2. Une fois que l’utilisateur active le service, le logiciel malveillant simule programmatique les taps nécessaires pour accorder des permissions supplémentaires dangereuses (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Un WebView est gonflé et ajouté au gestionnaire de fenêtres en utilisant le type de fenêtre TYPE_ACCESSIBILITY_OVERLAY. La superposition peut être rendue totalement opaque ou semi-transparente et peut être marquée comme “à travers” afin que les touches d’origine soient toujours livrées à l’activité en arrière-plan (ainsi la transaction se produit réellement 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);

Workflow typique utilisé par les chevaux de Troie bancaires

  • Interroger les packages installés (QUERY_ALL_PACKAGES) pour déterminer quelle application bancaire / portefeuille est actuellement ouverte.
  • Télécharger un modèle de superposition HTML/JS depuis le C2 qui imite parfaitement cette application spécifique (logo, couleurs, chaînes i18n…).
  • Afficher la superposition, récolter les identifiants/numéros PIN/motif.
  • Utiliser l’API d’accessibilité (performGlobalAction, GestureDescription) pour automatiser les transferts en arrière-plan.

Détection et 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 (banque / portefeuille) :
  • Activer android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) sur les vues sensibles pour bloquer les services non Play Store.
  • Combiner avec setFilterTouchesWhenObscured(true) et FLAG_SECURE.
  • Renforcement du système :
  • Désactiver Installer à partir de sources inconnues et Accessibilité pour les applications non fiables.
  • Appliquer PlayProtect et des appareils à jour.

Pour des détails supplémentaires sur l’utilisation des services d’accessibilité pour un contrôle total à distance de l’appareil (par exemple, 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