Hardening the media stack

原文地址:
http://android-developers.blogspot.com/2016/05/hardening-media-stack.html

Posted by Dan Austin and Jeff Vander Stoep, Android Security team

为了使Android更加安全,我们鼓励并奖励那些发现漏洞的研究者。2015年,Google修复了mediaserver’s libstagefright的一系列bug。我们在2015年8月和9月的security bulletin上发布了这些问题的更新。

除了每个月基本的解决问题外,我们也在做一个新的安全功能,以强化现有的安全模型,并提供额外的深度防御。这些防御措施试图达到两个目的:

  • Prevention:修复bug,防止它们变成漏洞
  • Containment:隔离那些处理不受信任内容的组件,以保护系统

Prevention

libstagefright中发现的大部分漏洞都是由无符号整型溢出引起的堆溢出。一些的整型溢出使得攻击者可以分配一个比实际到达数据所需要空间小的缓冲区,从而引起堆的缓冲区溢出。

无符号整型溢出造成的结果是非常明确的,但随后引发的行为可能是不期望的或者不安全的。相比之下,在C/C++中,有符号整型溢出被认为是不明确的行为,这意味着溢出造成的后果是没保证的,并且编译器的作者通常会从引发的后果中选择一个最快或最简单的。我们对编译器做出修改,使得编译器在有符号和无符号整型溢出时都能提供一个更安全的默认结果。

UndefinedBehaviorSanitizer(UBSan)是LLVM/Clang 编译器工具链的一部分,用于检测那些未定义的或意料之外的行为。UBSan会检查多种类型的未定义和不安全行为,包括有符号和无符号整型溢出。这些检测会将代码添加到可运行文件中,在运行时检测整型溢出。例如,图1展示的是原研究人员打上补丁后的libstagefright的MPEG4Extractor控件的parseChunk函数的源代码。这次修改,包含在图中的黑色框中,看起来防止了整型溢出。很不幸的是,SIZE_MAX和size是32位值,chunk_size是64位值,这造成不完全检测和潜在的整型溢出。在红色框中,size和chunk_size的加法可能引起整型溢出,并创建了一个比size元素小的缓冲区。随后的memcpy操作可能导致可用内存的崩溃,因为蓝色框中的size+chunk_size可能会小于size。关于这个漏洞的潜在利用向量的机制的详细描述,请看Project
Zero

图1:源代码展示了一个微妙的无符号整型溢出

图2将上面的代码段产生的汇编语言与通过integer sanitization enabled编译的第二版本做了对比。图2红框中是引起整型溢出的加法操作。

在unsanitized版本中,size(R6)和chunk_size(R7)相加,有可能会导致R0溢出且小于size。本该按size分配的缓冲区被指定为R0的大小,然后size个比特被拷贝进去R0大小的缓冲区。如果R0小于size(R6),这会引起内存崩溃。

在sanitized版本中,size(R7)和chunk_size(R5)相加,并把结果存储到R0。然后,R0和R7比较,如果R0小于R7,程序会指向CC情况的代码,R3被设为1。如果R3为1,且设置了执行位,那么发生内存溢出,并且触发异常终止,从而避免内存崩溃。

注意,由补丁引发的不完全检测并不包含在图2中。溢出发生在缓存区分配时的加法操作。sanitized版本中增加的触发操作,把可被利用的漏洞转化为无害的异常终止。

虽然整型sanitizer原本是作为代码清洁工具的,它们有效的阻止大部分已知的libstagefright漏洞。启动整型溢出检查只是第一步。找出并修复整型溢出(大部分是不可被利用的),以防止运行时异常终止,这体现了Android`s media team的努力。大部分被发现的溢出都被修复,剩余的(主要是性能的原因)被确认和标记为安全的,以防止运行时异常终止。

在Android N中,在整个media stack中都可以进行有符号和无符号整型溢出的检测,这就包括了libstagefright。这使得利用整型溢出变得更困难,同时也可以防止将来会引进新的整型溢出Bug。

Containment

在Android M和更早的版本,mediaserver进程负责大部分和多媒体相关的任务。这以为它要访问所有和这些任务相关的权限,尽管它运行在它自己的沙盒中,但它仍需要访问大量的资源和功能。这就是为什么2015年时libstagefright Bug具有重大意义——mediaserver可以访问Android设备上一些重要的资源,包括相机,麦克风,显卡,电话,蓝牙以及网络。

根源分析表示libstagefright Bug主要发生在解析文件格式和多媒体解码器的代码中。这并不奇怪,解析复杂文件格式和编码器试图加速是很困难的,大量的边缘情况使得代码容易受到偶然的和恶意的畸形输入攻击。

然而,多媒体解析器不需要访问大部分mediaserver持有的权限。基于这个原因,media ream重新设计了Android N的mediaserver,使得它更好的遵循最少特权原则。图3展示了整块mediaserver和它的权限被如何分割,这种分割是基于下面的方法:

  • 解析代码被移进持有很少或没有权限的非特权沙盒
  • 需要敏感权限的组件被移进了分离沙盒,这个沙盒只能访问该组件所需要的特定资源。例如,只有cameraserver可能访问相机,只有audioserver可能访问蓝牙,只有drmserver可能访问DRM资源。

将Android N和更早期版本做对比,libstagefright Bug带来的潜在影响展示了这种策略的价值。在取得libstagefright可执行代码前允许整块mediaserver访问所有的权限和可用资源(包括显卡驱动,相机驱动,sockets等),会暴露大范围的内核攻击面。

在Android N中,libstagefright运行在只能访问非常少权限的多媒体编码器沙盒中。SELinux阻止对相机、麦克风、图片、电话、蓝牙、网络的访问和动态代码的加载。Seccomp进一步限制与内核的交互。这意味着libstagefright通过减少内核暴露的攻击面,使得攻击者能访问的权限更少,也减缓了特权增加。

Conclusion

这个多媒体强化项目是一场持续不断的努力,它集中于把功能移进低权限的沙盒,并进一步减少授予这些沙盒的权限。虽然这里讨论的技术被用在Android 多媒体框架,但它同时适用于Android代码库。这些强化技术或其他技术,正在积极地应用于Android的其他组件。

时间: 2024-11-10 16:52:09

Hardening the media stack的相关文章

介绍一个开源的SIP(VOIP)协议库PJSIP

本文系转载,出处不可考. 如果你对SIP/VoIP技术感兴趣,哪希望你不要错过:),如果你对写出堪称优美的Code感兴趣 ,那么你也不可错过:) 这期间我想分析一下一个实际的协议栈的设计到实现的相关技术,算是自己的一个学习经 历记录. 最初选择这个库做分析的原因很简单,文档齐全:),其它良好的特征则是慢慢发现的:) www.pjsip.org 1. PJSIP简介 PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括: 1).极具移植性.(Extremely porta

pjlib深入剖析和使用详解

1. PJSIP简介 PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括:    1).极具移植性.(Extremely portable)                    2).非常小的足印.(Very small footprint)        官方宣称编译后的库<150Kb,我在PC上编译后加上strip后大概173Kb,这对于嵌入        式设备,是个好消息:)        3).高性能.(High performance)       这点

exosip 和 pjsip 简介

 oSIP oSIP的开发开始于2000年7月,第一个版本在2001年5月发 布,到现在已经发展到3.x了.它采用ANSI C编写,而且结 构简单小巧,所以速度特别快,它并不提供高层的SIP会话 控制API,它主要提供一些解析SIP/SDP消息的API和事务处理 的状态机,oSIP的作者还开发了基于oSIP的UA lib:exosip和 proxy server lib:partysip. oSIP支持的功能: exosip针对UA是对osip进行扩展,oSIP不提供任何快速产生请求消息和响应消

Security arrangements for extended USB protocol stack of a USB host system

Security?arrangements for a universal serial bus (USB) protocol stack of a?USB host system are provided. The?security?arrangements prevent an unauthorized or suspicious?USB?device from communicating with the host system, detect suspicious activity or

Android Bluetooth Stack: Bluedroid(五岁以下儿童):The analysis of A2DP Source

1. A2DP Introduction The Advanced Audio Distribution Profile (A2DP) defines the protocols and procedures that realize distribution of audio content of high-quality in mono or stereo on ACL channels. As indicated in the diagram of 'Protocol Model', A2

Android Bluetooth Stack: Bluedroid(五):The analysis of A2DP Source

1. A2DP Introduction The Advanced Audio Distribution Profile (A2DP) defines the protocols and procedures that realize distribution of audio content of high-quality in mono or stereo on ACL channels. As indicated in the diagram of 'Protocol Model', A2

(转)RMAN-06054: media recovery requesting unknown archived log for thread...

转自:http://blog.itpub.net/29800581/viewspace-1307267/ 使用rman执行recover database 的时候出现RMAN-06054的错误提示: RMAN> recover database; Starting recover at 21-OCT-14 using channel ORA_DISK_1 starting media recovery archived log for thread 1 with sequence 1 is al

PAT 1057 Stack

Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). Now you are supposed

51nod1289 stack

1289 大鱼吃小鱼 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右).问足够长的时间之后,能剩下多少条鱼? Input 第1行:1个数N,表示鱼的数量(1 <= N <= 100000). 第2 - N + 1行:每行两个数A[i],