多媒体安全注意事项
数据流图
该图展示了Qt Multimedia 中有助于安全处理不可信媒体源的高层数据处理元素。

假设
与 Qt 的其他部分一样,Qt Multimedia 假设其运行的环境已正确配置且未遭到破坏。特别是,进程环境、用于加载库和插件的搜索路径以及已安装的硬件解码驱动程序,均被假定由应用程序的部署者控制,而非由攻击者控制。 如《Qt 共享安全模型》所述,那些需要利用已存在安全漏洞的进程环境才能实施的攻击,不在 Qt 安全责任的范围之内。
该假设并不涵盖媒体内容本身。媒体数据及其引用的 URL 被视为不可信输入,本页后续内容将对此进行说明。另请参阅《处理不可信数据》。
因此,下文列出的某些要点并非因为Qt Multimedia 能够防御这些威胁,而是因为它们属于应用程序开发者的责任范围,且在应用程序部署时必须予以考虑。
风险
理论上,如果应用程序允许用户播放不受信任的媒体源,且攻击者知晓上图中所示的任何组件存在漏洞,则可能构造出能触发该漏洞的媒体源,并按预期方式将其提供给应用程序。
以下风险根据Qt 共享安全模型中定义的角色,按负责处理的主体进行分组。
由 Qt 处理的风险
- Qt Multimedia 随附的第三方库中的漏洞。Qt Multimedia 不会尝试遏制已受感染的第三方库,因此保持这些库最新是保护应用程序的关键。我们会跟踪针对我们随附库报告的漏洞,在补丁发布后及时更新,并将我们自身发现的缺陷上报给上游项目。
- Qt Multimedia 自身数据流组件中的缺陷可能导致未定义行为。最敏感的领域是原生和后端媒体帧的数据布局处理。我们遵循公认的安全编码规范,通过手动和自动化测试覆盖相关代码,并在内部对Qt Multimedia 进行模糊测试,以发现上述测试未能覆盖的缺陷。
由应用程序开发人员处理的风险
- Qt Multimedia 的若干 API 将 URL 作为源或目标,并代表应用程序执行文件系统或网络访问。这包括QMediaPlayer::setSource 、QAudioDecoder::setSource 、QSoundEffect::setSource 以及QMediaRecorder::setOutputLocation 。因此,向这些 API 传递未经验证的 URL,将使控制该 URL 的任何人能够决定读取或写入哪些文件,以及联系哪些主机。
- 对于 GStreamer 媒体后端,向QGStreamerVideoSource 或QMediaPlayer 传递恶意的自定义 GStreamer 管道描述会引发风险。我们强烈建议,除非您能够对 GStreamer 管道描述进行有效的预处理和验证,否则切勿通过Qt Multimedia 运行不受信任的 GStreamer 媒体管道。
- 只有当媒体后端的插件能够实际加载时,该后端才会被使用。FFmpeg 媒体后端会动态链接到 FFmpeg 库,因此如果这些二进制文件未随应用程序一起部署,或者在加载插件时动态链接器无法解析这些库,Qt Multimedia 会不作警告地回退到另一个可用的后端。 其余后端将按其插件的枚举顺序依次尝试,而非按照文档中规定的优先级顺序,因此部署错误可能会导致应用程序在从未经过测试的后端上运行。如果完全无法加载任何后端,则仅剩QMediaDevices 、QAudioDevice 、QSoundEffect 、QAudioSink 和QAudioSource 仍可正常工作。
取决于运行环境的风险
这些风险源于应用程序的运行环境,而非Qt Multimedia 本身,且Qt Multimedia 既无法检测也无法预防这些风险。应用程序开发人员在部署应用程序时需要对此予以考虑。
- 环境配置错误或硬件解码驱动程序设置不正确。请确保环境配置正确,且硬件解码驱动程序已正确安装并保持最新。
- Qt Multimedia 在运行时选择其媒体后端,并且可以按照“更改后端”中的说明,通过
QT_MEDIA_BACKEND环境变量覆盖该选择。 因此,任何能够影响应用程序进程环境的人,都可以使应用程序在与开发和测试时不同的媒体后端上运行,从而导致其支持的格式和协议集发生变化,攻击面也随之改变。
影响
利用上述问题可能会导致以下安全后果:
- 未定义的行为,实际上会导致内存泄漏、应用程序崩溃或卡死。
- 只要攻击者能够有效控制堆内存损坏,就可能实现远程代码执行。
- 对于
m3u等允许在播放列表条目中使用不同协议的媒体格式,错误的配置可能使攻击者能够读取文件系统或联系任意网络主机。默认情况下,潜在危险的协议会被列入禁止列表,但可通过以下任一方式更改此行为:- 环境配置。请参阅《配置FFmpeg 媒体后端的允许网络协议》。
- GStreamer 自定义管道。详情请参阅Qt Multimedia 的 GStreamer 后端说明(QGStreamerVideoSource )以及GStreamer 管道描述文档。
- Qt Multimedia 随附之外的其他媒体后端。媒体后端在运行时作为插件加载,因此,在应用程序的插件搜索路径中找到的后端插件,或在其库搜索路径中找到的已替换 FFmpeg 二进制文件,将应用其构建时设定的协议限制,而非上述默认设置。
请注意,根据媒体格式的不同,即使是有效的媒体源也不一定严格符合相关媒体标准。此外,媒体源还可能因多种原因而损坏或失效。尽管Qt Multimedia 及其第三方库各自的社区已对其进行了手动和自动测试,但我们无法保证能够正确处理每一个格式错误的媒体源。 在开发具有高级安全要求的应用程序时,请务必考虑这一限制。
缓解措施
- 将任何非应用程序自身生成的 URL 视为不可信输入,并在将其传递给Qt Multimedia 之前进行验证。建议采用允许的 URL 方案和主机的白名单,而非被拒绝项的黑名单。如果应用程序已经拥有媒体数据,或者能够自行获取,QMediaPlayer::setSourceDevice 可确保应用程序始终掌控数据的读取方式。
- 限制媒体后端允许使用的协议。关于 FFmpeg 媒体后端,请参阅《高级 FFmpeg 配置》中的“配置允许的网络协议”。
- 控制已部署应用程序能够使用的媒体后端。仅部署应用程序所需的媒体后端插件是此处的有效控制方式,因为这会让
QT_MEDIA_BACKEND没有其他插件可选。 请注意,仅更改默认后端并无实际作用:QT_MEDIA_BACKEND设置的后端优先级高于默认设置,甚至高于通过-default-media-backend配置选项(当Qt Multimedia 本身从源代码构建时)设定的默认值。 - 请在部署测试中确认应用程序确实能在预期的媒体后端上运行。
qt.multimedia.plugin日志类别会报告加载了哪个后端,以及在此之前哪些插件加载失败。 - 随Qt Online Installer 一起发布的Qt Multimedia 二进制文件动态链接了以下 FFmpeg 库:
avcodec、avutil、avformat、swscale以及swresample。因此,应用程序开发人员或最终用户可以部署自己构建的、与这些二进制文件兼容的库(即同一 FFmpeg 主版本的构建),从而在无需等待 Qt 补丁发布的情况下解决 FFmpeg 漏洞。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.