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

基本信息

Tapjacking 是一种攻击,其中 恶意 应用程序 被启动并 定位在受害者应用程序的顶部。一旦它明显遮挡了受害者应用程序,其用户界面被设计成欺骗用户与之互动,同时将互动传递给受害者应用程序。
实际上,它是 让用户无法知道他们实际上是在对受害者应用程序执行操作

检测

为了检测易受此攻击的应用程序,您应该在 Android 清单中搜索 导出活动(请注意,带有意图过滤器的活动默认情况下会自动导出)。一旦找到导出活动,检查它们是否需要任何权限。这是因为 恶意应用程序也需要该权限

您还可以检查应用程序的最低 SDK 版本,检查 android:minSdkVersionAndroidManifest.xml 文件中的值。如果该值 低于 30,则该应用程序易受 Tapjacking 攻击。

保护

Android 12 (API 31,32) 及更高版本

根据这个来源 从 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

请遵循 README 指示使用它

FloatingWindowApp

一个实现 FloatingWindowApp 的示例项目,可以用于放置在其他活动之上以执行点击劫持攻击,可以在 FloatingWindowApp 找到(有点旧,祝你构建 apk 顺利)。

Qark

caution

看起来这个项目现在不再维护,这个功能不再正常工作

你可以使用 qark--exploit-apk --sdk-path /Users/username/Library/Android/sdk 参数来创建一个恶意应用程序,以测试可能的 Tapjacking 漏洞。\

缓解措施相对简单,因为开发者可以选择在视图被另一个视图覆盖时不接收触摸事件。使用 Android 开发者参考:

有时,应用程序必须能够验证某个操作是在用户的完全知情和同意下执行的,例如授予权限请求、进行购买或点击广告。不幸的是,恶意应用程序可能会试图欺骗用户在不知情的情况下执行这些操作,通过掩盖视图的预期目的。作为补救措施,框架提供了一种触摸过滤机制,可以用来提高提供敏感功能访问的视图的安全性。

要启用触摸过滤,请调用 setFilterTouchesWhenObscured(boolean) 或将 android:filterTouchesWhenObscured 布局属性设置为 true。当启用时,框架将丢弃在视图的窗口被另一个可见窗口遮挡时接收到的触摸。因此,当吐司、对话框或其他窗口出现在视图的窗口上方时,视图将不会接收到触摸。


可访问性覆盖钓鱼(银行木马变种)

除了经典的 Tapjacking,现代 Android 银行恶意软件家族(例如 ToxicPanda、BrasDex、Sova 等)滥用 可访问性服务 在合法应用程序上方放置全屏 WebView 覆盖,同时仍然能够 转发用户输入 到下面的视图。这大大增加了可信度,并允许攻击者窃取凭据、一次性密码或甚至自动化欺诈交易。

工作原理

  1. 恶意 APK 请求高度敏感的 BIND_ACCESSIBILITY_SERVICE 权限,通常将请求隐藏在假冒的 Google/Chrome/PDF 查看器对话框后面。
  2. 一旦用户启用该服务,恶意软件程序会以编程方式模拟授予额外危险权限所需的点击(READ_SMSSYSTEM_ALERT_WINDOWREQUEST_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 和保持设备更新。

参考

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