惊闻Stagefright曝出重大漏洞,可以造成远程代码执行,甚至发条彩信,就有可能入侵用户移动设备。这听起来可是难得一遇的大漏洞啊,作为安全人员,自然要好好扒一扒内幕了。
从新闻来看,出于某些考虑,漏洞的发现者目前并没有公布相关的细节,而是决定要留到BlackHat上再进行详细的说明。也就是说,目前所知道就是Android系统的Stagefright库存在重大安全问题,具体是什么?想知道自己去Fuzz。
虽然,看起来关于漏洞细节,并没有任何头绪。但是,作为安全人员,首先要坚信的一点,就是世界上没有不透风的墙!仔细研读漏洞的新闻稿,可以发现,该漏洞已经提交给了Google,并且Google迅速的进行了修复。同时发现,Google也已经把漏洞相关信息交给了部分合作伙伴。看完这些,就能确定,这漏洞目前还能扒。
既然Google针对此漏洞,已经在源码中进行了修复。那么首先查看了Google的相关源码提交状态。
简单翻阅了提交的log。发现了一些关于libstagefright安全问题的修复,但大多言简意赅,难以确定。
看起来从Google方面下手并不容易,好在Google已经将漏洞相关资料交给了合作伙伴,所以我们发现了CyanogenMod公布的一条消息。
也就是说,在CM12中已经对此漏洞进行了修复!
随后,我们在github上找到了CM12的提交记录
可以看到,在CM12的最近提交中,都是对Stagefright相关漏洞的修复,根据这些修复内容,对漏洞大体上也就能有一些了解了!
我们对部分修复方案进行了简单分析。
该bug的位置在frameworks/av/media/libstagefright/SampleTable.cpp文件的SampleTable::setSampleToChunkParams函数中,从该bug的说明和修复上来看。是由于mNumSampleToChunkOffets值太大,可能造成溢出。相关代码如下
注意红线标注部分。可能会造成访问越界。从而引发安全问题。
该bug在frameworks/av/ media/libstagefright/ESDS.cpp的ESDS::parseESDescriptor函数中。直接从描述和修复代码中,就能看出来,是由于在解析过程中,对变量校验不严格,可能造成越界访问的问题。
此漏洞产生于frameworks/av/media/libstagefright/MPEG4Extractor.cpp的MPEG4Extractor::parseChunk函数中。从截图就可以看到漏洞的全貌了。当chunk_data_size小于kSkipBytesOfDataBox时,红线部分就会变成一个负数,由于setData的最后一个参数类型是size_t,所以就会被解析成很大的正数,从而造成错误。
其余漏洞产生原因类似,就不再一一进行描述了。
概览全部的修复代码,发现产生漏洞的原因,都是因为对数据校验完善造成的。此次曝光的只是Stagefright的问题。考虑到Android系统中包含了大量的文件解析代码,包括图片、压缩包、音频、视频等解码库。这些库在解析文件过程中,对数据进行严格的校验了吗?会不会明天又会爆出音频解码存在严重bug?这应该是值得开发者和安全从业者深思的问题。