触屏劫持

OWASP 类别: MASVS-PLATFORM: Platform Interaction

概览

触屏劫持(Tapjacking)是 Android 应用中与 点击劫持(clickjacking)网页漏洞 等效的一种攻击:恶意应用通过使用覆盖层或其他方式模糊 UI,欺骗用户点击安全相关的控件(例如确认按钮)。在本页面中,我们将区分两种攻击变体:完全遮挡和部分遮挡。在完全遮挡中,攻击者覆盖触摸区域;而在部分遮挡中,触摸区域保持清晰。

影响

触屏劫持攻击用于诱骗用户执行某些操作。影响取决于攻击者针对的操作。

风险:完全遮挡

在完全遮挡中,攻击者覆盖触摸区域以劫持触摸事件

Full occlusion image

缓解措施

通过在代码中设置 View.setFilterTouchesWhenObscured(true) 来防止完全遮挡。这会阻止由覆盖层传递的触摸事件。如果你倾向于声明式方法,也可以在要保护的 View 对象的布局文件中添加 android:filterTouchesWhenObscured="true"


风险:部分遮挡

在部分遮挡攻击中,触摸区域保持清晰

Partial occlusion image

缓解措施

通过手动忽略带有 FLAG_WINDOW_IS_PARTIALLY_OBSCURED 标记的触摸事件来缓解部分遮挡。针对此场景没有默认保护措施。

潜在注意事项: 此缓解措施可能会干扰正常应用。在某些情况下,无法推出此修复措施,因为当部分遮挡是由正常应用引起时,它会对用户体验产生负面影响。


特定风险

本节收集了需要非标准缓解策略或在特定 SDK 级别得到缓解的风险,此处列出是为了完整性。

风险:android.Manifest.permission.SYSTEM_ALERT_WINDOW

通过 SYSTEM_ALERT_WINDOW 权限,应用可以创建显示在所有应用顶部的窗口。

缓解措施

较新版本的 Android 已引入了几种缓解措施,包括以下几种

  • 在 Android 6(API 级别 23)及更高版本上,用户必须明确授予权限才能让应用创建覆盖窗口。
  • 在 Android 12(API 级别 31)及更高版本上,应用可以将 true 传递给 Window.setHideOverlayWindows()

风险:自定义 toast

攻击者可以使用 Toast.setView() 来自定义 toast 消息的外观。在 Android 10(API 级别 29)及更低版本上,恶意应用可以在后台启动此类 toast。

缓解措施

如果应用的目标平台是 Android 11(API 级别 30)或更高版本,系统会阻止后台自定义 toast。但是,在某些情况下,可以使用 Toast burst(吐司连发)来规避此缓解措施,攻击者在应用处于前台时将多个 toast 排入队列,即使应用进入后台后,这些 toast 也会继续弹出。

自 Android 12(API 级别 31)起,后台 toast 和 toast burst 攻击已完全得到缓解。


风险:Activity sandwich

如果恶意应用设法诱骗用户打开它,它仍然可以从受害应用启动一个 activity,然后用自己的 activity 覆盖它,形成一个activity sandwich(activity 三明治),并造成部分遮挡攻击。

缓解措施

请参阅部分遮挡的通用缓解措施。为了进行纵深防御,请确保不要导出不需要导出的 activity,以防止攻击者将其 sandwich(三明治化)。


资源