阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解

阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确全面。本文将讲一下应用漏洞扫描器在针对本地拒绝服务的检测方法。

一、本地拒绝服务产生原因和影响

Android应用使用Intent机制在组件之间传递数据,如果应用在使用getIntent(),getAction(),Intent.getXXXExtra()获取到空数据、异常或者畸形数据时没有进行异常捕获,应用就会发生Crash,应用不可使用(本地拒绝服务)。恶意应用可通过向受害者应用发送此类空数据、异常或者畸形数据从而使应用产生本地拒绝服务。
阿里聚安全的博客以前有一篇文章《Android应用本地拒绝服务漏洞浅析》,里面详细讲了产生本地拒绝服务的四种情况:
1、NullPointerException空数据异常:应用程序没有对getAction()等获取到的数据进行空指针判断,从而导致空指针异常而导致应用崩溃。
2、ClassCastException类型转换异常:程序没有对getSerializableExtra()等获取到的数据进行类型判断而进行强制类型转换,从而导致类型转换异常而导致应用崩溃。
3、IndexOutOfBound**ception数组越界异常:程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃。
4、ClassNotFoundException异常:程序没有无法找到从getSerializableExtra ()获取到的序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃。
当应用被恶意应用攻击时,本地拒绝服务一般会导致正在运行的应用崩溃,首先影响用户体验,其次影响到后台的Crash统计数据,另外比较严重的后果是应用如果是系统级的软件,可能导致手机重启。Nexus 5曾经出现过这样的情况,它预装了一个用来测试网络连通性的系统应用,这个应用是隐藏状态,无法在桌面上打开,包名为com.lge.SprintHiddenMenu。在Android 4.4.3之前的版本里,这个应用里有大量导出的activity,这些 activity不需要任何权限就可以被外部调用。其中一个为com.lge.SprintHiddenMenu.sprintspec.SCRTN的组件是导出的,并且没有任何权限限制,给它发送一个空Intent,可导致Nexus 5手机重启。

二、阿里聚安全扫描器的进化提升

一个简单的本地拒绝服务类漏洞,要想进行大规模的自动化扫描,扫描器也要做不少的工作,并且随着对本地拒绝服务漏洞的认识,阿里聚安全的漏洞扫描器也在不断进行优化提高。

2.1 空Intent阶段

这个阶段的扫描器是初级阶段,一般只是通过AndroidManifest.xml文件获取应用导出的组件,然后使用adb命令发送空intent给导出组件,捕获应用日志输出,查看是否有崩溃产生。
针对空Intent导致的本地拒绝服务情况可发送如下命令测试:

adb shell am start -n com.jaq.dosappsample/.DosActivity

adb shell am startservice -n com.jaq.dosappsample/.DosService

adb shell am broadcast -n com.jaq.dosappsample/.DosReceiver

何为导出的组件?
在AndroidManifest.xml文件中如果应用的组件android:exported属性显式指定为“true”,或者并没有显式指定为“true”也没有显式指定为“false”,什么也没有写,但是有intent-filter并指定了相应的Action,则此组件为导出的组件。

2.2 解析Key值阶段

空Intent导致的拒绝服务毕竟只是一部分,还有类型转换异常、数组越界异常等导致的本地拒绝服务。在解析Key值阶段扫描器需要分析组件代码中是否使用了一些关键函数。
在Activity组件中的onCreate()方法中,Service组件中的onBind()和onStartCommand()方法中,BroadcastReceiver组件的onReceive()方法中,如果组件没有做好权限控制,都可接受任意外部应用传过来的Intent,通过查找getIntent()、getAction()和getXXExtra()这些关键函数,检测其是否有try catch异常保护,如果没有则会有本地拒绝服务风险。
在这一阶段扫描器遇到的挑战是找到这些关键函数中的Key值,Action值,不仅要找到,还要找到key对应的类型,来组装adb命令,发送命令给安装好的应用进行测试。

2.3 通用型拒绝服务阶段

2015年年初的时候,业界又爆出了通用型拒绝服务,由于应用中使用了getSerializableExtra() 的API,应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入序列化数据,导致应用本地拒绝服务。此种方法传入的key值不管是否与漏洞应用相同,都会抛出类未定义的异常,相比解析Key值阶段通用性大大得到了提高。
针对这个常用的手工检测POC代码如下:
此阶段扫描器遇到的难题是无法直接通过adb命令进行测试,因为无法用adb命令传递序列化对象给应用。业界大部分漏洞扫描器也因为无法发送序列化对象给应用都止步解析Key值组装adb命令阶段,而阿里聚安全的漏洞扫描器能够发送序列化对象数据给指定的应用,再结合静态分析查找导出的组件和关键函数,动态运行应用,精确识别出会发生本地拒绝服务的应用组件,同时实现了大规模自动化测试。

