所按非所得——聊一聊 StandHogg 漏洞
文/OPPO子午互联网安全实验室【heeeeen】
关于StandHogg漏洞
最近,一家挪威安全公司Promon爆料了一种Android点击劫持型漏洞,并取了一个有趣的名字StandHogg,声称这个漏洞影响所有Android系统版本,500个流行App已在风险之中,36个利用该漏洞的恶意App已被发现,且漏洞利用无需获取手机Root权限。
StandHogg,一种维京海盗所使用的偷袭战术,此词后来也在北欧文化中描述商业活动中的恶意接管。
怎么回事
根据Promon的描述,这个漏洞要求受害者的手机安装恶意App。在受害者在点击正常App的时候,却弹出恶意App的界面,这个界面可能要求用户授予权限,或者展现与正常App界面一样的输入框,要求用户输入用户名和密码,然后再回到正常App。这样,不知不觉中,恶意App就悄悄地被授予权限,或者窃取了用户的敏感信息。
Promon介绍的漏洞利用流程
从描述上看,这个漏洞属于UI欺骗,要了解漏洞原理,我们需要先了解Android Activity的任务栈和启动模式。
Activity任务栈与启动模式
任务栈(TaskRecord)是一种放置Activity的“后进先出”栈结构,我们每启动一个Activity,就会放在一个任务栈的顶端。例如,以一台配备Android 9.0的Pixel3手机为例,我们打开手机中的“设置”,打开“网络和互联网”,点击“WLAN”。然后,我们可以查看手机中的任务栈
此时,显示在最前面的SubSettings,位于栈顶。往栈底方向依次为Settings$NetworkDashboardActivity和Settings。
如果点击后退,回到“网络和互联网”,则任务栈显示如下。之前最后入栈的SubSetings就已经出栈了。
这样,每按一下后退,就会有一个Activity出栈,直到栈空为止,当栈中没有任何Activity时,系统就会回收这个任务栈。
作为系统的默认行为,每次启动一个Activity,都会创建这个Activity的实例,这样就会重复创建。因此,Android提供了启动模式(launchMode)来改变系统的默认行为,主要包括以下四种:
standard: 标准模式,也是系统默认模式。每启动一个Activity都会重新创建这个Activity的实例,不管其是否已经存在。这个Activity的生命周期中的onCreate、onStart、onResume都会被调用;
singleTop: 栈顶复用模式。如果Activity已经位于任务栈的栈顶,再启动时就不会重新创建,但它的onNewIntent方法被回调。注意,如果Activity已存在,但不是位于栈顶,在启动时仍然会重新创建一个实例。
singleTask: 栈内复用模式。只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建这个Activity的新的实例,此时,onNewIntent方法也会被回调。具体而言,当一个具有singleTask模式的Activity被启动,如果没有此Activity的任务栈,系统就会重新创建一个任务栈,然后创建这个Activity的实例放到其中。如果已存在这个Activity的任务栈,则把它调到任务栈的栈顶。
singleInstance:单实例模式。这是一种加强的singleTask模式,除了具有singleTask的所有特性外,还必须单独地位于一个任务栈中,具有独占任务栈的特性。
关于TaskAffinity 和TastReparenting
上面谈到了任务栈,那么不同的任务栈如何区分?答案就是通过TaskAffinity(任务相关性)这个参数,这个参数标识了一个Activity进入的任务栈的名字。在不指定这个参数的默认情况下,Activity进入任务栈的名字就是应用的包名。例如,打开Gmail应用,其Activity的TaskAffinity就为com.google.android.gm
开发者也可以为Activity单独指定TaskAffinity,此时需要与singleTask或者allowTaskReparenting结合使用,这里我们只讨论后一种情况。allowTaskReparenting属性的作用是Activity的迁移,从一个任务栈迁移到另一个任务栈。回到文章的主题,StandHogg漏洞主要就是利用了TaskAffinity和allowTaskReparenting结合使用的特性。
POC
让我们来做个实验,编写一个恶意App,设置其allowTaskReparenting=true,同时把其taskAffinity设为Gmail的包名,也就是说把Gmail作为StandHogg劫持的对象。
然后我们打开这个Activity:
接着点击Home按键,回到桌面,此时我们查看一下任务栈,发现其TaskAffinity属性已经设置成功。
此时,我们打开Gmail,却发现打开的仍然是前面显示”Hacked”的那个我们所编写恶意应用的Main2Activity。再次查看任务栈,会发现恶意的Main2Activity位于Gmail Activity的上面。
因此,这样就劫持成功了。这个Main2Activity可以做得跟真的目标应用一样,可以伪造假的登录框、弹出权限授权框……,各种利用方式可以自由发挥,然后再用户操作后回到目标应用,这样,悄无声息地窃取用户信息。Promon也声称,已经掌握了恶意App利用此漏洞的证据。
POC代码见https://github.com/Ivan-Markovic/Android-Task-Injection
评价
Standhogg漏洞利用了Android Activity启动模式的一个细微特性,对于普通用户而言,还是有较大的欺骗性和危害。截止目前,也没有任何补丁可打。好在恶意App的特征比较明显,极易被识别,Google Play已经采取了行动,下架了采用这种攻击技术的恶意App。作为用户而言,除了睁大眼睛仔细辨别以外,还可以在启动敏感应用前,清除一次后台应用进行防御。
这种Activity的UI欺骗也早就在学术界提出,还有其他利用方法,详见参考。不过此次Promon取名StandHogg,通过各大科技媒体将其影响广而告之,并找到了恶意应用利用此漏洞的确凿证据,对Android安全生态的提升具有正面意义。
参考:
[Towards Discovering and Understanding Task Hijacking in Android](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-ren-chuangang.pdf)
[Android Task Hijacking](https://www.slideshare.net/phdays/android-task-hijacking)
[The StrandHogg vulnerability](https://promon.co/security-news/strandhogg/)
[一种新的基于APP启动模式的劫持攻击方案](http://www.cnki.com.cn/Article/CJFDTotal-WHDY201802007.htm)
任玉刚,《Android开发艺术探索》
https://arstechnica.com/information-technology/2019/12/vulnerability-in-fully-patched-android-phones-under-active-attack-by-bank-thieves/
版权声明: 本文为 InfoQ 作者【OPPO安全】的原创文章。
原文链接:【http://xie.infoq.cn/article/6dee91dc358b077195c6c3708】。未经作者许可,禁止转载。
评论