点击劫持

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

概述

点击劫持相当于 Android 应用版本的 点击劫持网络漏洞:恶意应用通过覆盖 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.setView() 来自定义 吐司 消息的外观。在 Android 10(API 级别 29)及更低版本上,恶意应用可以从后台启动此类吐司。

缓解措施

如果应用的目标是 Android 11(API 级别 30)或更高版本,则系统会阻止后台自定义吐司。但是,在某些情况下,可以使用“吐司爆发”绕过此缓解措施,攻击者在前景中排队多个吐司,即使应用转到后台,这些吐司也会继续启动。

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


风险:Activity 夹层

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

缓解措施

请参阅部分遮挡的一般缓解措施。为了纵深防御,请确保您不导出不需要导出的 Activity,以防止攻击者对它们进行夹层攻击。


资源