Translated ['src/mobile-pentesting/android-app-pentesting/tapjacking.md'

This commit is contained in:
Translator 2025-07-30 08:28:17 +00:00
parent b5b08a2026
commit ac6b8e772c

View File

@ -4,18 +4,18 @@
## **기본 정보**
**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는 공격**입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\
결과적으로, 이는 **사용자가 실제로 희생 앱에서 작업을 수행하고 있다는 사실을 알지 못하게 만듭니다**.
**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는** 공격입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\
결과적으로, 이는 **사용자가 실제로 희생 앱에서 작업을 수행하고 있다는 을 알지 못하게 만듭니다**.
### 탐지
이 공격에 취약한 앱을 탐지하기 위해서는 안드로이드 매니페스트에서 **내보낸 활동**을 검색해야 합니다(인텐트 필터가 있는 활동은 기본적으로 자동으로 내보내집니다). 내보낸 활동을 찾은 후, **해당 활동이 어떤 권한을 요구하는지 확인하십시오**. 이는 **악의적인 애플리케이션도 해당 권한이 필요하기 때문입니다**.
이 공격에 취약한 앱을 탐지하기 위해서는 안드로이드 매니페스트에서 **내보낸 활동**을 검색해야 합니다 (intent-filter가 있는 활동은 기본적으로 자동으로 내보내집니다). 내보낸 활동을 찾으면, **해당 활동이 어떤 권한을 요구하는지 확인하십시오**. 이는 **악의적인 애플리케이션도 해당 권한이 필요하기 때문입니다**.
앱의 최소 SDK 버전도 확인할 수 있으며, **`android:minSdkVersion`**의 값을 **`AndroidManifest.xml`** 파일에서 확인하십시오. 값이 **30 미만**이면, 앱은 Tapjacking에 취약합니다.
### 보호
#### Android 12 (API 31,32) 및 그 이상
#### Android 12 (API 31,32) 이상
[**이 출처에 따르면**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** Tapjacking 공격은 Android 12 (API 31 & 30) 이상에서 자동으로 방지됩니다. 따라서 애플리케이션이 취약하더라도 **악용할 수 없습니다**.
@ -25,7 +25,7 @@
#### **`setFilterTouchesWhenObscured`**
**`setFilterTouchesWhenObscured`** 속성이 true로 설정되면, Android 버전이 낮더라도 이 취약점의 악용을 방지할 수 있습니다.\
**`setFilterTouchesWhenObscured`** 속성이 true로 설정되면 Android 버전이 낮더라도 이 취약점의 악용을 방지할 수 있습니다.\
예를 들어, **`true`**로 설정하면 버튼이 가려질 경우 자동으로 **비활성화될 수 있습니다**:
```xml
<Button android:text="Button"
@ -39,26 +39,68 @@ android:filterTouchesWhenObscured="true">
### Tapjacking-ExportedActivity
가장 **최근의 Android 애플리케이션**으로 Tapjacking 공격을 수행하는 (+ 공격받는 애플리케이션의 내보낸 활동 전에 호출) 애플리케이션은 다음에서 찾을 수 있습니다: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
가장 **최근의 Android 애플리케이션**으로 Tapjacking 공격을 수행하는 (+ 공격받는 애플리케이션의 내보낸 활동 전에 호출) 애플리케이션은 다음에서 찾을 수 있습니다: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
**사용을 위한 README 지침을 따르세요**.
**README 지침에 따라 사용하세요**.
### FloatingWindowApp
클릭재킹 공격을 수행하기 위해 다른 활동 위에 올릴 수 있는 **FloatingWindowApp**을 구현한 예제 프로젝트는 [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)에서 찾을 수 있습니다 (조금 오래된 프로젝트로, apk 빌드에 행운을 빕니다).
**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 및 최신 장치를 강제 적용합니다.
## References
* [Bitsight ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study)
{{#include ../../banners/hacktricks-training.md}}