ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FFmpeg PixelSmash(CVE-2026-8461)漏洞实战:成因、PoC、检测脚本与供应链排查清单

FFmpeg PixelSmash(CVE-2026-8461)漏洞实战:成因、PoC、检测脚本与供应链排查清单 1. 漏洞事件全貌JFrog安全团队在FFmpeg MagicYUV解码器中挖到CVE-2026-8461代号PixelSmashCVSS 8.8类型为堆越界写入CWE-787。漏洞发布时间2026年6月FFmpeg在8.1.2版本合并修复代码。漏洞最核心的杀伤力不是单纯程序崩溃。恶意AVI、MKV、MOV文件送入解析流程服务端无需人工交互只要开启自动媒体扫描、缩略图生成就会触发解码。Jellyfin、Nextcloud这类平台默认开启对应能力上传文件后后台自动处理攻击者不需要登录后台只要上传恶意视频就能触发内存损坏。公开PoC仅能触发程序崩溃。完整RCE需要适配目标系统堆布局绕过glibc堆保护。JFrog团队在Ubuntu 22.04环境下针对Jellyfin、Nextcloud服务进程拿到稳定代码执行权限继承服务运行账号。很多人会把这个漏洞当成普通播放器漏洞。真正风险点在下游依赖链。大量项目直接打包FFmpeg二进制或是通过PyAV这类封装库调用解码器。产品发布时很少审计内置解码器开关MagicYUV默认启用很多厂商甚至不知道自己的程序包含这个解码器。Plex不受本次漏洞影响它维护独立解码器白名单不会加载MagicYUV。这一点在资产排查时可以直接用来快速筛免影响资产。2. MagicYUV编码基础看懂漏洞发生的底层载体MagicYUV是无损视频编码多用于后期制作、本地素材存储压缩率一般解码速度快。它支持YUV420、YUV422、YUV444多种色度采样格式。编码会把一整帧画面切分成多个切片slice。每一个slice独立编码解码器按切片顺序逐块解析像素数据。切片带有自身高度slice_height解码器读取这个值分配缓冲区再写入解码后的像素。色度子采样会拆分亮度平面Y和色度平面U、V。Y平面每个像素单独采样U、V平面会做降采样。YUV420里垂直方向每两行Y像素共用一行U、V色度数据。色度缓冲区行数等于原始帧高度除以2。FFmpeg MagicYUV解码器分配色度缓冲区时使用完整帧高度计算内存大小。解码单个切片写入数据时代码读取切片内可控slice_height向上取整计算色度平面写入行数。两套计算逻辑来源不同数值对不上这就是漏洞源头。普通合法MagicYUV文件切片高度对齐子采样因子两组计算结果一致不会出问题。攻击者构造畸形文件修改slice_height制造数值偏差。最后一个切片写入操作越过预先分配的堆缓冲区边界往缓冲区后方内存写入可控数据。单次溢出最多写入640字节。是否恶意MagicYUV视频文件FFmpeg MagicYUV解码器入口读取帧元数据分配Y/U/V堆缓冲区循环读取每个slice读取攻击者可控slice_height按slice_height向上取整计算U/V写入行数最后一个切片?计算行数 缓冲区预分配行数堆缓冲区越界写入正常写入缓冲区循环下一切片破坏缓冲区后方AVBuffer结构体内存释放时劫持回调函数指针RCE / 程序崩溃3. CVE-2026-8461根因逐行拆解第一性原理视角很多漏洞分析文章直接贴结论不会区分两处行数计算代码。我们直接看FFmpeg漏洞版本源码对比分配逻辑和解码切片逻辑。缓冲区分配代码处理色度平面// 分配U、V缓冲区基于完整帧高度intchroma_heightframe-heightsubsampled_vertical;buf_sizechroma_height*chroma_stride;bufferav_malloc(buf_size);这里subsampled_vertical代表垂直子采样系数YUV420等于1右移等价除以2。分配内存时参考整帧高度一次性算出色度平面总内存。切片解码写入代码// 单切片解码计算当前切片色度行数intslice_chroma_linesFFALIGN(slice_height,1subsampled_vertical)subsampled_vertical;FFALIGN做向上对齐对齐单位等于垂直子采样系数。攻击者控制slice_height让多个切片累加后切片对齐计算的总行数超过分配阶段算出的chroma_height。举个例子YUV420subsampled_vertical1对齐单位2。帧高度10分配chroma_height5行。构造两个切片slice_height依次设置为9、3。第一个切片slice_height9FFALIGN(9,2)10除以2得到5行色度数据写入。第二个切片slice_height3FFALIGN(3,2)4除以2得到2行色度数据写入。两个切片色度写入行数累加7行。但缓冲区只预留5行。第二个切片写入时直接超出缓冲区边界。漏洞核心不是整数溢出不是缓冲区分配过小。同一帧两套独立的行数计算规则没有交叉校验。分配内存时用全局帧参数写入切片时用切片内参数代码没有校验所有切片累加后的色度写入行数不能超过缓冲区容量。攻击者只需要修改文件内slice_height字段构造一组切片序列让累加后的色度写入行数超过预分配缓冲区大小。溢出发生在最后切片的U/V平面写入循环。写入数据来自视频文件内容可控。官方修复代码只有7行逻辑很简单增加校验每一个slice_height必须是垂直子采样因子的整数倍。畸形slice_height直接返回错误终止解码流程。合法MagicYUV文件切片高度天然对齐校验不会影响正常播放。// 官方修复新增校验if(slice_height((1subsampled_vertical)-1)){returnAVERROR_INVALIDDATA;}只要slice_height不能被子采样系数整除直接拒绝解析。从源头切断两套计算逻辑产生差值的可能性。4. 漏洞触发流程与内存破坏过程av_malloc申请堆内存Y、U、V三个缓冲区在堆上连续或临近分布。U/V缓冲区后面紧跟着AVBuffer结构体这个结构体记录缓冲区大小、引用计数、释放回调函数pointer。越界写入的可控字节覆盖AVBuffer内部的回调指针与回调参数。程序后续执行av_buffer_unref触发内存释放逻辑。代码读取被篡改的函数指针跳转到攻击者指定地址执行。现代Linux系统默认开启ASLR、CFI、glibc堆保护。单纯覆盖指针大概率触发堆检查进程直接abort。JFrog团队的稳定利用需要调整堆布局在释放前规避堆元检测。这个过程高度依赖系统版本、libc版本、进程内存布局不具备跨环境通用能力。大部分环境下恶意样本只会触发崩溃glibc报corrupted top size或者chunk header损坏。运维很容易把崩溃当成普通视频解析异常不会联想到漏洞。Jellyfin场景下部分堆损坏不会立刻崩溃进程继续运行属于静默内存破坏日志几乎没有提示。这种场景风险更高攻击者可以多次尝试堆布局等待合适时机触发执行。AttackerPayloadLinuxHeapFFmpegMediaServerAttackerAttackerPayloadLinuxHeapFFmpegMediaServerAttacker上传恶意MagicYUV视频调用avformat_open_input自动生成缩略图解析码流读取帧信息分配YUV堆缓冲区循环读取slice读取可控slice_height逐切片写入色度平面数据最后切片越界写入覆盖AVBuffer元数据内存写入完成无即时报错解码结束调用av_buffer_unref释放缓冲区读取被篡改的free回调指针跳转执行恶意代码5. 影响范围梳理不止FFmpeg本体整条媒体处理供应链FFmpeg版本判定标准版本号小于8.1.2并且编译时开启MagicYUV解码器CONFIG_MAGICYUV_DECODER。很多发行源自带FFmpeg不会单独关闭这个解码器。Debian、Ubuntu官方源旧版本包默认启用MagicYUV。受影响业务组件清单Jellyfin自动扫描媒体库后台自动解码零交互触发高危。Nextcloud开启视频预览缩略图访问文件列表触发解码。mpv播放器打开恶意文件触发需要用户手动打开文件。OBS导入MagicYUV素材触发。Immich相册服务自动生成媒体缩略图。各类NAS系统内置媒体转码模块。PyAV、ffmpeg-python等FFmpeg绑定库封装调用原生解码器。桌面系统缩略图生成器文件管理器预览视频自动解码。排除资产Plex解码器白名单不加载MagicYUV。编译时使用--disable-decodermagicyuv的FFmpeg。8.1.2及更新版本FFmpeg。这里要做对抗式审查很多厂商不会直接对外暴露FFmpeg版本号。产品可能静态链接FFmpeg打包二进制。版本号命令ffmpeg -version输出的信息不一定可信厂商可以修改版本字符串。资产判定不能只依赖版本号要同时检测解码器是否编译启用。静态链接场景运维经常踩坑。容器镜像内置FFmpeg二进制业务代码调用容器内程序主机系统FFmpeg版本和容器内完全独立。扫描主机版本无法发现容器内风险组件。云转码平台、AI视频处理服务大量使用容器是高危区域。6. 本地复现实操编译旧版FFmpeg、构造畸形样本、捕获崩溃仅在隔离虚拟机、授权测试环境操作禁止对外暴露样本。6.1 编译存在漏洞的FFmpeg虚拟机环境Ubuntu 22.04安装编译依赖aptupdateaptinstallbuild-essential yasm nasm pkgconfiggitgdb拉取FFmpeg源码切换到漏洞版本gitclone[https://git.ffmpeg.org/ffmpeg.git](https://git.ffmpeg.org/ffmpeg.git)cdffmpeggitcheckout n8.1.1# 编译开启MagicYUV解码器默认开启./configure --enable-decodermagicyuvmake-j$(nproc)编译完成当前目录./ffmpeg为带漏洞二进制。6.2 样本构造思路合法MagicYUV AVI文件使用工具修改slice_height字段。可以用Python脚本直接修改二进制文件内slice高度值构造不合法切片。原始样本可以用ffmpeg生成基础MagicYUV文件./ffmpeg-flavfi-itestsrcduration1:size128x100:rate10-c:vmagicyuv test.avi用二进制编辑脚本修改文件内slice高度制造两组行数计算不一致。修改完成得到poc.avi。6.3 捕获崩溃使用gdb调试运行gdb--args./ffmpeg-ipoc.avi-fnull -触发漏洞时gdb捕获堆损坏glibc抛出内存错误。对抗审查点部分环境下不会直接崩溃堆损坏延后触发。不能只靠ffmpeg命令返回码判断漏洞存在需要捕获av_buffer_unref阶段的内存异常。7. 漏洞检测脚本完整可复制脚本功能检测系统FFmpeg二进制读取解码器配置判断是否启用MagicYUV。检测版本号作为辅助判断依据。批量遍历目录内所有ffmpeg、ffprobe二进制支持容器内执行。不执行恶意样本仅做静态检测无崩溃风险。#!/usr/bin/env python3# CVE-2026-8461 静态资产检测脚本# 仅静态检测不解析恶意视频无内存破坏风险importsubprocessimportreimportsysfrompathlibimportPathdefrun_cmd(cmd):try:retsubprocess.run(cmd,capture_outputTrue,textTrue,timeout10)returnret.stdout,ret.stderr,ret.returncodeexceptExceptionase:return,str(e),-1defcheck_ffmpeg_binary(bin_path):print(f\n[] 检测二进制:{bin_path})stdout,stderr,rcrun_cmd([bin_path,-version])ifrc!0:print(f[-] 无法执行{bin_path})returnFalse# 获取版本ver_matchre.search(rffmpeg version (\d\.\d\.\d),stdout)version_strver_match.group(1)ifver_matchelseunknownprint(f版本:{version_str})# 检测MagicYUV解码器是否启用dec_out,_,_run_cmd([bin_path,-decoders])has_magicyuvmagicyuvindec_out.lower()print(fMagicYUV解码器启用:{has_magicyuv})vulnerableFalseifhas_magicyuv:ifversion_str!unknown:major,minor,patchmap(int,version_str.split(.))# 判断是否小于8.1.2if(major8)or(major8andminor1)or(major8andminor1andpatch2):vulnerableTrueelse:# 版本无法识别但解码器开启标记待人工复核print([!] 版本无法解析MagicYUV开启需要人工复核)ifvulnerable:print([!] 该二进制存在CVE-2026-8461风险)else:print([OK] 无风险或已修复)returnvulnerabledefscan_path(path):pPath(path)candidateslist(p.rglob(ffmpeg))list(p.rglob(ffprobe))forbinfileincandidates:ifbinfile.is_file()andos.access(binfile,os.X_OK):check_ffmpeg_binary(str(binfile))if__name____main__:importosiflen(sys.argv)2:print(用法: python3 check_pixelsmash.py /扫描根目录)print(示例: python3 check_pixelsmash.py /usr/bin)sys.exit(1)scan_path(sys.argv[1])保存为check_pixelsmash.py执行chmodx check_pixelsmash.py python3 check_pixelsmash.py /usr/bin对抗式审查脚本依赖ffmpeg -version和ffmpeg -decoders输出。如果厂商修改二进制输出字符串脚本会误判。静态链接场景脚本只能识别磁盘上独立ffmpeg二进制无法检测嵌入其他程序内的静态libavcodec。静态链接资产需要用readelf扫描程序内字符串查找magicyuv相关符号。附加静态二进制符号检测单行命令用于静态链接程序readelf-starget_binary|grep-imagicyuv输出存在匹配符号说明编译包含MagicYUV解码器。8. 加固方案含无法升级场景下的补丁与编译参数优先方案升级FFmpeg至8.1.2或更高版本。业务不能升级的备选方案方案A编译时关闭MagicYUV解码器。编译配置参数增加./configure --disable-decodermagicyuv方案B手动打官方单行校验补丁。找到libavcodec/magicyuvdec.c在切片解析逻辑前加入slice_height对齐校验代码。intvsubav_pix_fmt_desc_get(avctx-pix_fmt)-log2_chroma_h;if(slice_height((1vsub)-1)){returnAVERROR_INVALIDDATA;}重编译libavcodec。业务侧防护用户上传视频前置文件格式校验阻断MagicYUV类型文件。但这种方式容易绕过攻击者修改文件头伪装成其他格式。不建议作为唯一防御手段。媒体转码任务放到隔离沙箱、容器内运行限制容器权限使用低权限账号执行解码。即使漏洞被利用缩小攻击面。监控进程异常崩溃、堆内存错误日志做告警。对抗审查文件头校验可绕过。攻击者修改MagicYUV码流封装把MagicYUV码流塞进其他容器文件头不再标记magicyuv。单纯检查文件后缀、容器元数据防御会失效。9. 对抗式审查防御侧盲区与绕过可能性很多团队做完版本升级就认为漏洞处理完成。这里列出容易忽略的盲区。第一多份FFmpeg二进制共存。服务器主机、容器、应用内置静态库三份独立FFmpeg只更新主机上的二进制容器内版本依旧老旧。漏洞保留。第二解码器动态加载。部分打包方案外部单独存放libavcodec.so主程序动态加载so文件。升级主程序so库文件没有替换漏洞持续存在。第三WAF、上传网关检测。WAF识别恶意样本特征码。攻击者可以微调文件内非关键字节破坏特征绕过WAF检测。基于静态特征的上传检测防护能力弱。第四沙箱逃逸风险。就算转码在容器内容器配置不当挂载主机目录、开启特权权限RCE拿到容器权限之后横向移动到宿主机。第五第三方组件调用链。业务代码不直接调用ffmpeg使用第三方图片视频处理SDKSDK内部打包libavcodec。运维扫描不会检查SDK内部依赖。防御优先级排序源码层面禁用解码器 升级版本 沙箱隔离 上传检测。上传检测只能作为辅助不能当主防御。10. 运维巡检清单批量扫描业务资产扫描所有服务器、NAS、容器镜像查找ffmpeg、ffprobe二进制文件。扫描业务程序、SDK、Python包PyAV检查是否静态链接libavcodec。读取解码器列表确认MagicYUV是否启用。梳理业务是否处理外部用户上传视频。确认媒体处理进程运行账号权限禁止root执行转码。检查缩略图、自动媒体扫描功能是否开启。Jellyfin、Nextcloud这类服务默认开启高危能力。确认日志系统是否采集进程崩溃、glibc堆错误日志配置告警。容器镜像更新流水线增加依赖组件安全扫描步骤。批量容器镜像扫描思路导出镜像文件在镜像文件内搜索libavcodec和magicyuv符号。CI阶段加入检测阻止带漏洞组件的镜像发布。11. 漏洞事件带来的媒体组件安全启示很多开发团队看待FFmpeg只是一个开箱即用媒体工具。他们不会意识到解码器数量众多每一个小众解码器都可能携带内存漏洞。MagicYUV属于小众无损编码日常业务很少用到默认开启成为攻击入口。软件供应链漏洞的典型特征上游组件漏洞下游厂商感知滞后。厂商集成FFmpeg很少审计每一个解码器开关。默认启用全部解码器把攻击面拉满。安全设计上解码器应该遵循最小可用原则。只保留业务必须的解码器其余全部编译关闭。而不是默认开启全部解码器。这个习惯在音视频项目里普及率很低。很多媒体服务的高危点是后台自动解析用户文件。上传文件后后台静默解码不需要用户交互。这类异步处理任务是RCE漏洞的最佳攻击面。文件上传功能不能把校验放在前端不能只依赖文件名校验。漏洞修复成本极低7行代码就能堵住问题。但漏洞发现、排查、全链路资产梳理成本极高。根源是软件默认配置扩大攻击面。互动提问你们业务里是否存在静态链接FFmpeg的程序这类资产在漏洞爆发时你们是怎么做批量识别的你觉得音视频组件安全审计优先扫描解码器列表还是版本号为什么
返回列表