神刀安全网

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

作者: 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文件的格式:

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

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

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

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

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

0x4 漏洞危害

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

0x5 漏洞修复

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

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

如果有使用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统计。

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

其中使用率最高的libeasemod_jni.so属于环信sdk所带的库文件,libcyberplay-core.so是某开放云 播放器的Android SDK 。受影响app行业分类top10如下,其中通讯社交类应用受影响最大!

FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

本文由 360安全播报 原创发布,如需转载请注明来源及本文地址。本文地址:http://bobao.360.cn/learning/detail/2879.html

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » FFmpeg远程文件窃取漏洞 – 移动端安全分析报告

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址