Tapjacking

OWASP 类别: MASVS-PLATFORM:平台交互

概述

Tapjacking 是 Android 应用等同于 点击劫持 Web 漏洞:恶意应用通过覆盖 UI 或其他方式欺骗用户点击安全相关的控件(确认按钮等)。在此页面上,我们区分两种攻击变体:完全遮挡和部分遮挡。在完全遮挡中,攻击者覆盖触摸区域,而在部分遮挡中,触摸区域保持未被遮挡。

影响

Tapjacking 攻击用于欺骗用户执行某些操作。影响取决于攻击者目标的操作。

风险:完全遮挡

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

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 突发”来规避,攻击者在应用程序处于前台时排队多个 Toast,即使应用程序转到后台后,它们也会继续启动。

从 Android 12(API 级别 31)开始,后台 Toast 和 Toast 突发攻击得到完全缓解。


风险:Activity 夹层

如果恶意应用设法说服用户打开它,它仍然可以从受害者应用启动 Activity,然后用自己的 Activity 覆盖它,形成一个“Activity 夹层”并创建部分遮挡攻击。

缓解措施

请参阅部分遮挡的一般缓解措施。为了更深入地防御,请确保您不导出不需要导出的 Activity,以防止攻击者将其夹在中间。


资源