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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
Tapjacking 是一种攻击,攻击者会启动一个恶意的应用程序并置于受害者应用之上。一旦它明显遮挡了受害应用,其用户界面就会被设计成诱导用户与之交互,同时将该交互传递给受害应用。
实际上,它会使用户无法察觉他们实际上是在对受害应用执行操作。
检测
- 在 Android manifest 中查找 exported activities(带有 intent-filter 的 activity 默认被导出)。如果一个 exported activity 受某个 permission 保护,攻击应用将需要相同的 permission,这会限制可利用性。
- 检查
AndroidManifest.xml中的 minimum SDK 版本android:minSdkVersion。如果它 低于 30,较旧的默认行为可能使 tapjacking 更容易被利用。 - 在运行时,使用
logcat在 Android 12+ 上查看被阻止的触摸:当 overlays 被过滤时,系统会记录Untrusted touch due to occlusion by <package>。
防护
Android 12+ 默认阻断与兼容标志
Android 12 (API 31) 引入了 “Block untrusted touches”:来自另一 UID、类型为 TYPE_APPLICATION_OVERLAY(不透明度 ≥0.8)的窗口的触摸会被丢弃。该功能默认启用。在测试期间你可以切换它:
# disable blocking for a specific package (for PoC crafting)
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.victim
# re‑enable
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.victim
受信任的窗口(辅助功能、IME、语音助手)仍然会接收事件。不可见或完全透明的覆盖层也能绕过该阻止机制,攻击者会通过保持 alpha < 0.8 来滥用这一点。
处理部分遮挡
如果部分覆盖层仍使目标区域可见,则不会被自动阻止。在敏感视图中,可通过使用 FLAG_WINDOW_IS_PARTIALLY_OBSCURED 标志拒绝这些事件来进行缓解:
@Override
public boolean onFilterTouchEventForSecurity(MotionEvent event) {
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
return false; // drop tap when anything partially obscures us
}
return super.onFilterTouchEventForSecurity(event);
}
filterTouchesWhenObscured
如果 android:filterTouchesWhenObscured 被设置为 true,当该 View 的窗口被另一个可见窗口遮挡时,该 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>
利用
Tapjacking-ExportedActivity
最近的一个用于执行 Tapjacking 攻击(并在被攻击应用的已导出 activity 之前调用)的 Android 应用可以在: https://github.com/carlospolop/Tapjacking-ExportedActivity 找到。
按 README 中的说明使用它。
FloatingWindowApp
一个实现了 FloatingWindowApp 的示例项目(可用于放置在其他 activities 之上以执行 clickjacking 攻击)可以在 FloatingWindowApp 找到(有点旧,构建 apk 可能有困难)。
Qark
Caution
看起来该项目现在不再维护,此功能也不再正常工作
你可以使用 qark 并传入 --exploit-apk –sdk-path /Users/username/Library/Android/sdk 参数来创建恶意应用,以测试潜在的 Tapjacking 漏洞。\
缓解措施相对简单,开发者可以选择在视图被其他视图覆盖时不接收触摸事件。参考 Android Developer’s Reference:
有时应用程序必须能够验证某个操作是在用户充分知情并同意的情况下执行的,例如授予权限请求、进行购买或点击广告。不幸的是,恶意应用可能通过隐瞒视图的真实用途来欺骗用户在不知情的情况下执行这些操作。作为补救,框架提供了触摸过滤机制,可用于提高对提供敏感功能的视图的安全性。
要启用触摸过滤,请调用
setFilterTouchesWhenObscured(boolean)或将布局属性 android:filterTouchesWhenObscured 设为 true。启用后,框架将在视图的窗口被另一个可见窗口遮挡时丢弃接收到的触摸事件。因此,每当 toast、对话框或其他窗口出现在视图窗口之上时,该视图将不接收触摸。
Recent overlay-based malware techniques
- Hook/Ermac variants 使用几乎透明的覆盖层(例如伪造的 NFC 提示)来捕获手势和锁屏 PIN,同时将触摸事件转发到底层,通过 Accessibility-ATS 模块交付。
- Anatsa/TeaBot droppers 为数百个银行/加密应用投放覆盖层,并显示全屏“maintenance”覆盖以拖延受害者,同时 ATS 完成转账。
- Hidden-VNC banking RATs 会短暂展示钓鱼覆盖层以窃取凭证,然后依赖隐蔽 VNC 加上 Accessibility 重放点击,从而在设备上留下较少的痕迹。
对红队的实用建议:混合使用 alpha < 0.8 的覆盖层以绕过 Android 12 的阻止,然后在用户切换该服务后升级为全屏的 accessibility 覆盖。使用 GestureDescription 或无头 VNC 在获取凭证后保持控制。
Accessibility Overlay Phishing (Banking-Trojan Variant)
除了经典的 Tapjacking 之外,现代 Android 银行恶意软件家族(例如 ToxicPanda、BrasDex、Sova 等)滥用 Accessibility Service 在合法应用之上放置全屏 WebView overlay,同时仍能将用户输入转发到下方视图。这大大提高了逼真度,使攻击者能够窃取凭证、OTP,甚至自动化执行欺诈性交易。
How it works
- 恶意 APK 请求高度敏感的
BIND_ACCESSIBILITY_SERVICE权限,通常将该请求隐藏在伪造的 Google/Chrome/PDF-viewer 对话框后面。 - 一旦用户启用该服务,恶意软件会以编程方式模拟所需的点击以授予额外的危险权限(
READ_SMS、SYSTEM_ALERT_WINDOW、REQUEST_INSTALL_PACKAGES等)。 - 一个 WebView 被膨胀并使用
TYPE_ACCESSIBILITY_OVERLAY窗口类型添加到 window manager。该 overlay 可渲染为完全不透明或半透明,并可被标记为 “through”,使得原始触摸仍然传递到后台 activity(因此交易实际上发生,而受害者只看到钓鱼表单)。
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 overlay template,完美模仿该特定应用(Logo、配色、i18n 字符串…)。
- 显示 overlay,窃取凭证/PIN/图案。
- 使用 Accessibility API(
performGlobalAction、GestureDescription)在后台自动执行转账。
检测与缓解
- 使用
adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE审计已安装应用列表。 - 从应用端(银行/钱包):
- 在敏感视图上启用
android:accessibilityDataSensitive="accessibilityDataPrivateYes"(Android 14+),以阻止非 Play 商店的服务。 - 同时结合使用
setFilterTouchesWhenObscured(true)和FLAG_SECURE。
For additional details on leveraging Accessibility Services for full remote device control (e.g. PlayPraetor, SpyNote, etc.) see:
References
- Android Developers – Tapjacking risk & mitigations (updated 2024)
- Zimperium – HOOK v3 overlay expansion (Aug 2025)
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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


