Tapjacking

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Tapjacking ist ein Angriff, bei dem eine bösartige application gestartet wird und sich über einer victim application positioniert. Sobald sie die victim app sichtbar überdeckt, ist ihre Benutzeroberfläche so gestaltet, dass der Benutzer dazu verleitet wird, mit ihr zu interagieren, während die Interaktion an die victim app weitergereicht wird.
Effektiv wird der Benutzer daran gehindert zu erkennen, dass er tatsächlich Aktionen in der victim app ausführt.

Erkennung

  • Suche nach exported activities im Android-Manifest (eine activity mit einem intent-filter ist standardmäßig exported). Wenn eine exported activity durch eine permission geschützt ist, benötigt die angreifende app die gleiche permission, was die Ausnutzbarkeit einschränkt.
  • Prüfe die minimum SDK-Version android:minSdkVersion in AndroidManifest.xml. Ist sie niedriger als 30, können ältere Standardverhalten tapjacking leichter ausnutzbar machen.
  • Zur Laufzeit logcat verwenden, um blockierte Touches auf Android 12+ zu erkennen: Das System loggt Untrusted touch due to occlusion by <package> , wenn Overlays gefiltert werden.

Schutz

Android 12+ default blocking & compat flags

Android 12 (API 31) führte “Block untrusted touches” ein: Touches, die von einem anderen UID-Fenster des Typs TYPE_APPLICATION_OVERLAY (opacity ≥0.8) stammen, werden verworfen. Dies ist standardmäßig aktiviert. Während Tests kann man es umschalten:

# 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

Vertrauenswürdige Fenster (accessibility, IME, assistant) erhalten weiterhin Ereignisse. Unsichtbare oder vollständig transparente Overlays umgehen ebenfalls die Blockierung; Angreifer versuchen dies auszunutzen, indem sie alpha < 0.8 beibehalten.

Umgang mit teilweiser Verdeckung

Teilweise Overlays, die den Zielbereich sichtbar lassen, werden nicht automatisch blockiert. Mindern Sie dies in sensiblen Ansichten, indem Sie Ereignisse mit dem FLAG_WINDOW_IS_PARTIALLY_OBSCURED-Flag ablehnen:

@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

Wenn android:filterTouchesWhenObscured auf true gesetzt ist, erhält die View keine Touch-Ereignisse, sobald das Fenster der View von einem anderen sichtbaren Fenster überdeckt wird.

setFilterTouchesWhenObscured

Das Attribut setFilterTouchesWhenObscured, auf true gesetzt, kann die Ausnutzung dieser Schwachstelle ebenfalls verhindern, falls die Android-Version älter ist.
Wenn auf true gesetzt, kann beispielsweise ein Button automatisch deaktiviert werden, wenn er überdeckt ist:

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

Ausnutzung

Tapjacking-ExportedActivity

Die aktuellste Android application, die einen Tapjacking-Angriff durchführt (+ vorher ein exported activity der angegriffenen Anwendung aufruft), ist zu finden unter: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Folgen Sie den README-Anweisungen zur Nutzung.

FloatingWindowApp

Ein Beispielprojekt, das FloatingWindowApp implementiert und dazu verwendet werden kann, über anderen Activities platziert zu werden, um einen Clickjacking-Angriff durchzuführen, ist zu finden in FloatingWindowApp (etwas alt, viel Erfolg beim Bauen der apk).

Qark

Caution

Es scheint, dass dieses Projekt inzwischen unmaintained ist und diese Funktionalität nicht mehr richtig funktioniert

Sie können qark mit den Parametern --exploit-apk –sdk-path /Users/username/Library/Android/sdk verwenden, um eine bösartige Anwendung zu erstellen, mit der Sie auf mögliche Tapjacking-Schwachstellen testen können.\

Die Mitigation ist relativ einfach, da der Entwickler wählen kann, keine Touch-Events zu empfangen, wenn eine View von einer anderen verdeckt wird. Unter Verwendung der Android Developer’s Reference:

Manchmal ist es wichtig, dass eine Anwendung überprüfen kann, ob eine Aktion mit vollem Wissen und Einverständnis des Benutzers ausgeführt wird, wie z. B. das Gewähren einer Berechtigungsanfrage, ein Kauf oder das Klicken auf eine Anzeige. Leider könnte eine bösartige Anwendung versuchen, den Benutzer dazu zu bringen, diese Aktionen unwissentlich auszuführen, indem sie den beabsichtigten Zweck der View verschleiert. Als Abhilfe bietet das Framework einen Touch-Filter-Mechanismus, der verwendet werden kann, um die Sicherheit von Views zu verbessern, die Zugriff auf sensible Funktionalität bieten.

