# Tapjacking {{#include ../../banners/hacktricks-training.md}} ## **Podstawowe informacje** **Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika do interakcji z nią, podczas gdy przekazuje interakcję do aplikacji ofiary.\ W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**. ### Wykrywanie Aby wykryć aplikacje podatne na ten atak, powinieneś szukać **eksportowanych aktywności** w manifeście androida (zauważ, że aktywność z intent-filter jest automatycznie eksportowana domyślnie). Gdy znajdziesz eksportowane aktywności, **sprawdź, czy wymagają jakichkolwiek uprawnień**. Dzieje się tak, ponieważ **złośliwa aplikacja również będzie potrzebować tych uprawnień**. Możesz również sprawdzić minimalną wersję SDK aplikacji, sprawdzając wartość **`android:minSdkVersion`** w pliku **`AndroidManifest.xml`**. Jeśli wartość jest **niższa niż 30**, aplikacja jest podatna na Tapjacking. ### Ochrona #### Android 12 (API 31,32) i wyższe [**Zgodnie z tym źródłem**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** ataki tapjacking są automatycznie zapobiegane przez Androida od wersji 12 (API 31 i 30) i wyższych. Tak więc, nawet jeśli aplikacja jest podatna, **nie będziesz w stanie jej wykorzystać**. #### `filterTouchesWhenObscured` Jeśli **`android:filterTouchesWhenObscured`** jest ustawione na **`true`**, `View` nie będzie odbierać dotyków, gdy okno widoku jest zasłonięte przez inne widoczne okno. #### **`setFilterTouchesWhenObscured`** Atrybut **`setFilterTouchesWhenObscured`** ustawiony na true może również zapobiec wykorzystaniu tej podatności, jeśli wersja Androida jest niższa.\ Jeśli ustawione na **`true`**, na przykład, przycisk może być automatycznie **wyłączony, jeśli jest zasłonięty**: ```xml ``` ## Eksploatacja ### Tapjacking-ExportedActivity Najbardziej **najnowsza aplikacja na Androida** wykonująca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością zaatakowanej aplikacji) można znaleźć w: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity). Postępuj zgodnie z **instrukcjami README, aby z niej skorzystać**. ### FloatingWindowApp Przykładowy projekt implementujący **FloatingWindowApp**, który można użyć do nałożenia na inne aktywności w celu przeprowadzenia ataku clickjacking, można znaleźć w [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp) (trochę stary, powodzenia w budowaniu apk). ### Qark > [!OSTRZEŻENIE] > Wygląda na to, że ten projekt nie jest już utrzymywany i ta funkcjonalność nie działa już poprawnie Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **vulnerabilities Tapjacking**.\ Mitigacja jest stosunkowo prosta, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla deweloperów Androida](https://developer.android.com/reference/android/view/View#security): > Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznając prośbę o uprawnienie, dokonując zakupu lub klikając w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach rozwiązania, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności. > > Aby włączyć filtrowanie dotyków, wywołaj [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) lub ustaw atrybut layout android:filterTouchesWhenObscured na true. Po włączeniu, framework odrzuci dotyki, które są odbierane, gdy okno widoku jest zasłonięte przez inne widoczne okno. W rezultacie widok nie otrzyma dotyków, gdy nad oknem widoku pojawi się toast, dialog lub inne okno. --- ## Phishing przez nakładkę dostępności (wariant Banking-Trojan) Oprócz klasycznego Tapjacking, nowoczesne rodziny złośliwego oprogramowania bankowego na Androida (np. **ToxicPanda**, BrasDex, Sova itp.) nadużywają **Usługi dostępności**, aby umieścić pełnoekranowy WebView **nakładkę** nad legalną aplikacją, jednocześnie będąc w stanie **przekazywać dane wejściowe użytkownika** do widoku poniżej. Zwiększa to dramatycznie wiarygodność i pozwala atakującym na kradzież danych uwierzytelniających, OTP lub nawet automatyzację oszukańczych transakcji. ### Jak to działa 1. Złośliwy APK żąda wysoce wrażliwego uprawnienia `BIND_ACCESSIBILITY_SERVICE`, zazwyczaj ukrywając prośbę za fałszywym dialogiem Google/Chrome/PDF-viewer. 2. Gdy użytkownik włączy usługę, złośliwe oprogramowanie programowo symuluje dotknięcia wymagane do przyznania dodatkowych niebezpiecznych uprawnień (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …). 3. **WebView** jest inflatowane i dodawane do menedżera okien przy użyciu typu okna **`TYPE_ACCESSIBILITY_OVERLAY`**. Nakładka może być renderowana całkowicie nieprzezroczysta lub półprzezroczysta i może być oznaczona jako *„przez”*, aby oryginalne dotknięcia były nadal dostarczane do aktywności w tle (w ten sposób transakcja naprawdę się odbywa, podczas gdy ofiara widzi tylko formularz phishingowy). ```java 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 workflow używany przez trojany bankowe * Zapytaj o zainstalowane pakiety (`QUERY_ALL_PACKAGES`), aby dowiedzieć się, która aplikacja bankowa / portfelowa jest aktualnie otwarta. * Pobierz **szablon nakładki HTML/JS** z C2, który doskonale imituje tę konkretną aplikację (logo, kolory, ciągi i18n…). * Wyświetl nakładkę, zbierz dane logowania/PIN/wzór. * Użyj **API dostępności** (`performGlobalAction`, `GestureDescription`), aby zautomatyzować transfery w tle. ### Wykrywanie i łagodzenie * Audytuj listę zainstalowanych aplikacji za pomocą `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`. * Z perspektywy aplikacji (bank / portfel): - Włącz **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) na wrażliwych widokach, aby zablokować usługi spoza Sklepu Play. - Połącz z `setFilterTouchesWhenObscured(true)` i `FLAG_SECURE`. * Utwardzanie systemu: - Wyłącz *Instalowanie z nieznanych źródeł* i *Dostępność dla nieznanych aplikacji*. - Wymuś PlayProtect i aktualne urządzenia. Aby uzyskać dodatkowe szczegóły dotyczące wykorzystania usług dostępności do pełnej zdalnej kontroli urządzenia (np. PlayPraetor, SpyNote itp.), zobacz: {{#ref}} accessibility-services-abuse.md {{#endref}} ## Odniesienia * [Bitsight – ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study) {{#include ../../banners/hacktricks-training.md}}