Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Attacks and Defence on Android Free Floating Windows

论文下载

free代表既可以自定义形态,也可以悬浮于自己或者其他app之上。

本文主要研究了FFW的行为特性,分析了对系统和其他APP的潜在安全威胁。FFW的攻击可以导致用户锁屏密码泄漏,劫持系统警告,获取用户输入,对系统的DOS攻击。并提出了缓解措施。

FFW可以用WindowManager.addView或者AlertDialog.show,但都需要设置WindowManager.LayoutParams.type这个参数来规定显示的Z轴,以及flag来定义该窗口处理事件的能力。其中第三方APP可以使用的最高的type是TYPE_SYSTEM_ERROR,需要申请SYSTEM_ALERT_WINDOW权限(市场上大概有25%的APP会申请)。flag用来设定FFW是否是聚焦的或者能否处理用户输入的事件。这两个属性不仅可以用来丰富FFW的行为,也使得攻击者可以施加不同种类的攻击。

Fig

Fig

提出了三种基于FFW的可行的攻击,都不需要root权限,分别是DoS攻击,GUI劫持,和旁路攻击。

  • 通过FFW的Dos攻击

    • Android系统对资源耗尽型攻击本身有所防御,例如限制了短时间内调用Toast的数量,但是对FFW没有限制。
    • 作者写了个短时间内单纯弹FFW的APP(1200个),从2.3到6.0,大多数情况下系统立马就被重启了。只有在5.0和5.1的版本上系统检测出了这种情况杀死了这个APP。这个APP用的FFW是TYPE_TOAST类型,不需要申请权限,其他类型也可以DOS。这个BUG报给了Google并得到确认。形成原因是增加FFW会建立一个InputManager到APP的socket,因此进程中会有文件描述符,短期内大量文件描述符让WindowManager没有捕获异常,导致ActivityManager崩溃引起system_server崩溃,重启。
  • GUI劫持

    • 用FFW的GUI劫持相比传统的界面劫持,更加隐蔽,因为没有切换界面的动画以及攻击APP不会出现在最近的任务列表中。
    • 巧妙的有针对性的GUI劫持需要满足诸多条件,例如如何设计FFW,什么时候弹出和退出等等。
    • 劫持锁屏界面,需要使用TYPE_SYSTEM_ERROR,在ACTION_SCREEN_ON的时候弹出,界面设计成透明的,要退出的时候,先弹出个错误提示,然后当用户第二次尝试的时候就退出。这种方法也可以用来攻击普通APP的解锁界面,例如支付宝。
    • 系统警告劫持:工信部要求所有的Android系统在APP请求高权限资源的第一次都弹窗提示(类似iPhone),作者在华为EMUI上做了攻击,劫持请求权限的系统警告。FFW需要TYPE_SYSTEM_ERROR,攻击覆盖了某些高权限的资源(联系人)改成低权限的资源(Device ID),就把这一块设计成一模一样修改成低权限的,其他都是透明。

Fig

APP每次使用权限行为时都弹出透明界面,当系统警告弹出时,这个界面会失去焦点,引发回调onWindowFocusChanged,在这个回调中可以弹出FFW。按下button后所有的FFW要统一消失,这个可以通过巧妙安排每个的属性和覆盖Z轴来达到效果。

  • FFW作为旁路:通过对用户输入的模式的旁路信息来猜测9位数字密码,例如微信支付密码。用机器学习的方法,先训练,在做实验,通过记录两次点击间的长度间隔,来作为Hidden马尔可夫模型。效果是可以提高猜测密码的概率。

防御

  • 增加一个overlappable的属性到WindowManager.LayoutParams里,让某些界面可以设定这个属性,来表示自己是否是可以被覆盖的,(例如输密码的界面就不能被覆盖)。
  • 针对不可覆盖的界面或者FFW,作者设定了一系列的优先级规则和约束,来让第三方FFW无法覆盖这些界面,作者在5.0上对WindowManager实现了这套机制,只有105行代码,并且能够完美兼容现有的APP。
  • 针对整体的Activity的劫持,作者设计了一种在导航栏底部显示包名和图标的方式来提示用户,配合上面的优先级框架设计,从两个维度防止了activity和FFW对GUI的劫持。同时由于FFW无法通过back和home来退出,作者建议Google设计新的方案来管理FFW,例如长按HOME来查看界面上的FFW等。