• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android提权漏洞CVE-2014-7920&CVE-2014-7921分析

Android提权漏洞CVE-2014-7920&CVE-2014-7921分析

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android安全漏洞,android 任意调试漏洞,android系统漏洞,android漏洞,android 漏洞挖掘等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android提权漏洞CVE-2014-7920&CVE-2014-7921分析


这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到media权限,其中CVE-2014-7921影响Android 4.0.3及以后的版本,CVE-2014-7920影响Android 2.2及以后的版本。Google直到Android5.1才修复这2个漏洞。该漏洞[1]披露过程如下:

\

2016年1月24日漏洞作者发布了漏洞分析及exploit[2],拿到exploit后在几个Android版本上均没能运行成功,遂分析原因,学习漏洞利用思路。记录如下,欢迎大家交流学习。

不熟悉Android Binder的同学,请自行网上搜索学习资料,下面直接分析漏洞。

0x1漏洞成因

前文提到这2个漏洞出在mediaserver,mediaserver在main_mediaserver.cpp[3]实现,其main()函数中初始化了2个service:

\

一个是AudioFlinger[4],service name为“media.audio_flinger”;另一个是AudioPolicyService[5],service name为“media.audio_policy”。

1.1内存写漏洞

内存写漏洞产生在“media.audio_policy”中,接口类为IAudioPolicyService[6][7],其中startOutput()接口存在递增的内存写漏洞,stopOutput()接口存在递减的内存写漏洞。

startOutput()接口定义为:

startOutput(audio_io_handle_t output, audio_stream_type_t stream, int session = 0)

stopOutput ()接口定义为:

stopOutput(audio_io_handle_t output, audio_stream_type_t stream, int session = 0)

1)startOutput的递增写漏洞

熟悉Android Binder的同学都知道,该接口的native类为BnAudioPolicyService[8],当客户端请求“START_OUTPUT”code即startOutput()接口时,BnAudioPolicyService::onTransact()收到请求,然后执行下面的代码:

\

继续调用AudioPolicyService ::startOutput()[9]方法:

mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session);

mpAudioPolicy为audio_policy类型,audio_policy:: start_output()在audio_policy_hal.cpp中被定义为ap_start_output(),该方法调用:

\

lap->apm->startOutput()由AudioPolicyManagerBase:: startOutput()方法实现,该方法调用:

\

我们来看AudioOutputDescriptor:: changeRefCount()[10]方法的代码:

\

当2个if语句都为假时,mRefCount[stream] += delta;语句将被执行。

此时如果索引stream可被控制,那么mRefCount内存的相对偏移内存将可被修改为加delta。恰巧stream为接口参数之一,也没校验,在AudioPolicyManagerBase:: startOutput()中传入的delta为1,也就是说这里存在一个递增1的内存写漏洞。这个内存写漏洞的产生需要满足以下条件:

lisDuplicated()为False:幸运的是默认情况大部分output不是duplicated的。

l(delta + (int)mRefCount[stream]) < 0:由于这个判断条件,mRefCount[stream]<0x7FFFFFFF时才会为False,这就限制了这个内存写漏洞,只能对内存内容小于0x7FFFFFFF的内存值进行递增。

2)stopOutput的递减写漏洞

stopOutput()接口类似于startOutput()接口,我们直接看AudioPolicyManagerBase::stopOutput()方法,该方法调用的是:

outputDesc->changeRefCount(stream, -1);

与startOutput()接口类似,也存在相同的写限制,不同的是这递减1的内存写漏洞。

1.2内存读漏洞

内存写漏洞也产生在“media.audio_policy”中,问题出在isStreamActive()接口。该接口定义为:

bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs)

类似于startOutput()接口,该接口调用了AudioPolicyManagerBase::isStreamActive()方法,该方法调用:

\

即AudioOutputDescriptor::isStreamActive()方法,该方法代码为:

\

如果根据isStreamActive()返回值判断mRefCount[stream]是否为0,需要满足2个条件:

lmRefCount[stream] != 0;

lns2ms(sysTime - mStopTime[stream]) > inPastMs:

sysTime - mStopTime[stream]为时间差值,为正值,当inPastMs>=0x80000000时,该不等式成立。

所以可以通过控制stream和inPastMs的值判断mRefCount内存相对偏移的值是否为0。

0x2利用之前

2.1利用技巧小结

1)利用内存读,模糊匹配audio_hw_device对象

audio_hw_device这个结构包含了audio硬件设备函数指针,在“media.audio_policy”和“media.audio_flinger” service提供的接口中会被调用,这有利于写exploit。audio_hw_device结构定义如下:

\

