- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
25.2 录屏授权漏洞分析
25.2.1 漏洞场景
在 Android 5.0 中新增了一个 API 来进行录制屏幕视频。在当今直播和游戏那么火的时代,录制也是非常不错的功能,现在很多应用就是利用这个 API 来做到游戏的录制效果的。在使用这个 API 的时候,系统会给一个授权提示,如图 25-3 所示。
图 25-3 屏幕录制授权提示
这个对话框是系统弹出来的提示消息,主要由两部分组成,应用的名称+提示文案,看似是一个很平常的授权对话框,但是这背后却有一个很大的界面漏洞,危险性很大。当应用被授权了,那么就代表这个应用可以监听用户设备的屏幕信息。
Android 系统中在弹出对话框的时候,如果内容过多,会采用滚动样式,来展示全部消息,而不是使用字符省略的方式。那么就存在一个问题,如果把应用的名称故意弄的很长,导致后面一段提示文案“将开始截取您的屏幕上显示的所有内容”给抵到底部,只有滑动的时候才能看到,这样来骗取用户点击“立即开始”。同时再把应用的名称改成一些银行或者是社交账号,支付应用的提示文案,比如:“××宝新增了特性...点击立即开始,即可体验!”,用户如果相信就开始点击了。当然这里还需要一个功能,就是监听系统的 TopActivity,当监听到用户打开了银行 App 或者是社交 App 的时候,就去申请权限,弹出对话框!
下面通过 MediaProjectionManager 源码来分析一下,授权提示流程:在使用录制屏幕功能的时候,去授权页面调用的是 createScreenCaptureIntent 方法,获取授权 Intent:
这里调用的是 MediaProjectionPermissionActivity 来进行授权:
这里直接用系统对话框展示了。
下面就来演示一个例子,比如现在恶意软件在后台监听到了用户启动了某某应用,然后就启动授权界面,如图 25-4 所示。
图 25-4 恶意应用的授权界面
恶意 App 的名称为:
这就看到了提示信息,与打开银行 App 时给的提示信息很类似,用户会感觉很正常,如图 25-5 所示。一般弹出的提示对话框,用户不会去滑动看到底部,而关键提示信息就在底部。
图 25-5 恶意 App 授权界面
如果用户点击“立即开始”就相当于授权了,那么恶意 App 就在后台偷偷录制你的屏幕,当你输入账号和密码的时候也会被记录,再把录制 App 发到服务端进行分析,账号就会被盗取!
25.2.2 漏洞原因分析
这个漏洞其实就是一个界面漏洞,在提示信息展示的时候没有做省略处理,从而把最重要的提示文案给隐藏了,导致用户被骗,同意授权。
该漏洞实际上是由于 Google 没有制定合理的 Android 应用名称规范导致,综合表现为如下两点:
·没有规范应用名称长度,使得应用名称可为任意长度。
·没有规范应用名称字符集,如应用名称可包含换行符和制表符。
25.2.3 漏洞修复
Google 在后续的 6.0 系统中修复了这个问题,修复之后的效果如图 25-6 所示。
图 25-6 修复之后的授权界面
采用了省略号代替了,不会把重要的提示信息给隐藏了。那么对于 5.0 系统的用户该怎么办呢?这个漏洞依旧存在,这就要求开发者做一些工作了,在 Android 中涉及用户隐私的 Acitivity 中(例如登录、支付等其他输入敏感信息的界面中)增加属性:WindowManager.LayoutParams.FLAG_SECURE
看一下属性源码说明:
该属性能防止屏幕被截图和录制。这个属性就是可以防止当前 Activity 不会被录制,可以做一个案例:
使用 MediaProjection 进行截图功能,如果加上了这个属性,再次截图,效果如图 25-7 所示。
图 25-7 应用截图失败
看到下面的截图是一片漆黑,截图失败,而且这时候使用 adb shell screencap 命令去截图也是失败,如图 25-8 所示。
图 25-8 应用截图失败提示
从这里可以看出,adb shell screencap 和 screenrecord 命令底层的实现和 MediaProjection 是一样的。
在 5.0 的系统中,或者对于银行 App、社交 App、支付 App 等,开发者应该把当前登录的 Activity 添加这个属性!如果没有添加的话,就加上吧,给自己的 App 加上一份保险!
25.2.4 漏洞总结
下面来总结一下这个漏洞:
·漏洞产生的原因:因为 Google 在处理对话框提示的时候,没有做字符限制,导致一些重要的提示信息被遮挡。
·漏洞的危险:恶意 App 利用这个漏洞,把自己的 App 名称弄得很长,而且在后台监听用户打开了一些支付 App、银行 App 之后,就弹出这个授权对话框,但是因为名称太长了,重要的提示文案被盖住了,用户很难发现问题,授权之后就被录制了重要信息。
·漏洞修复:Google 在 6.0 以后进行了修复,使用字符限制功能,但是对于没有升级到 6.0 的用户,开发者就需要在自己的项目中给 Activity 添加安全属性,特别是登录页面,这样就可以防止当前页面被录制或者截屏了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论