2.4 动态注册BroadcastReceiver阶段

BroadcastReceiver组件一般分为两种,一种是静态注册,提前在AndroidManifest.xml声明组件;另外一种是动态注册,在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册。
动态注册BroadcastReceiver的常见使用方法如下:
很多开发者没有意识到,如上使用registerReceiver()方法注册的是全局BroadcastReceiver,和静态注册BroadcastReceiver android:exported属性为true性质一样,如果没有指定权限访问控制(permission参数),可以被任意外部应用访问,向其传递Intent,根据具体情况产生的危害可能不同,一种比较普遍的情况是容易产生本地拒绝服务漏洞。
动态注册BroadcastReceiver导致导出的Receiver这种情况非常少被大家注意,现有的一些安全检测工具、扫描器都不能发现动态注册的BroadcastReceiver。在此阶段,动态注册BroadcastReceiver隐藏在所有代码中,在应用的任何地方都可能出现,需要扫描器全局分析应用的代码找出关键函数registerReceiver,还要找出其IntentFilter所设置的Action和Receiver的权限设置,现在一般一个普通的正常Android应用都有几十M的大小,反编译成smali代码会更多,扫描器遇到的挑战主要是查找的时间和空间挑战,还有多个参数查找的准确性。目前业界只有阿里聚安全的扫描器有准确扫描动态注册BroadcastReceiver导致的本地拒绝服务的能力。
通过阿里聚安全的漏洞扫描器对一些样本进行了检测,也发现了不少动态注册BroadcastReceiver导致的本地拒绝服务攻击。

三、本地拒绝服务漏洞现状

为了了解本地拒绝服务漏洞的现状,阿里聚安全的应用漏洞扫描器针对国内外的各行业主要APP进行了扫描,共扫描了三百多款APP。
国内行业主要是通过采集国内某应用市场的APP,我们采集了各个行业的TOP APP总共有151个,发现拒绝服务漏洞的总个数为970个,平均个数为6.4个**,其中影音播放类的APP本地拒绝服务个数最多,健康类安全类和运营商类比较少、游戏类的最少。**
国内行业APP本地拒绝服务漏洞情况:
柱状图是国内各个行业APP按本地拒绝服务漏洞平均个数排序:
下图是各个组件引起的本地拒绝服务的数量、占比情况:
国内行业动态注册BroadcastReceiver导致的本地拒绝服务漏洞有247个,约占拒绝服务漏洞总数的25%,比静态注册BroadcastReceiver的要多不少:
国外行业主要是通过采集Google Play上的APP,我们也采集了各个行业的TOP APP总共有177个,发现拒绝服务漏洞的总个数是649个,平均漏洞个数为3.7个,平均漏洞个数最多的是办公类应用,最少的和国内行业一样是游戏。
国外行业APP本地拒绝服务漏洞情况:
国外各个行业的应用本地拒绝服务漏洞平均个数排序:
各个组件引起的本地拒绝服务的数量、占比情况:
国外行业动态注册BroadcastReceiver导致的本地拒绝服务漏洞有147个,约占拒绝服务漏洞总数的23%,比国内的情况略少,可见动态注册BroadcastReceiver导致的本地拒绝服务都没有引起大家的重视。
总体上来看,本地拒绝服务风险因为具有Android版本无关性,漏洞本身对APP影响也不大,只与应用开发者是否注意、重视有关,所以现在还经常在应用中出现。在各大厂商的安全应急响应中心评级为低危漏洞,也有厂商不收此类漏洞,但是这些攻击面依然存在,如果深入分析这些组件,有的不仅仅是引发本地拒绝服务风险,必须遵循最小权限原则,没有必要导出的组件不要导出。

四、开发者建议

