StrandHogg漏洞分析笔记-copy

*郑重声明:本文展示的过程是在模拟环境中进行的,只为学习研究之用,如有人用于非法用途,产生的后果笔者不负任何责任。

又是一个神不知鬼不觉盗取用户隐私信息的漏洞,用户实惨。。。

StrangHogg漏洞是一个存在于Android多任务系统中的应用漏洞。攻击者通过设置AndroidManifest.xml文件中组件的android:taskAffinity属性即可利用此漏洞进行钓鱼等攻击。 当用户点击受害应用时,可直接弹出恶意应用界面, 伪装成另一个应用欺骗用户的重要账号密码,申请读取短信、联系人等权限,从而获取隐私信息。并且,此漏洞更加隐蔽的地方在于,即使用户查看后台应用也不会发现此时有两个看起来一样的应用在运行,危害极大!

了解StrandHogg漏洞的原理,关键在 android:taskAffinity属性 。那么,首先就需要了解下Activity栈(Task,也可以叫做任务)。

Activity栈是一种管理Activity界面的结构,遵循“后进先出”规则。位于栈顶的Activity获取屏幕的焦点,当按下“back”按钮时,栈顶Activity弹出,前一个Activity重新获取焦点。

一般情况下,同一个应用程序中启动的Activity位于一个栈中,多个应用程序同时运行时,查看后台应用,可以看到多个任务栈。官方提供了 android:taskAffinity 这一属性,使得不同应用的Activity也可以进入同一个栈(Task)中。官方翻译为“ 从概念上讲,具有同一相似性的 Activity 归属同一Task(从用户的角度来看,则是归属同一“应用”) ”。每个Activity都有taskAffinity属性,指明它启动时进入的Task。若没有显式指定,就遵循其所在的Application标签中的该属性。若Application标签中也没指定,taskAffinity属性值就是包名。

如果想要单独给某个Activity设定一个任务栈,就需要设置TaskAffinity属性。除此之外,还需将Activity的启动模式即android:lunchMode属性设置为singleTop,或是启动Activity时设置FLAG_ACTIVITY_NEW_TASK

StrandHogg漏洞涉及到的另一个属性是android:allowTaskReparenting。官方解释为: 当下一次将启动 Activity 的任务转至前台时,Activity 是否能从该任务转移至与其有相似性的任务 —“true”表示可以转移,“false”表示仍须留在启动它的任务处。 读起来相当拗口。在这里,当恶意应用设置了android:taskAffinity属性值为受害应用的taskAffinity值(大多为包名),然后将 android:allowTaskReparenting属性设置为true,那么,先点击恶意应用,再启动受害应用时,跳出来的就是恶意应用的界面。事实上,受害应用的Activity也启动了,只不过恶意应用瞬间就重新寄宿到受害应用的Task中,导致受害应用的界面被覆盖掉。

案例:下面视频以某宝为例演示钓鱼实验过程

步骤为:点击恶意应用(某宝1)-> 点击返回键 -> 点击受害应用(某宝)。可以看到登录页面被无缝覆盖。仔细观察也能发现钓鱼页面与原页面不同,不过要是一门心思使坏,也能做到页面、图标与受害应用一模一样。

查看后台应用,也只有一个应用:

打开山寨应用,查看当前Activity栈信息,发现其TaskRecorder是“com.eg.android.AlipayGphone”,即受害应用包名。

攻击成功时,Activity栈信息,如下图:

实际场景中,攻击成功是需要条件的。android:allowTaskReparenting属性和 android:taskAffinity属性是将恶意应用的某Activity与受害应用的Activity关联,使其启动时进入同一个Task。因此,攻击并不是每次都能成功,必须是恶意应用先启动,然后再启动受害应用。
另一个需要克服的问题是,必须保证恶意应用进程一直在后台运行,而不被杀死。

对我来说,实验中耗费时间最长的就是制作钓鱼页面了。。。页面布局是个大坑啊。不过若只是想假冒应用获取敏感权限,就不需要会费心思制作输入框了,截个图就行了。(当然只是实验环境,胆小如我并没有找别人测试。)

这个功能是系统提供的,即使被用作钓鱼,也不会被手机自带的杀毒软件识别出来。再加上某些非手机自带“安全”APP的特点,对于没有安全基础的广大Android用户来说,可能唯一的方法就是不安装来源不明的软件了。

今天看到工信部公布了第一批侵害用户权益的APP名单,希望我们广大Android用户的使用体验能越来越好吧~

参考文献:
(1) https://developer.android.com/guide/topics/manifest/activity-element