Galaxy Lab

focus on information security

FFmpeg任意文件读取漏洞分析

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

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

0x01 漏洞描述

当攻击者构造含有恶意数据结构的AVI格式视频时,FFmpeg对于视频格式转换处理不当,按照嵌入其中的m3u8数据段进行本地资源获取并将其输出至视频中,从而导致本地非授权的文件泄露。

0x02 影响程度

攻击成本:  低

危害程度:  

影响范围:

FFmpeg2.x.x系列:2.8.12及以下

FFmpeg3.1.x系列:3.1.8及以下

FFmpeg3.2.x系列:3.2.5及以下

FFmpeg3.3.x系列:3.3.1及以下

一般流媒体协议分为两种,一种是通过HTTP渐进下载的(如HLS,flash渐进式),另一种则是RTSP形式的实时流媒体协议。

0x03 漏洞原理

HLS是Apple提出并推广的,全称为HTTP Live Streaming。它会把整个视频流分成多个小的,基于 HTTP 的文件来下载,每次下载一部分,并把视频流元数据存放于m3u8文件中。

m3u8本身并不是视频文件,它只会指定应该播放的视频资源,而真正播放的视频资源是下载下来的ts文件,可以把m3u8理解为一个配置文件,配置文件中指定了ts为播放文件,简单的m3u8如下:

这个资源也可以是远程资源:

而存在漏洞的FFmpeg中,此功能并没有对这些URI进行过滤,因此甚至可以改成file:///etc/passwd或是/dev/zero等,并且有漏洞的版本中都支持concat和file协议,因此使得这些资源可以顺利获取,从而导致了这些资源泄露的风险。

厂商多次对其进行了修复,先后关闭了concat等协议,对m3u文件进行校验等,但依然被安全人员找出新的利用方法。

0x04 漏洞利用

在AVI视频中,有一个数据块可以定义字幕,叫做GAB2,位于AVI header中。当m3u8格式的数据插入到GAB2数据块中时,FFmpeg依然会对包含#EXTM3U的部分进行HLS处理。

因此,根据漏洞原理,攻击者将想盗取的URI写入这个数据块中从而生成一个恶意的AVI。大致层次结构如下:

从POC代码中可以看出,由于单次访问目标文件获取到的内容不完整,为了获取完整的文件内容,还需要控制#EXT-X-BYTERANGE标签来设置偏移量,从而逐渐获得全部的内容。同时m3u8内的数据格式都为XBIN的数据格式,XBIN会根据将文件内容转化拼接为可设置长短帧数的视频。POC中用到的HLS标签如下:

#EXT-X-KEY:表示对这个媒体段的解码方式。格式如下:#EXT-X-KEY:<attribute-list>。其中attribute-list中可指定解码方式。

#EXTINF:表示每个媒体段所持续的时间,其格式如下:#EXTINF:<duration>,<title>。其中duration表示此段媒体所持续的时间,title表示这段的标题,可以不加。

#EXT-X-BYTERANGE:表示媒体段是一个媒体URI资源中的一段,只对其后的media URI有效,格式为:#EXT-X-BYTERANGE:<n>[@o]。其中n表示这个区间的大小,o表在URI中的偏移量offset。本POC中每段长度为64Byte,故偏移量也以此逐次增加64Byte。

将此AVI上传至视频网站,当网站服务端有漏洞的FFmpeg对此AVI视频进行处理时,便会根据这部分m3u8数据生成一个包含目标URI内容的视频。由此,攻击者查看自己上传的恶意AVI时,看到的却是包含目标URI的一段普通视频。

0x05 漏洞修复

服务器输入终端命令:ffmpeg –i 查看软件版本信息,若为可能存在漏洞的版本,则应当尽快升级至:

  • FFmpeg 2.x.x系列升级至2.8.12或以上;
  • FFmpeg 3.1.x系列升级至3.1.9或以上;
  • FFmpeg 3.2.x系列升级至3.2.6或以上;
  • FFmpeg 3.3.x系列升级至3.3.2或以上;

Android与IOS手机APP请自行尝试打开POC生成的AVI视频检验,若存在漏洞则用户酌情删除此APP,生产方应当使用无漏洞的FFmpeg版本进行APP开发。

如下图为使用字符串匹配检测到的一个使用FFmepg的某安卓APP,从图中可见其在小图预览阶段就已经将恶意AVI解析成目标文件的视频了。点开播放,正是要窃取的目标文件。目前可读的文件不仅仅为APP沙盒内的文件,实验中还成功读取了/sdcard目录、/etc目录下的文件(/sdcard/share.txt和/etc/thermald.xml,测试手机为华为荣耀6):