(1)阿里聚安全的漏洞扫描器已经具备覆盖动态注册Receiver产生的拒绝服务漏洞(目前,还没发现友商的漏洞扫描器有这样的能力),使用阿里聚安全的漏洞扫描器进行扫描,可及时发现这些漏洞。
(2)不必要导出的组件将其exported属性显式的设为“false”,这样可以减少应用的攻击面。
(3)导出的组件在getIntent()后,Intent.getXXXExtra()时用try…catch做好异常处理。
(4)在导出的组件设置好权限控制,不让任意第三方应用访问。
(5)对于动态注册的BroadcastReceiver,尽量少用registerReceiver()方法,如果只在本应用内通信,改用LocalBroadcastManager的registerReceiver()进行本地注册,如果必须导出给外部应用,在使用registerReceiver()时要指定好相应的访问权限。

五、参考

1、Android APP通用型拒绝服务漏洞分析报告,http://blogs.360.cn/blog/android-app%E9%80%9A%E7%94%A8%E5%9E%8B%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A/
2、 Android应用本地拒绝服务漏洞浅析,https://jaq.alibaba.com/blog.htmid=55
3、https://developer.android.com/guide/components/activities.html
4、https://developer.android.com/guide/components/services.html
5、https://developer.android.com/reference/android/content/Context.html
6、https://labs.mwrinfosecurity.com/advisories/2014/11/05/nexus-5-4-4-2-local-dos/
*作者:伊樵@阿里聚安全(企业账号),转载请注明来自FreeBuf(FreeBuf.COM)

阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解相关推荐

  1. APP漏洞扫描器之本地拒绝服务检测详解

    APP漏洞扫描器之本地拒绝服务检测详解 作者:伊樵@阿里聚安全 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确全 ...

  2. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  3. [免费专栏] Android安全之数据存储与数据安全「详解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  4. 阿里云国际版设置DNS托管和智能分流教程详解

    Domain Name System 是一个在阿里上的DNS托管工具,每家云端都有自己的DNS解析服务,阿里云有一项其他云端没有的特殊功能「URL隐性转发」,用户在点击你的网站时上方秀出的是A域名,但 ...

  5. Android四大组件之bindService源码实现详解

        Android四大组件之bindService源码实现详解 Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindServic ...

  6. android应用市场点击下载APK安装详解

    Android系统启动篇 1,<android系统启动流程简介> 2,<android init进程启动流程> 3,<android zygote进程启动流程> 4 ...

  7. Web网络安全漏洞分析,SQL注入原理详解

    本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...

  8. android 实现毫秒定时器,Android实现定时器的五种方法实例详解

    一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比, ...

  9. Android拍照及从相册选择图片传详解(终极版)

    Android 拍照及从相册选择图片传详解 先上图 新知识点速览 URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符.通过使用位置,名称或两者来标识Internet上的 ...

最新文章

  1. ElasticSearch 被攻击勒索
  2. 方舟 game.ini 配置文件_方舟突然回归|这次居然是住院篇!
  3. C语言深度剖析书籍学习记录 第二章 符号
  4. 手机python3ide加法器_Python3开发常用工具
  5. SYSTEM 表空间管理及备份恢复
  6. .NET连接MySQL数据库并绑定于datagridview。
  7. 布隆过滤器 redis_redis位图-布隆过滤器
  8. EXCEL数据比对常用函数
  9. oracle用户LOCKED(TIMED)原因及解决
  10. 《炬丰科技-半导体工艺》SC-1颗粒去除和piranha后漂洗的机理研究
  11. mumu显示连接服务器超时,网易mumu模拟器安装不了 网易mumu模拟器安装好久解决方法...
  12. 深度搜索算法C语言实现--以走迷宫为例
  13. 功放限幅保护_如何利用限幅器保护音箱
  14. 计算机毕业设计 SSM的房屋租赁管理系统(源码+论文)
  15. python使用pandas读取excel绘制柱状图,折线图,饼状图
  16. if 语句与switch语句
  17. 世嘉公司遭****** LulzSec称愿为世嘉×××
  18. 泪水,你看见了什么?
  19. 施耐德PLC如何进行远程维护?
  20. presto国产化适配-aarch64

热门文章

  1. 【身份证识别】形态学二代身份证号码识别系统【含GUI源码 948期】
  2. python 矢量化计算
  3. 计算机编码问题总结——哈夫曼编码
  4. Unity3D里实现可以朝向另一目标广告牌(billboard)效果
  5. 《ABAQUS有限元分析实例详解》学习笔记_51CAE_新浪博客
  6. 0124:镂空三角形(C++)
  7. docker修改mysql数据库密码,redis密码
  8. windows远程linux工具之tabby的使用
  9. 基于matlab的JPEG彩色图像编码解码源码
  10. python下载电影_python下载电影