Um Touch-Filtering zu aktivieren, rufen Sie setFilterTouchesWhenObscured(boolean) auf oder setzen Sie das android:filterTouchesWhenObscured Layout-Attribut auf true. Wenn aktiviert, verwirft das Framework Berührungen, die empfangen werden, wann immer das Fenster der View von einem anderen sichtbaren Fenster verdeckt wird. Als Ergebnis erhält die View keine Berührungen, wann immer ein Toast, Dialog oder ein anderes Fenster über dem Fenster der View erscheint.


Recent overlay-based malware techniques

  • Hook/Ermac variants verwenden nahezu transparente Overlays (z. B. gefälschte NFC-Prompts), um Gesten und Lock-Screen-PINs zu erfassen und gleichzeitig die Touches darunter weiterzuleiten, ausgeliefert über Accessibility-ATS modules.
  • Anatsa/TeaBot droppers liefern Overlays für Hunderte von Banking-/Crypto-Apps und zeigen vollbildige “maintenance”-Overlays, um Opfer aufzuhalten, während ATS Transfers abschließt.
  • Hidden-VNC banking RATs zeigen kurz Phishing-Overlays an, um Zugangsdaten zu erfassen, und verlassen sich dann auf covert VNC plus Accessibility, um Taps mit weniger Artefakten auf dem Gerät wiederzugeben.

Praktische Erkenntnis für Red Teams: mixen Sie ein alpha < 0.8 Overlay, um das Blocking in Android 12 zu umgehen, und eskalieren Sie dann zu einem Full-Screen accessibility Overlay, sobald der Nutzer den Service aktiviert. Instrumentieren Sie GestureDescription oder ein headless VNC, um die Kontrolle zu behalten, nachdem die Zugangsdaten erfasst wurden.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Neben klassischem Tapjacking missbrauchen moderne Android-Banking-Malware-Familien (z. B. ToxicPanda, BrasDex, Sova, etc.) den Accessibility Service, um ein vollflächiges WebView overlay über der legitimen Anwendung zu platzieren und gleichzeitig weiterhin die Fähigkeit zu haben, die Benutzereingabe weiterzuleiten an die darunterliegende View. Dies erhöht die Glaubwürdigkeit dramatisch und ermöglicht es Angreifern, Zugangsdaten, OTPs zu stehlen oder sogar betrügerische Transaktionen zu automatisieren.

Wie es funktioniert

  1. Die bösartige APK fordert die hochsensible Berechtigung BIND_ACCESSIBILITY_SERVICE an, meist verborgen hinter einem gefälschten Google/Chrome/PDF-Viewer-Dialog.
  2. Sobald der Benutzer den Service aktiviert, simuliert die Malware programmgesteuert die erforderlichen Taps, um weitere gefährliche Berechtigungen zu gewähren (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Ein WebView wird aufgeblasen und dem Window Manager mit dem Window-Typ TYPE_ACCESSIBILITY_OVERLAY hinzugefügt. Das Overlay kann vollkommen undurchsichtig oder halbtransparent gerendert werden und kann als “through” markiert werden, sodass die ursprünglichen Touches weiterhin an die Hintergrund-Activity geliefert werden (die Transaktion findet somit wirklich statt, während das Opfer nur das Phishing-Formular sieht).
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);

Typischer Ablauf, der von banking Trojans verwendet wird

  • Installierte Pakete abfragen (QUERY_ALL_PACKAGES), um herauszufinden, welche banking / wallet app gerade geöffnet ist.
  • Lade eine HTML/JS overlay template vom C2 herunter, die diese spezifische Anwendung perfekt nachahmt (Logo, colours, i18n strings…).
  • Zeige das Overlay an, sammle credentials/PIN/pattern.
  • Nutze die Accessibility API (performGlobalAction, GestureDescription), um Überweisungen im Hintergrund zu automatisieren.

Erkennung & Gegenmaßnahmen

  • Prüfe die Liste der installierten Apps mit adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Auf Anwendungsebene (bank / wallet):
  • Aktiviere android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) auf sensiblen Views, um non-Play-Store services zu blockieren.
  • Kombiniere mit setFilterTouchesWhenObscured(true) und FLAG_SECURE.

Für zusätzliche Details zur Nutzung von Accessibility Services für vollständige Remote-Gerätesteuerung (z. B. PlayPraetor, SpyNote, etc.) siehe:

Accessibility Services Abuse

References

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks