Tapjacking

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

Tapjacking to atak, w którym uruchamiana jest złośliwa aplikacja, która ustawia się nad aplikacją ofiary. Gdy widocznie zasłoni aplikację ofiary, jej interfejs użytkownika jest zaprojektowany tak, aby oszukać użytkownika i skłonić go do interakcji, podczas gdy przekazuje tę interakcję do aplikacji ofiary.
W efekcie oślepia użytkownika, uniemożliwiając mu świadomość, że tak naprawdę wykonuje działania w aplikacji ofiary.

Wykrywanie

  • Szukaj exported activities w manifeście Androida (an activity with an intent-filter is exported by default). Jeśli eksportowana aktywność jest chroniona uprawnieniem, aplikacja atakująca będzie potrzebować tego samego uprawnienia, co ogranicza możliwość exploitacji.
  • Sprawdź wersję minimum SDK android:minSdkVersion w AndroidManifest.xml. Jeśli jest niższa niż 30, starsze domyślne zachowania mogą ułatwiać exploitację tapjacking.
  • W czasie wykonywania użyj logcat, aby wykryć zablokowane dotknięcia na Android 12+: system loguje Untrusted touch due to occlusion by <package> gdy overlays są filtrowane.

Ochrona

Android 12+ default blocking & compat flags

Android 12 (API 31) wprowadził “Block untrusted touches”: dotknięcia pochodzące z okna innego UID typu TYPE_APPLICATION_OVERLAY (opacity ≥0.8) są odrzucane. Jest to włączone domyślnie. Podczas testów możesz to przełączać:

# 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

Zaufane okna (accessibility, IME, assistant) nadal otrzymują zdarzenia. Niewidoczne lub całkowicie przezroczyste nakładki także omijają blokadę — atakujący próbują to wykorzystać, utrzymując alpha < 0.8.

Obsługa częściowego zasłonięcia

Częściowe nakładki, które pozostawiają obszar docelowy widoczny, nie są automatycznie blokowane. W widokach wrażliwych ogranicz ryzyko, odrzucając zdarzenia z flagą 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

Jeśli android:filterTouchesWhenObscured jest ustawione na true, View nie będzie otrzymywać dotknięć, gdy okno widoku zostanie zasłonięte przez inne widoczne okno.

setFilterTouchesWhenObscured

Atrybut setFilterTouchesWhenObscured ustawiony na true może również zapobiec wykorzystaniu tej luki, jeśli wersja Androida jest starsza.
Jeśli ustawione na true, na przykład, przycisk może być automatycznie wyłączony, jeśli jest zasłonięty:

<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

Najnowsza aplikacja Android wykonująca atak Tapjacking (oraz wywołująca before an exported activity atakowanej aplikacji) znajduje się pod adresem: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Postępuj zgodnie z instrukcjami w README, aby jej użyć.

FloatingWindowApp

Przykładowy projekt implementujący FloatingWindowApp, który można umieścić nad innymi activity, aby przeprowadzić atak clickjacking, znajduje się w FloatingWindowApp (trochę stary, powodzenia przy budowaniu apk).

Qark

Caution

Wygląda na to, że ten projekt jest nieaktywnie utrzymywany i ta funkcjonalność może już nie działać poprawnie

Możesz użyć qark z parametrami --exploit-apk –sdk-path /Users/username/Library/Android/sdk, aby stworzyć złośliwą aplikację do testowania możliwych podatności na Tapjacking.\

Złagodzenie jest stosunkowo proste — deweloper może zdecydować, aby nie przyjmować zdarzeń dotyku, gdy widok jest zasłonięty przez inny. Korzystając z Android Developer’s Reference:

Czasami niezbędne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przy udzielaniu zgody na przyznanie uprawnienia, dokonaniu zakupu lub kliknięciu reklamy. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika do wykonania tych czynności nieświadomie, ukrywając zamierzony cel widoku. Jako środek zaradczy, framework oferuje mechanizm filtrowania dotyków, który może być użyty do zwiększenia bezpieczeństwa widoków zapewniających dostęp do wrażliwej funkcjonalności.

Aby włączyć filtrowanie dotyków, wywołaj setFilterTouchesWhenObscured(boolean) lub ustaw atrybut layoutu android:filterTouchesWhenObscured na true. Po włączeniu framework odrzuci dotknięcia otrzymywane zawsze, gdy okno widoku jest zasłonięte przez inne widoczne okno. W rezultacie widok nie będzie otrzymywał dotknięć za każdym razem, gdy toast, dialog lub inne okno pojawi się nad oknem widoku.


Recent overlay-based malware techniques

  • Hook/Ermac variants używają niemal przezroczystych nakładek (np. fałszywe monity NFC), aby przechwytywać gesty i PIN-y ekranu blokady, jednocześnie przekazując dotknięcia pod spodem, dostarczane przez moduły Accessibility-ATS.
  • Anatsa/TeaBot droppers dostarczają nakładki dla setek aplikacji banking/crypto i wyświetlają pełnoekranowe nakładki „maintenance”, aby opóźnić ofiary, podczas gdy ATS kończy przelewy.
  • Hidden-VNC banking RATs chwilowo wyświetlają phishingowe nakładki, aby przechwycić dane uwierzytelniające, a następnie polegają na ukrytym VNC plus Accessibility, aby odtworzyć tapnięcia przy mniejszej liczbie artefaktów na urządzeniu.

Praktyczny wniosek dla red teamów: połącz nakładkę z alpha < 0.8, aby obejść blokady Android 12, a następnie eskaluj do pełnoekranowej nakładki accessibility, gdy użytkownik włączy usługę. Zainstrumentuj GestureDescription lub headless VNC, aby utrzymać kontrolę po przechwyceniu poświadczeń.


Accessibility Overlay Phishing (Banking-Trojan Variant)

Poza klasycznym Tapjackingiem, nowoczesne rodziny malware bankowego na Androida (np. ToxicPanda, BrasDex, Sova, itd.) nadużywają Accessibility Service, aby umieścić pełnoekranowy WebView overlay nad legalną aplikacją, jednocześnie wciąż będąc w stanie przekazywać dane wejściowe użytkownika do widoku znajdującego się poniżej. To znacznie zwiększa wiarygodność i pozwala atakującym kraść poświadczenia, OTP lub nawet automatyzować oszukańcze transakcje.

How it works

  1. Złośliwy APK żąda wysoce wrażliwego uprawnienia BIND_ACCESSIBILITY_SERVICE, zwykle ukrywając żądanie za fałszywym dialogiem Google/Chrome/PDF-viewer.
  2. Gdy użytkownik włączy usługę, malware programowo symuluje tapnięcia wymagane do przyznania dodatkowych niebezpiecznych uprawnień (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. WebView jest inflatowany i dodawany do window managera używając typu okna TYPE_ACCESSIBILITY_OVERLAY. Nakładka może być renderowana całkowicie nieprzezroczysta lub półprzezroczysta i może być oznaczona jako “through”, dzięki czemu oryginalne dotknięcia są nadal dostarczane do aktywności w tle (w ten sposób transakcja naprawdę zachodzi, podczas gdy ofiara widzi jedynie formularz phishingowy).
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);

Typowy schemat działania używany przez banking Trojans

  • Pobierz listę zainstalowanych pakietów (QUERY_ALL_PACKAGES), aby ustalić, która aplikacja bankowa / wallet app jest aktualnie otwarta.
  • Pobierz HTML/JS overlay template z C2, który perfekcyjnie imituje daną aplikację (Logo, kolory, i18n strings…).
  • Wyświetl nakładkę, przechwyć credentials/PIN/pattern.
  • Wykorzystaj Accessibility API (performGlobalAction, GestureDescription) do automatyzacji przelewów w tle.

Wykrywanie i łagodzenie

  • Audytuj listę zainstalowanych aplikacji za pomocą adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Po stronie aplikacji (bank / wallet):
  • Włącz android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) na wrażliwych widokach, aby zablokować usługi spoza Play Store.
  • Połącz z setFilterTouchesWhenObscured(true) i FLAG_SECURE.

Aby uzyskać dodatkowe informacje o wykorzystaniu Accessibility Services do pełnej zdalnej kontroli urządzenia (np. PlayPraetor, SpyNote itp.) zobacz:

Accessibility Services Abuse

Referencje

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks