• 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提权漏洞

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

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

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

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


没羽@阿里移动安全,更多安全类技术干货,请访问阿里聚安全博客


 

 

这是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的内存写漏洞。这个内存写漏洞的产生需要满足以下条件:

  • isDuplicated()为False:幸运的是默认情况大部分output不是duplicated的。
  • (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个条件:

  • mRefCount[stream] != 0;
  • ns2ms(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。

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

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

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

相关文章

  • 2017-05-26Activity生命周期,activity生命周期图
  • 2017-05-26fastdfs 使用遇到的问题
  • 2017-05-26Android滑动删除功能,android滑动删除
  • 2017-05-26Android中ListView实现图文并列并且自定义分割线(完善仿微信APP),androidlistview
  • 2017-05-26手机安全卫士——闪屏页相关处理,手机安全卫士
  • 2017-05-26android学习第一天(android的介绍和基础):,android第一天
  • 2017-05-26Android 急速发布项目到 JitPack,androidjitpack
  • 2017-05-26利用GridView实现单选效果,gridview实现单选
  • 2017-05-26Android adb shell命令合集
  • 2017-05-26Linux内核系列—7.操作系统开发之中断和异常,linux内核

文章分类

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

最近更新的内容

    • Adroid: getExternalStorageDirectory 不一定是你想要的外部存储SdCard,adroidsdcard
    • Android Butterknife 8.4.0 使用方法总结,butterknife8.4.0
    • Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单
    • Android提权漏洞CVE-2014-7920&amp;CVE-2014-7921分析
    • A DB2 Performance Tuning Roadmap --LOG INTRODUCTION
    • Android学习笔记-开关按钮ToggleButton和开关Switch,togglebuttonswitch
    • 硅谷商城3--购物车数据存储器,3--购物车
    • 小明学习Linux运维实战演练
    • ELK部署参考文档
    • Android逆向之旅---解析编译之后的Dex文件格式

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

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