Tapjacking

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Βασικές πληροφορίες

Tapjacking είναι μια επίθεση όπου μια κακόβουλη εφαρμογή ξεκινάει και τοποθετείται πάνω από μια εφαρμογή θύμα. Μόλις καλύψει οπτικά την εφαρμογή θύμα, το user interface της σχεδιάζεται έτσι ώστε να ξεγελάει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ παράλληλα προωθεί την αλληλεπίδραση στην εφαρμογή θύμα.
Στην ουσία, τυφλώνει τον χρήστη ώστε να μην γνωρίζει ότι στην πραγματικότητα εκτελεί ενέργειες στην εφαρμογή θύμα.

Εντοπισμός

  • Ψάξτε για exported activities στο Android manifest (an activity with an intent-filter is exported by default). Αν μια exported activity προστατεύεται από μια permission, η επιτιθέμενη app θα χρειαστεί την ίδια permission, κάτι που περιορίζει την εκμεταλλευσιμότητα.
  • Ελέγξτε το minimum SDK version android:minSdkVersion στο AndroidManifest.xml. Αν είναι χαμηλότερο από 30, παλαιότερες προεπιλεγμένες συμπεριφορές μπορεί να κάνουν το tapjacking πιο εύκολο στην εκμετάλλευση.
  • Κατά το runtime, χρησιμοποιήστε logcat για να εντοπίσετε blocked touches σε Android 12+: το σύστημα καταγράφει Untrusted touch due to occlusion by <package> όταν τα overlays φιλτράρονται.

Προστασία

Android 12+ προεπιλεγμένο μπλοκάρισμα & compat flags

Android 12 (API 31) εισήγαγε το “Block untrusted touches”: αγγίγματα που προέρχονται από άλλο παράθυρο UID του τύπου TYPE_APPLICATION_OVERLAY (opacity ≥0.8) απορρίπτονται. Αυτό είναι ενεργοποιημένο από προεπιλογή. Κατά τις δοκιμές μπορείτε να το εναλλάσσετε:

# 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

Τα αξιόπιστα παράθυρα (accessibility, IME, assistant) εξακολουθούν να λαμβάνουν συμβάντα. Αόρατες ή πλήρως διαφανείς επικαλύψεις επίσης παρακάμπτουν τον αποκλεισμό, κάτι που οι επιτιθέμενοι προσπαθούν να εκμεταλλευτούν διατηρώντας alpha < 0.8.

Αντιμετώπιση μερικής απόφραξης

Οι μερικές επικαλύψεις που αφήνουν την στοχευμένη περιοχή ορατή δεν μπλοκάρονται αυτόματα. Μειώστε τον κίνδυνο σε ευαίσθητες προβολές απορρίπτοντας συμβάντα με τη σημαία 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

If android:filterTouchesWhenObscured is set to true, το View δεν θα λαμβάνει αγγίγματα κάθε φορά που το παράθυρο του View καλύπτεται από άλλο ορατό παράθυρο.

setFilterTouchesWhenObscured

Το χαρακτηριστικό setFilterTouchesWhenObscured όταν έχει οριστεί σε true μπορεί επίσης να αποτρέψει την εκμετάλλευση αυτής της ευπάθειας εάν η έκδοση Android είναι παλαιότερη.
Αν οριστεί σε true, για παράδειγμα, ένα κουμπί μπορεί να απενεργοποιείται αυτόματα αν καλύπτεται:

<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

The most recent Android application performing a Tapjacking attack (+ invoking before an exported activity of the attacked application) can be found in: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Ακολουθήστε τις οδηγίες του README για να το χρησιμοποιήσετε.

FloatingWindowApp

An example project implementing FloatingWindowApp, which can be used to put on top of other activities to perform a clickjacking attack, can be found in FloatingWindowApp (a bit old, good luck building the apk).

Ένα παράδειγμα project που υλοποιεί το FloatingWindowApp, το οποίο μπορεί να χρησιμοποιηθεί για να τοποθετηθεί πάνω από άλλες activities για να εκτελέσει επίθεση clickjacking, βρίσκεται στο FloatingWindowApp (λίγο παλιό, καλή τύχη στο να φτιάξετε το apk).

Qark

Caution

Φαίνεται ότι αυτό το project πλέον δεν συντηρείται και αυτή η λειτουργικότητα δεν λειτουργεί σωστά πλέον

You can use qark with the --exploit-apk –sdk-path /Users/username/Library/Android/sdk parameters to create a malicious application to test for possible Tapjacking vulnerabilities.\

Μπορείτε να χρησιμοποιήσετε το qark με τις παραμέτρους --exploit-apk –sdk-path /Users/username/Library/Android/sdk για να δημιουργήσετε μια κακόβουλη εφαρμογή για να ελέγξετε για πιθανές ευπάθειες Tapjacking.\

The mitigation is relatively simple as the developer may choose not to receive touch events when a view is covered by another. Using the Android Developer’s Reference:

Η μετριαστική λύση είναι σχετικά απλή, καθώς ο developer μπορεί να επιλέξει να μην λαμβάνει γεγονότα αφής όταν ένα view καλύπτεται από άλλο. Χρησιμοποιώντας το 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.

Μερικές φορές είναι απαραίτητο μια εφαρμογή να μπορεί να επαληθεύσει ότι μια ενέργεια εκτελείται με πλήρη επίγνωση και συναίνεση του χρήστη, όπως η χορήγηση ενός αιτήματος άδειας, η πραγματοποίηση μιας αγοράς ή το κλικ σε μια διαφήμιση. Δυστυχώς, μια κακόβουλη εφαρμογή θα μπορούσε να προσπαθήσει να παραπλανήσει τον χρήστη ώστε να εκτελέσει αυτές τις ενέργειες ανυποψίαστα, κρύβοντας τον πραγματικό σκοπό του view. Ως αντιμέτρο, το framework προσφέρει έναν μηχανισμό φιλτραρίσματος αφής που μπορεί να χρησιμοποιηθεί για τη βελτίωση της ασφάλειας των views που παρέχουν πρόσβαση σε ευαίσθητες λειτουργίες.

Για να ενεργοποιήσετε το φιλτράρισμα αφής, καλέστε setFilterTouchesWhenObscured(boolean) ή ορίστε το layout attribute android:filterTouchesWhenObscured σε true. Όταν είναι ενεργοποιημένο, το framework θα απορρίπτει τα αγγίγματα που λαμβάνονται όποτε το window του view καλύπτεται από άλλο ορατό window. Ως αποτέλεσμα, το view δεν θα λαμβάνει αγγίγματα όποτε ένα toast, dialog ή άλλο window εμφανίζεται πάνω από το window του view.


Recent overlay-based malware techniques

  • Hook/Ermac variants use nearly transparent overlays (e.g., fake NFC prompts) to capture gestures and lock-screen PINs while forwarding touches underneath, delivered via Accessibility-ATS modules.

  • Anatsa/TeaBot droppers ship overlays for hundreds of banking/crypto apps and show full-screen “maintenance” overlays to stall victims while ATS completes transfers.

  • Hidden-VNC banking RATs briefly display phishing overlays to capture credentials, then rely on covert VNC plus Accessibility to replay taps with fewer on-device artifacts.

  • Hook/Ermac variants χρησιμοποιούν σχεδόν διαφανή overlays (π.χ. fake NFC prompts) για να καταγράφουν gestures και PIN κλειδώματος οθόνης ενώ προωθούν τα αγγίγματα από κάτω, παραδίδοντας αυτά μέσω Accessibility-ATS modules.

  • Anatsa/TeaBot droppers εγκαθιστούν overlays για εκατοντάδες banking/crypto apps και εμφανίζουν full-screen “maintenance” overlays για να καθυστερήσουν τα θύματα ενώ το ATS ολοκληρώνει τις μεταφορές.

  • Hidden-VNC banking RATs εμφανίζουν προσωρινά phishing overlays για να καταγράφουν credentials και στη συνέχεια βασίζονται σε covert VNC σε συνδυασμό με Accessibility για να αναπαράγουν taps με λιγότερα on-device artifacts.

Practical takeaway for red teams: mix an alpha < 0.8 overlay to bypass Android 12 blocking, then escalate to a full-screen accessibility overlay once the user toggles the service. Instrument GestureDescription or a headless VNC to keep control after credentials are captured.

