June 1, 2020

Strandhogg 2.0漏洞预警

近期,在Google的5月份安全公告中,一个等级为严重的漏洞被批露,该漏洞覆盖了除Android10以外,几乎所有版本的设备,通过该漏洞,恶意软件可以在完全隐藏自身的情况下劫持其他应用,并通过钓鱼或诱导的方式合法获取权限,由于其极难察觉,一旦用户中招,个人数据与敏感信息,如照片、短信、通话记录、账号和密码、GPS定位等信息将被盗取。

该漏洞利用了多任务功能的漏洞,当用户安装了伪装成普通应用的APP之后,恶意应用可以冒充为设备上任意一款应用的Activity,这体现在,当用户点击被劫持的APP图标之后,显示的是恶意应用叠加在正常APP界面上的钓鱼Activity,通过这个界面来诱导用户给予应用权限,输入账号密码来实现恶意的功能,由于用户点击的是所信任的应用,因此不会有那么重的戒备心,极易上当受骗。

所幸的是,该漏洞尚无被广泛利用的迹象,发现该漏洞的Promon研究人员已通报该漏洞,并获得CVE-2020-0096编号,该漏洞已于2020.4.1的安全补丁中修复(涵盖Android 8.0 / 8.1 / 9.0)。

Strandhogg 1.0早在几年前便被发现有恶意应用利用该项技术,恶意应用通常伪装成银行APP用来窃取受害者财产,但与危险性更大的Strandhogg 2.0相比,恶意应用通常要在manifest清单文件中静态声明allowTaskReparenting=”true”,或通过Intent.FLAG_ACTIVITY_NEW_TASK的方式便完成劫持的过程。

恶意应用通常使用的声明方式

在设定了taskAffinity的情况下,特定的APP在启动时,由于代码中的缺陷,intentActivity不再为null,当前任务栈的顶部Activity为恶意应用的,并未考虑后台同名非同进程的任务存在的情况。

在android最新的补丁中,此缺陷得到了修复,链接:https://android.googlesource.com/platform/frameworks/base/+/a952197bd161ac0e03abc6acb5f48e4ec2a56e9d%5E%21/

通过代码可见:

if (started != null && started.getUid() == filterCallingUid)

调用进程的uid做了过滤,避免了启动恶意应用的劫持Activity。

但Strandhogg 2.0更为强大,在不需要显式声明的情况下便可利用,因此带来更大的检测难题。

目前,较旧的设备并没有较好的办法防范此漏洞,因此建议所有用户尽可能的使用新系统,并保持更新安全补丁,尽量不要下载安装来路不明的APP。