2016-05-23 19:02:36
来源:360安全播报 作者:360安全卫士
阅读:337次
点赞(0)
收藏
分享到:
作者: 360NirvanTeam & 360VulpeckerTeam
0x1 漏洞起源
FFmpeg 远程文件窃取漏洞最初来源是国外的漏洞平台,去年已在CTF比赛中被使用。官方今年一月份发布修复版本并公布了该漏洞编号CVE-2016-1897/CVE-2016-1898。在今年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 漏洞检测
首先检查APP是否使用了FFmpeg,可以针对可疑的库文件和可执行文件,扫描特征字符串“detect bitstream specification deviations”。若存在特征字符串,说明使用了FFmpeg,继续后续检测。反之则没有使用FFmpeg。例如如下strings结果,说明使用了FFmpeg。
$ strings 360HomeGuard_NoPods | grep "detect bitstream"
detect bitstream specification deviations
detect bitstream specification deviations
检测是否修复CVE-2016-1897/CVE-2016-1898有两种检测方案,可以基于扫描特征字符串。
方案一可检测基于官方源码包编译的FFmpeg,判断其版本是否高于2.8.5。通过对2.8.4以及2.8.5源码的diff,在2.8.5以上的版本的libavformat库中,存在特征字符串“Invalid frame rate %f”。
$ grep "Invalid frame rate" -r ffmpeg-2.8.4
ffmpeg-2.8.4/libavformat/ivfdec.c: av_log(s, AV_LOG_ERROR, "Invalid frame rate\n");
$ grep "Invalid frame rate" -r ffmpeg-2.8.5
ffmpeg-2.8.5/libavformat/ivfdec.c: av_log(s, AV_LOG_ERROR, "Invalid frame rate\n");
ffmpeg-2.8.5/libavformat/nuv.c: av_log(s, AV_LOG_ERROR, "Invalid frame rate %f\n", fps);
ffmpeg-2.8.5/libavformat/nuv.c: av_log(s, AV_LOG_WARNING, "Invalid frame rate %f, setting to 0.\n", fps);
iOS上的FFmpeg可能是以静态库的形式链接到App的可执行文件中。因此可以通过strings可执行文件,并查找特征字符串的方法判断FFmpeg的版本。例如下述strings结果,说明使用了2.8.5以上的FFmpeg。
$ strings ffmpegDemo | grep "Invalid frame rate"
Invalid frame rate
Invalid frame rate %f
Invalid frame rate %f, setting to 0.
方案二检测对于CVE-2016-1897/CVE-2016-1898的源码patch。
官方修复CVE-2016-1897/CVE-2016-1897漏洞时,引入了字符串“file,”。通过检测这
个字符串,可以检测当前App是否修复漏洞。
$ strings ffmpegDemo | egrep --color "^file,\$"
file,
0x7 市场APP安全状况调查
通过对国内主流应用市场124371款全行业app进行抽样扫描,发现受此漏洞影响的产品数量为6314款,占总数的5%。并对其中受影响的app所使用的ffmepg库文件做了个top10统计。
其中使用率最高的libeasemod_jni.so属于环信sdk所带的库文件,libcyberplay-core.so是某开放云播放器的Android SDK。受影响app行业分类top10如下,其中通讯社交类应用受影响最大!
本文由 360安全播报 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/2879.html