[图片来自原文]

分析发现audio_hw_device对象中reserved和function_ptrs-> get_supported_devices为0,其它字段为非0。该结构用0和非0的形式可表示为:

\

前面提到可以通过isStreamActive()接口判断内存值是否为非0,这样结合audio_hw_device结构的特征在内存中搜索,恰巧在mRefCount的上下内存区域中可以搜索到audio_hw_device对象。

2)利用内存写,泄漏内存地址

“media.audio_flinger”提供了getInputBufferSize()接口[11],接口定义为:

\

其服务端代码为:

\

当客户端调用getInputBufferSize()接口,服务端最终调用get_input_buffer_size()即audio_hw.cpp::adev_get_input_buffer_size()函数,最后返回size。由arm指令特性可知,get_input_buffer_size(dev, &config)函数的反汇编中,通过R0传入dev指针,即audio_hw_device对象,函数执行完后,返回值通过R0传回。如果修改get_input_buffer_size函数指针,让其指向“BX LR”,那个就可拿到audio_hw_device对象的内存地址。

恰巧get_input_buffer_size ()函数指针也存储于audio_hw_device对象中,使用内存写漏洞让audio_hw_device. get_input_buffer_size指向一个“BX LR”的地址即可获取audio_hw_device对象地址。

2.2踩到的坑

笔者在调试exploit时发生多次crash,将update后的exploit放在https://github.com/Vinc3nt4H/cve-2014-7920-7921_update,编译环境:Android 4.3_r2.1,运行环境:AVD 4.3(4.3_r2.1)。

1)搜索audio_hw_device对象时mediaserver crash

在运行exploit时,可以搜索到audio_hw_device对象,但mediaserver crash了,可能是由于搜索的内存范围过大,导致非法内存访问。可缩小搜索范围试试,比如设置MAX_OFFSET为-3000。

2)总是获取不到adev_open_output_stream()地址

笔者在AVD 4.3上使用原gadget read_r0_offset_108,总是获取不到adev_open_output_stream函数的指针,然后在camera.goldfish.so中找了一个gadget(thumb):

\

3)android 4.4.2上crash

开始时笔者在AVD 4.4.2中执行exploit总是不成功,调试发现audio_hw_device. get_input_buffer_size的值被置了0,如下图:

\

因为mediaserver中加载的audio.primary.goldfish.so基址大于0x7FFFFFFF,也就是mRefCount[offset_get_input_buffer_size] > 0x7FFFFFFF,即为负数,在利用递增1/递减1时,changeRefCount()方法,如果(delta + (int)mRefCount[stream]) < 0,则将mRefCount[stream]置为0。在4.4.2上很难利用成功。

 

0x3漏洞利用分析

3.1搜索audio_hw_device对象相对偏移

2.1-1中提到利用audio_hw_device结构的特征在mediaserver进程中搜索匹配的对象。利用isStreamActive()的内存读漏洞读取mRefCount附件内存区域生产0/非0的

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android提权漏洞CVE-2014-7920&amp;CVE-2014-7921分析
  • Android提权漏洞CVE-2014-7920&amp;CVE-2014-7921分析,android提权漏洞
  • Android APP漏洞挖掘

相关文章

  • 2017-05-26Mac版 Android Studio快捷键大全,android快捷键大全
  • 2017-05-26开源图表库MPAndroidChart使用介绍之饼状图&amp;折线图&amp;柱状图,图表mpandroidchart
  • 2017-05-26location of the android sdk has not been setup in the preferences,androidpreferences
  • 2017-05-26Android中调用文件管理器并返回选中文件的路径,android文件管理器
  • 2017-05-26网络连接异常处理工具,网络连接异常处理
  • 2017-05-26Android之网络数据存储,android数据存储
  • 2017-05-222.3.7 ProgressBar(进度条)
  • 2017-05-26Bottom Sheet
  • 2017-05-26ScrollView中嵌套GridView,ListView只显示一行的解决办法,scrollviewgridview
  • 2017-05-26android常用框架收录,android收录

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android Doze模式源码分析,androiddoze
    • [android] 与PHP的session进行交互demo,androidsession
    • Android学习笔记-TextView(文本框)(二),android-textview
    • MAT使用入门,mat入门
    • 硅谷商城第二版3--分类模块,硅谷商城第二版3--
    • 充值,充值平台
    • Android中使用ExpandableListView实现好友分组,expandablelistview
    • android权限大全
    • 安卓开发—简单的登陆界面,安卓登陆界面
    • 谷歌IAP:skusBundle array associated with key ITEM_ID_LIST cannot contain more than 20 items.,jsarraycontain

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有