没羽@阿里移动安全,更多技术干货,请访问阿里聚安全博客
这是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的内存写漏洞。这个内存写漏洞的产生需要满足

本文深入探讨了Android mediaserver的两个提权漏洞CVE-2014-7920和CVE-2014-7921,涉及内存写漏洞、内存读漏洞以及如何利用这些漏洞实现权限提升。通过分析漏洞成因、利用技巧和利用过程,揭示了如何从0权限提升到media权限,并介绍了在不同Android版本上的利用难点和解决方案。
最低0.47元/天 解锁文章
1110

被折叠的 条评论
为什么被折叠?



