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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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:minSdkVersiondansAndroidManifest.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
logcatpour repérer les touches bloquées sur Android 12+: le système enregistreUntrusted 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
- 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. - 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, …). - 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)etFLAG_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 :
Références
- Android Developers – Tapjacking risk & mitigations (updated 2024)
- Zimperium – HOOK v3 overlay expansion (Aug 2025)
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


