Tapjacking
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
Tapjacking은 악의적인 애플리케이션이 실행되어 희생 애플리케이션 위에 위치하는 공격입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용을 희생 앱으로 전달합니다.
결과적으로, 이는 사용자가 실제로 희생 앱에서 작업을 수행하고 있다는 것을 알지 못하게 합니다.
탐지
이 공격에 취약한 앱을 탐지하기 위해서는 안드로이드 매니페스트에서 내보내기된 활동을 검색해야 합니다 (인텐트 필터가 있는 활동은 기본적으로 자동으로 내보내집니다). 내보내기된 활동을 찾으면, 권한이 필요한지 확인하십시오. 이는 악의적인 애플리케이션도 해당 권한이 필요하기 때문입니다.
앱의 최소 SDK 버전도 확인할 수 있으며, **android:minSdkVersion
**의 값을 AndroidManifest.xml
파일에서 확인하십시오. 값이 30보다 낮으면, 앱은 Tapjacking에 취약합니다.
보호
Android 12 (API 31,32) 이상
이 출처에 따르면, Tapjacking 공격은 Android 12 (API 31 & 30) 이상에서 자동으로 방지됩니다. 따라서 애플리케이션이 취약하더라도 악용할 수 없습니다.
filterTouchesWhenObscured
**android:filterTouchesWhenObscured
**가 **true
**로 설정되면, 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
가장 최근의 Android 애플리케이션으로 Tapjacking 공격을 수행하는 (+ 공격받는 애플리케이션의 내보낸 활동 전에 호출) 애플리케이션은 다음에서 찾을 수 있습니다: https://github.com/carlospolop/Tapjacking-ExportedActivity.
README 지침에 따라 사용하세요.
FloatingWindowApp
FloatingWindowApp을 구현한 예제 프로젝트는 다른 활동 위에 올려 클릭재킹 공격을 수행하는 데 사용할 수 있으며, FloatingWindowApp에서 찾을 수 있습니다 (조금 오래된 프로젝트로, apk 빌드에 행운을 빕니다).
Qark
caution
이 프로젝트는 현재 유지 관리되지 않는 것 같으며 이 기능이 더 이상 제대로 작동하지 않습니다.
--exploit-apk
--sdk-path /Users/username/Library/Android/sdk
매개변수를 사용하여 qark를 사용하여 가능한 Tapjacking 취약점을 테스트하기 위한 악성 애플리케이션을 생성할 수 있습니다.\
완화 방법은 상대적으로 간단합니다. 개발자는 다른 뷰에 의해 가려질 때 터치 이벤트를 수신하지 않도록 선택할 수 있습니다. Android 개발자 참조를 사용하여:
때때로 애플리케이션이 사용자의 완전한 지식과 동의 하에 작업이 수행되고 있음을 확인할 수 있는 것이 필수적입니다. 예를 들어 권한 요청을 승인하거나, 구매를 하거나, 광고를 클릭하는 경우입니다. 불행히도, 악성 애플리케이션은 사용자가 의도한 목적을 숨김으로써 이러한 작업을 수행하도록 속이려고 할 수 있습니다. 이를 해결하기 위해 프레임워크는 민감한 기능에 대한 접근을 개선하기 위해 사용할 수 있는 터치 필터링 메커니즘을 제공합니다.
터치 필터링을 활성화하려면
setFilterTouchesWhenObscured(boolean)
를 호출하거나 android:filterTouchesWhenObscured 레이아웃 속성을 true로 설정합니다. 활성화되면 프레임워크는 뷰의 창이 다른 보이는 창에 의해 가려질 때 수신된 터치를 무시합니다. 결과적으로, 뷰의 창 위에 토스트, 대화 상자 또는 다른 창이 나타날 때 뷰는 터치를 수신하지 않습니다.
Accessibility Overlay Phishing (Banking-Trojan Variant)
고전적인 Tapjacking 외에도 현대 Android 은행 악성코드 패밀리(예: ToxicPanda, BrasDex, Sova 등)는 Accessibility Service를 악용하여 합법적인 애플리케이션 위에 전체 화면 WebView 오버레이를 배치하면서도 여전히 사용자 입력을 아래의 뷰로 전달할 수 있습니다. 이는 신뢰성을 극적으로 증가시키고 공격자가 자격 증명, OTP 또는 심지어 사기 거래를 자동화하여 훔칠 수 있게 합니다.
작동 방식
- 악성 APK는 매우 민감한
BIND_ACCESSIBILITY_SERVICE
권한을 요청하며, 일반적으로 가짜 Google/Chrome/PDF 뷰어 대화 상자 뒤에 요청을 숨깁니다. - 사용자가 서비스를 활성화하면, 악성코드는 추가적인 위험한 권한(
READ_SMS
,SYSTEM_ALERT_WINDOW
,REQUEST_INSTALL_PACKAGES
, …)을 부여하기 위해 필요한 탭을 프로그래밍적으로 시뮬레이션합니다. - WebView가 생성되어
TYPE_ACCESSIBILITY_OVERLAY
창 유형을 사용하여 창 관리자에 추가됩니다. 오버레이는 완전히 불투명하거나 반투명으로 렌더링될 수 있으며, 원래의 터치가 여전히 백그라운드 활동에 전달되도록 *“통과”*로 플래그를 지정할 수 있습니다 (따라서 거래는 실제로 발생하지만 피해자는 피싱 양식만 봅니다).
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
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.