Πρακτικό συμπέρασμα για red teams: συνδυάστε ένα alpha < 0.8 overlay για να παρακάμψετε το Android 12 blocking, και μετά escalat-άρετε σε full-screen accessibility overlay μόλις ο χρήστης ενεργοποιήσει την υπηρεσία. Χρησιμοποιήστε GestureDescription ή ένα headless VNC για να διατηρήσετε τον έλεγχο αφού τα credentials καταγραφούν.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Besides classic Tapjacking, modern Android banking malware families (e.g. ToxicPanda, BrasDex, Sova, etc.) abuse the Accessibility Service to place a full-screen WebView overlay above the legitimate application while still being able to forward the user input to the view underneath. This dramatically increases believability and allows attackers to steal credentials, OTPs or even automate fraudulent transactions.

Πέρα από το κλασικό Tapjacking, οι σύγχρονες οικογένειες Android banking malware (π.χ. ToxicPanda, BrasDex, Sova, κ.λπ.) καταχρώνται την Accessibility Service για να τοποθετήσουν ένα full-screen WebView overlay πάνω από την νόμιμη εφαρμογή, ενώ εξακολουθούν να μπορούν να προωθούν την είσοδο του χρήστη στο view από κάτω. Αυτό αυξάνει δραματικά την αξιοπιστία και επιτρέπει στους επιτιθέμενους να κλέψουν credentials, OTPs ή ακόμα και να αυτοματοποιήσουν απάτες συναλλαγών.

How it works

  1. The malicious APK requests the highly-sensitive BIND_ACCESSIBILITY_SERVICE permission, usually hiding the request behind a fake Google/Chrome/PDF-viewer dialog.
  2. Once the user enables the service, the malware programmatically simulates the taps required to grant additional dangerous permissions (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. A WebView is inflated and added to the window manager using the TYPE_ACCESSIBILITY_OVERLAY window type. The overlay can be rendered totally opaque or semi-transparent and can be flagged as “through” so that the original touches are still delivered to the background activity (thus the transaction really happens while the victim only sees the phishing form).

Πώς λειτουργεί

  1. Το κακόβουλο APK ζητά την πολύ ευαίσθητη άδεια BIND_ACCESSIBILITY_SERVICE, συνήθως κρύβοντας το αίτημα πίσω από ένα fake Google/Chrome/PDF-viewer dialog.
  2. Μόλις ο χρήστης ενεργοποιήσει την υπηρεσία, το malware προγραμματιστικά προσομοιώνει τα taps που απαιτούνται για να δοθούν επιπλέον επικίνδυνες άδειες (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Ένα WebView δημιουργείται και προστίθεται στον window manager χρησιμοποιώντας τον τύπο παραθύρου TYPE_ACCESSIBILITY_OVERLAY. Το overlay μπορεί να αποδοθεί εντελώς αδιαφανές ή ημιδιαφανές και μπορεί να επισημανθεί ως “through” έτσι ώστε τα αρχικά αγγίγματα να παραδίδονται ακόμα στο background activity (έτσι η συναλλαγή πράγματι γίνεται ενώ το θύμα βλέπει μόνο τη 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);

Τυπική ροή εργασίας που χρησιμοποιούν τα banking Trojans

  • Εκτέλεση ερωτήματος στα εγκατεστημένα πακέτα (QUERY_ALL_PACKAGES) για να εντοπιστεί ποια banking/wallet εφαρμογή είναι αυτή τη στιγμή ανοιχτή.
  • Κατέβασμα ενός HTML/JS overlay template από το C2 που μιμείται τέλεια αυτή την εφαρμογή (Logo, colours, i18n strings…).
  • Εμφάνιση του overlay και συλλογή credentials/PIN/pattern.
  • Χρήση της Accessibility API (performGlobalAction, GestureDescription) για αυτοματοποίηση μεταφορών στο παρασκήνιο.

Ανίχνευση & Αντιμετώπιση

  • Ελέγξτε τη λίστα των εγκατεστημένων εφαρμογών με adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Από την πλευρά της εφαρμογής (bank / wallet):
  • Ενεργοποιήστε android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) σε ευαίσθητες προβολές για να αποκλείσετε non-Play-Store services.
  • Συνδυάστε με setFilterTouchesWhenObscured(true) και FLAG_SECURE.

Για επιπλέον λεπτομέρειες σχετικά με την αξιοποίηση των Accessibility Services για πλήρη απομακρυσμένο έλεγχο συσκευής (π.χ. PlayPraetor, SpyNote, etc.) δείτε:

Accessibility Services Abuse

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks