# Tapjacking {{#include ../../banners/hacktricks-training.md}} ## **기본 정보** **Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는** 공격입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\ 결과적으로, 이는 **사용자가 실제로 희생 앱에서 작업을 수행하고 있다는 것을 알지 못하게 만듭니다**. ### 탐지 이 공격에 취약한 앱을 탐지하기 위해서는 안드로이드 매니페스트에서 **내보낸 활동**을 검색해야 합니다 (인텐트 필터가 있는 활동은 기본적으로 자동으로 내보내집니다). 내보낸 활동을 찾으면, **해당 활동이 어떤 권한을 요구하는지 확인하십시오**. 이는 **악의적인 애플리케이션도 해당 권한이 필요하기 때문입니다**. 앱의 최소 SDK 버전도 확인할 수 있으며, **`android:minSdkVersion`**의 값을 **`AndroidManifest.xml`** 파일에서 확인하십시오. 값이 **30 미만**이면, 앱은 Tapjacking에 취약합니다. ### 보호 #### Android 12 (API 31,32) 이상 [**이 출처에 따르면**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** Tapjacking 공격은 Android 12 (API 31 & 30) 이상에서 자동으로 방지됩니다. 따라서 애플리케이션이 취약하더라도 **악용할 수 없습니다**. #### `filterTouchesWhenObscured` **`android:filterTouchesWhenObscured`**가 **`true`**로 설정되면, `View`는 다른 가시적인 창에 의해 뷰의 창이 가려질 때 터치를 받지 않습니다. #### **`setFilterTouchesWhenObscured`** **`setFilterTouchesWhenObscured`** 속성이 true로 설정되면, Android 버전이 낮더라도 이 취약점의 악용을 방지할 수 있습니다.\ 예를 들어, **`true`**로 설정하면 버튼이 **가려질 경우 자동으로 비활성화**될 수 있습니다: ```xml ``` ## Exploitation ### Tapjacking-ExportedActivity 가장 **최근의 Android 애플리케이션**이 Tapjacking 공격을 수행하는 것을 찾을 수 있습니다 (+ 공격받는 애플리케이션의 내보낸 활동 전에 호출). [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity). **README 지침에 따라 사용하세요**. ### FloatingWindowApp **FloatingWindowApp**을 구현한 예제 프로젝트는 클릭재킹 공격을 수행하기 위해 다른 활동 위에 올릴 수 있는 프로젝트로, [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)에서 찾을 수 있습니다 (조금 오래된 프로젝트로, apk 빌드에 행운을 빕니다). ### Qark > [!CAUTION] > 이 프로젝트는 현재 유지 관리되지 않는 것 같으며 이 기능이 더 이상 제대로 작동하지 않습니다. `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` 매개변수를 사용하여 [**qark**](https://github.com/linkedin/qark)를 사용하여 가능한 **Tapjacking** 취약점을 테스트하기 위한 악성 애플리케이션을 생성할 수 있습니다.\ 완화 방법은 상대적으로 간단합니다. 개발자는 다른 뷰에 의해 가려질 때 터치 이벤트를 수신하지 않도록 선택할 수 있습니다. [Android 개발자 참조](https://developer.android.com/reference/android/view/View#security)를 사용하여: > 때때로 애플리케이션이 사용자의 완전한 지식과 동의 하에 작업이 수행되고 있음을 확인할 수 있는 것이 필수적입니다. 예를 들어 권한 요청을 승인하거나, 구매를 하거나, 광고를 클릭하는 경우입니다. 불행히도, 악성 애플리케이션은 사용자가 의도된 목적을 모르게 이러한 작업을 수행하도록 속이려고 할 수 있습니다. 이를 해결하기 위해 프레임워크는 민감한 기능에 대한 접근을 개선하기 위해 사용할 수 있는 터치 필터링 메커니즘을 제공합니다. > > 터치 필터링을 활성화하려면 [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)를 호출하거나 android:filterTouchesWhenObscured 레이아웃 속성을 true로 설정합니다. 활성화되면 프레임워크는 뷰의 창이 다른 보이는 창에 의해 가려질 때 수신된 터치를 무시합니다. 결과적으로, 뷰의 창 위에 토스트, 대화 상자 또는 다른 창이 나타날 때 뷰는 터치를 수신하지 않습니다. --- ## Accessibility Overlay Phishing (Banking-Trojan Variant) 고전적인 Tapjacking 외에도 현대 Android 은행 악성코드 패밀리(예: **ToxicPanda**, BrasDex, Sova 등)는 **Accessibility Service**를 악용하여 합법적인 애플리케이션 위에 전체 화면 WebView **오버레이**를 배치하면서도 여전히 **사용자 입력을** 아래의 뷰로 전달할 수 있습니다. 이는 신뢰성을 극적으로 증가시키고 공격자가 자격 증명, OTP 또는 심지어 사기 거래를 자동화할 수 있게 합니다. ### 작동 방식 1. 악성 APK는 매우 민감한 `BIND_ACCESSIBILITY_SERVICE` 권한을 요청하며, 일반적으로 가짜 Google/Chrome/PDF 뷰어 대화 상자 뒤에 요청을 숨깁니다. 2. 사용자가 서비스를 활성화하면, 악성코드는 추가적인 위험한 권한(`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …)을 부여하기 위해 필요한 탭을 프로그래밍적으로 시뮬레이션합니다. 3. **WebView**가 인플레이트되고 **`TYPE_ACCESSIBILITY_OVERLAY`** 창 유형을 사용하여 창 관리자에 추가됩니다. 오버레이는 완전히 불투명하거나 반투명으로 렌더링될 수 있으며, 원래의 터치가 여전히 백그라운드 활동에 전달되도록 *“통과”*로 플래그를 지정할 수 있습니다 (따라서 거래는 실제로 발생하지만 피해자는 피싱 양식만 봅니다). ```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); ``` ### Typical workflow used by banking Trojans * 설치된 패키지를 쿼리하여 (`QUERY_ALL_PACKAGES`) 현재 열려 있는 은행/지갑 앱을 파악합니다. * 특정 애플리케이션(로고, 색상, i18n 문자열 등)을 완벽하게 모방하는 **HTML/JS 오버레이 템플릿**을 C2에서 다운로드합니다. * 오버레이를 표시하고 자격 증명/PIN/패턴을 수집합니다. * **Accessibility API** (`performGlobalAction`, `GestureDescription`)를 사용하여 백그라운드에서 전송을 자동화합니다. ### Detection & Mitigation * `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`로 설치된 앱 목록을 감사합니다. * 애플리케이션 측(은행/지갑): - 민감한 뷰에서 **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+)를 활성화하여 비 Play 스토어 서비스의 접근을 차단합니다. - `setFilterTouchesWhenObscured(true)` 및 `FLAG_SECURE`와 결합합니다. * 시스템 강화: - *알 수 없는 출처에서 설치* 및 *신뢰할 수 없는 앱에 대한 접근성*을 비활성화합니다. - PlayProtect 및 최신 장치를 강제 적용합니다. Accessibility Services를 활용하여 전체 원격 장치 제어를 위한 추가 세부정보(예: PlayPraetor, SpyNote 등)는 다음을 참조하십시오: {{#ref}} accessibility-services-abuse.md {{#endref}} ## References * [Bitsight – ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study) {{#include ../../banners/hacktricks-training.md}}