2016-08-09

appscan

0x1 漏洞初现

FFmpeg SSRF与本地文件读取漏洞最初来源是国外的漏洞平台,去年已在CTF比赛中被使用。官方今年一月份发布修复版本并公布了漏洞。在今年blackhat也会有这个漏洞的相关议题,同时360产品线也收到了相关漏洞报告,目前已完成修复。

 

0x2 FFmpeg简介

FFmpeg的是一款全球领先的多媒体框架,支持解码,编码,转码,复用,解复用,流媒体,过滤器和播放几乎任何格式的多媒体文件。支持无数编码的格式,比如,HLS。

HLS(HTTP Live Streaming)是Apple公司开发的一种基于HTTP协议的流媒体通信协议。它的基本原理是把一个视频流分成很多个ts流文件,然后通过HTTP下载,每次下载一份文件。在一个开始一个新的流媒体会话时,客户端都会先下载一个m3u8(播放列表 Playlist)文件,里面包含了这次HLS会话的所有数据。

 

0x3 漏洞原理

问题就出在解析这个m3u8文件的时候,解析文件会得到ts流的http地址,我们并不一定非要得到一个视频文件流,可以是任意url地址,只要符合ffmpeg官方的协议头,所以造成了ssrf漏洞;并且不巧的是,官方还支持file协议,再再不巧的是,官方还有自己的concat协议,用来拼接url,所以出现了本地文件读取漏洞。下面是一个m3u8文件的格式:

然后构造一个媒体文件,去访问这个m3u8文件:

当我们本地打开这个文件,通过ffmpeg去解析的时候,将会触发漏洞:

 

0x4 漏洞危害

使用这个漏洞,可以通过上传漏洞视频,然后播放,或者在转码过程中,触发本地文件读取以获得服务器文件。漏洞刚爆出时,在服务器端影响较大,国内主流视频网站均受到波及。后经过跟进发现,安卓和苹果客户端如果使用了自己编译的有漏洞的ffmpeg库,同样能触发本地文件读取漏洞,这样使用一段视频,就能获得手机中的文件内容了。

 

0x5 漏洞修复

通过查看官方源码,在解析HLS编码时,ffmpeg禁止了所有协议除了http(s)和file协议,修改方法如下:

如果有使用ffmpeg的程序,请参照下面的版本进行升级:

FFmpeg 2.8.x系列升级至2.8.5或以上;

FFmpeg 2.7.x系列升级至2.7.5或以上;

FFmpeg 2.6.x系列升级至2.6.7或以上;

FFmpeg 2.5.x系列升级至2.5.10或以上;

或直接使用FFmpeg 3.0.x版本。

 

0x6 漏洞扫描方法

通过对比修复补丁我们发现,特征字符串为“file,”,在编译好的so文件中的rodata段中能搜索到字符串“file,”,证明此so版本为修复后的版本。具体的扫描代码如下:

test
command = '\.rodata'
cmd = "readelf -S %s | grep '\s%s'" % (file_path,command)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
ret,err = process.communicate()                  
rets = ret.lstrip().split(' ')
if len(rets) == 0:
    continue
r = []
for _a in rets:
if _a != "":
        r.append(_a)
if '.rodata' not in r:
continue
rodata_type = 0
if r[1] == '.rodata':
    rodata_type = 3
if r[2] == '.rodata':
    rodata_type = 4
if rodata_type != 0:
with open(file_path,'rb') as f:
        f.seek(int(r[rodata_type],16))
        data = f.read(int(r[rodata_type+2],16)).replace('\0','\n')
        if 'detect bitstream' in data:
            rr = data.split('\n')
            if 'file,' in rr:
                print ‘not vul’
            else:
                print ‘vul’

目前APPScan已经支持对ffmpeg漏洞的扫描。

0x7 市场APP状况

通过对appscan大数据中的124371款app扫描,发现受此漏洞影响的产品数量为6314款,占总数的5%。并对其中受影响的app所使用的ffmepg库文件做了个top10统计。



其中使用率最高的libeasemod_jni.so属于环信sdk所带的库文件,libcyberplay-core.so是百度开放云播放器的Android SDK。

通过深入研究发现,即使使用了低版本有漏洞的FFmpeg库文件,如果app业务功能中未涉及到HLS功能,将不会触发漏洞逻辑,避免了危害的发生。环信sdk就是这样的一种情况。

上图是受影响app分类top10。