113 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Tapjacking
{{#include ../../banners/hacktricks-training.md}}
## **基本信息**
**Tapjacking** 是一种攻击,其中 **恶意** **应用程序** 被启动并 **定位在受害者应用程序的顶部**。一旦它明显遮挡了受害者应用程序,其用户界面被设计成能够欺骗用户与之互动,同时将互动传递给受害者应用程序。\
实际上,它是 **让用户无法知道他们实际上是在对受害者应用程序执行操作**
### 检测
为了检测易受此攻击的应用程序,您应该在 Android 清单中搜索 **导出活动**(请注意,带有 intent-filter 的活动默认情况下会自动导出)。一旦找到导出活动,**检查它们是否需要任何权限**。这是因为 **恶意应用程序也需要该权限**
您还可以检查应用程序的最低 SDK 版本,检查 **`android:minSdkVersion`** 在 **`AndroidManifest.xml`** 文件中的值。如果该值 **低于 30**,则该应用程序易受 Tapjacking 攻击。
### 保护
#### Android 12 (API 31,32) 及更高版本
[**根据这个来源**](https://www.geeksforgeeks.org/tapjacking-in-android/)**** 从 Android 12 (API 31 & 30) 及更高版本开始Android 会自动防止 tapjacking 攻击。因此,即使应用程序易受攻击,您 **也无法利用它**
#### `filterTouchesWhenObscured`
如果 **`android:filterTouchesWhenObscured`** 设置为 **`true`**,则当视图的窗口被另一个可见窗口遮挡时,`View` 将不会接收触摸事件。
#### **`setFilterTouchesWhenObscured`**
如果将属性 **`setFilterTouchesWhenObscured`** 设置为 true也可以防止在 Android 版本较低时利用此漏洞。\
例如,如果设置为 **`true`**,则按钮可以在被遮挡时自动 **禁用**
```xml
<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>
```
## 利用
### 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]
> 看起来这个项目现在不再维护,这个功能也不再正常工作
你可以使用 [**qark**](https://github.com/linkedin/qark) 和 `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` 参数来创建一个恶意应用程序,以测试可能的 **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。当启用时框架将丢弃在视图的窗口被另一个可见窗口遮挡时接收到的触摸。因此当吐司、对话框或其他窗口出现在视图的窗口上方时视图将不会接收到触摸。
---
## 可访问性覆盖钓鱼(银行木马变种)
除了经典的 Tapjacking现代 Android 银行恶意软件家族(例如 **ToxicPanda**、BrasDex、Sova 等)滥用 **可访问性服务** 在合法应用程序上方放置全屏 WebView **覆盖**,同时仍然能够 **转发用户输入** 到下面的视图。这大大增加了可信度,并允许攻击者窃取凭据、一次性密码或甚至自动化欺诈交易。
### 工作原理
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);
```
### 银行木马的典型工作流程
* 查询已安装的包 (`QUERY_ALL_PACKAGES`),以确定当前打开的是哪个银行/钱包应用。
* 从 C2 下载一个完美模仿该特定应用的 **HTML/JS 覆盖模板**(徽标、颜色、国际化字符串等)。
* 显示覆盖,收集凭据/PIN/图案。
* 使用 **无障碍 API** (`performGlobalAction`, `GestureDescription`) 在后台自动进行转账。
### 检测与缓解
* 使用 `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE` 审计已安装应用的列表。
* 从应用程序端(银行/钱包):
- 在敏感视图上启用 **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`**Android 14+),以阻止非 Play 商店服务。
- 结合使用 `setFilterTouchesWhenObscured(true)``FLAG_SECURE`
* 系统加固:
- 禁用 *来自未知来源的安装**不受信任应用的无障碍功能*
- 强制执行 PlayProtect 和保持设备更新。
有关利用无障碍服务进行完全远程设备控制的更多详细信息(例如 PlayPraetor、SpyNote 等),请参见:
{{#ref}}
accessibility-services-abuse.md
{{#endref}}
## 参考文献
* [Bitsight ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study)
{{#include ../../banners/hacktricks-training.md}}