Qt 共享安全模型
Qt 共享安全模型定义了 Qt 应用程序开发者、作为 Qt 框架提供方的 Qt Group 和 Qt Project,以及运营商或设备制造商之间安全责任的分配。该模型针对典型 Qt 应用程序或设备中技术栈各层的安全责任,确立了明确的预期。
本页面为开发 Qt 应用程序的开发人员以及向 Qt 报告安全问题的安全研究人员提供了指导。
概述
Qt 应用程序的安全性属于共同责任。Qt 提供安全可靠的框架和库,但应用程序的最终安全性取决于开发人员如何使用这些组件,以及如何处理应用程序特有的安全问题。
一个典型的 Qt 应用程序可以被视作一个堆栈:
角色与职责
应用程序开发者的职责
作为应用程序开发者,您需对应用程序特有的代码、资源和配置的安全性负责。您还需对随应用程序一同发布的任何独立第三方库承担责任。
Qt 致力于提供用户友好且“默认安全”的 API。但是,您有责任谨慎使用该 API,例如检查错误情况并加以适当处理。有关使用 Qt 时的安全注意事项概述,请参阅《Qt 中的安全》。
请审查您的应用程序,区分哪些数据源是可信的,哪些是不可信的。务必使用适当的 Qt API 对不可信数据进行验证和净化。有关更多信息,请参阅《处理不可信数据》。
规划机制以更新应用程序,并及时应用 Qt 安全更新。请关注 Qt 的发布信息和安全公告,并据此更新 Qt。此外,请确保从可信来源获取 Qt。
此原则同样适用于您构建的项目。Qt 的开发工具运行在您的构建机器上,并将处理的项目视为可信输入,因此请仅从您信任的来源构建项目。有关更多信息,请参阅《安全使用 Qt 开发工具》。
如果您将 Qt 作为应用程序的一部分发布,请限制库和插件的数量以缩小攻击面。例如,仅发布您实际需要的图像格式插件。
在更改 Qt 默认设置时,请务必小心,避免意外禁用安全功能或削弱安全保障。例如,除非有充分理由,否则请勿禁用 SSL/TLS 证书验证。另一个例子是修改 Qt 搜索路径(例如通过qt.conf 文件),请确保所有路径均值得信赖。
Qt 的责任
Qt Group 和 Qt Project 负责 Qt 框架本身的安全性,包括所有官方分发的二进制文件和可再分发组件。这包括维护和更新与 Qt 库及插件捆绑的任何第三方组件、跟踪已知漏洞,并提供及时的修复程序。
Qt 致力于提供默认安全(secure by default)的 API。常见用例的设计旨在最大限度地降低误用的风险,而涉及安全影响的操作则需要开发者采取明确的行动。
Qt 提供了 API,供开发者处理和验证来自不可信来源的数据,例如用户输入、网络通信或外部文件。当开发者自行实现验证不合理时,Qt 会提供内置的验证功能。例如,Qt 的图像解码器就是为安全解析图像文件而设计的。 不过,也可能存在既无法实现又不可行的 API;在这些情况下,文档会警告开发者不要使用不可信数据调用该 API。
操作员或设备制造商的责任
Qt 和应用程序都必须依赖运行环境(硬件、操作系统和服务)的安全性和完整性。在桌面系统上,这通常是应用程序操作者的责任;例如,通过保持操作系统处于最新状态。在嵌入式设备上,这是设备制造商的责任。
这包括 Qt 应用程序运行的进程环境。例如,所有桌面应用程序都假定PATH 环境变量中的目录是可信的。
假设
Qt 的安全保证及下文所述的验收标准,基于对 Qt 应用程序运行环境的以下基本假设。若这些假设中的任何一项不成立,相关问题便超出了 Qt 网络安全风险评估所依据的预期用途和支持的使用条件范围,因此不被视为 Qt 中的漏洞。
- 攻击者尚未控制该设备或账户: Qt 不针对已实际控制或远程控制运行应用程序的设备,或控制其运行所用用户账户(例如被盗或解锁的设备、已开启的远程桌面会话,或遭入侵的账户)的攻击者进行防御,无论其能否直接访问应用程序进程本身。 判断标准在于攻击者是否最终获得了其原本不具备的权限、访问权限或信任关系。当无特权的本地攻击者获得了应用程序的权限,或通过植入应用程序读取位置的数据来影响应用程序时,即表示安全边界已被突破,该问题属于受理范围,即使该攻击是本地攻击。 另请参阅Qt 不接受的问题。
- 操作系统及其环境已正确配置:Qt 假设操作系统、其配置以及进程环境(例如
PATH和QT_PLUGIN_PATH变量)未被篡改或配置错误。参见《操作员或设备制造商的责任》。 - 暴露的硬件是正品:Qt 假设应用程序交互的硬件(外设、传感器或其他连接设备)是正品,且未被替换或遭受物理破坏。但这并不适用于此类硬件发送的数据:来自外部设备的输入属于不可信输入,且可通过其触及的缺陷仍属于本范围。 参见“处理不可信数据”。
安全问题受理标准
安全研究人员在确定是否应向 Qt 项目报告潜在安全问题时,应遵循以下准则:
Qt 接受的问题
Qt Group 和 Qt 项目接受符合以下条件的安全问题:
- 影响 Qt 框架代码:Qt 自身代码中的漏洞,包括内存损坏错误、类型混淆、释放后使用、缓冲区溢出以及 Qt 库中类似的内存安全问题。
- 影响捆绑的第三方组件:Qt 捆绑的第三方库和组件中的安全漏洞。
- 违反安全保证:Qt API 未能提供文档中规定的安全保证,或违反了对安全关键型 API 的合理安全预期的问题。
- 影响默认配置:Qt 默认配置中的安全问题,这些问题在无需开发者干预的情况下可能影响典型应用程序。
Qt 还要求安全问题必须具有现实的攻击场景。在实践中无法被利用或需要不切实际条件的缺陷将被视为缺陷,但不被视为安全问题。
Qt 不接受的问题
Qt 集团和 Qt 项目不接受以下类型的安全问题报告:
- 依赖不安全的应用程序代码:仅在应用程序开发者编写不安全代码,或以不符合文档或既定最佳实践的方式误用 Qt API 时才会显现的问题。
- 基于应用程序特定逻辑缺陷的:应用程序特定逻辑中的安全问题,例如身份验证绕过、授权缺陷或业务逻辑漏洞。
- 依赖恶意应用程序代码:需要应用程序执行恶意代码的问题。Qt 假定应用程序开发者能够控制自己的代码和资源。
- 需要恶意 QML/JavaScript: Qt Qml 假设所有 QML 和 JavaScript 代码均由应用程序开发者提供。不支持运行不可信的 QML 代码。有关更多信息,请参阅《处理不可信数据》。
- 依赖于运行环境中的问题:底层操作系统、硬件或系统库中的漏洞,这些组件未随 Qt 捆绑提供。
- 依赖不安全的进程环境:需要不安全进程环境的攻击(例如,
PATH或QT_PLUGIN_PATH环境变量中的不受信任目录),超出了 Qt 安全责任的范围。 - 依赖私有 Qt 头文件:使用私有头文件违背了 Qt 的设计初衷,且不属于受支持的配置。仅通过使用私有头文件才能触发的弱点,超出了 Qt 网络安全风险评估所依据的设计初衷和支持的使用条件,因此不被视为漏洞。 尽管如此,我们仍欢迎对此类弱点的报告,因为它们可能为提高 Qt 的健壮性提供改进机会。
- 不影响 Qt 的库、插件或工具:Qt 的自动测试以及用于构建和发布 Qt 的基础设施,不属于部署后产品的组成部分。 仅通过它们才能触及的缺陷在 Qt 中不被视为漏洞。随 Qt 一起提供的构建系统文件和工具属于评估范围;请参阅《安全使用 Qt 开发工具》。
- 仅影响示例代码:Qt 的示例旨在演示 API 的使用,不适用于生产环境。其中存在的缺陷将被视为缺陷而非漏洞,但我们仍欢迎相关报告,因为这些示例代码常会被复制到应用程序中。
此外,网络安全问题的报告需要包含一个现实的攻击场景,该场景需
- 跨越安全边界:当一个问题使攻击者获得了其原本不具备的权限、访问权限或信任时,即视为跨越了安全边界。例如,那些要求攻击者已经能够访问应用程序进程并能够执行代码的问题,不被视为安全问题,因为攻击者已经拥有了该访问权限。
- 不基于社会工程学:主要依赖社会工程学或欺骗用户,而非 Qt 中的技术漏洞的问题。
常见问题
谁负责验证用户输入?
应用程序开发者负责验证用户输入。虽然 Qt 提供了验证工具(参见QValidator 和Qt Qml 验证器),但应用程序有责任恰当使用这些工具,并实现特定于应用程序的验证逻辑。
Qt 是否对 SQL 注入漏洞负责?
不。SQL注入漏洞通常源于对SQL API的使用不当。开发者必须使用参数化查询和预编译语句(如QSqlQuery::prepare )来防止SQL注入。不过,Qt有责任确保这些安全API能够正确运行。
Qt 应用程序中的跨站脚本(XSS)问题如何处理?
防范 XSS 主要由应用程序开发者负责。开发人员在显示不可信内容时(尤其是在 Web 视图或富文本组件中),必须对数据进行适当的净化和转义。Qt 提供了诸如QString::toHtmlEscaped 之类的 API 来协助实现这一点,并且 Qt WebEngine 实现了 Web 平台的安全特性,但应用程序必须正确使用这些功能。
谁负责加密和安全通信?
Qt 和应用程序开发者共同承担责任:
- Qt Network 提供了具有安全默认设置的安全网络 API(QSslSocket 、QNetworkAccessManager )。
- 应用程序开发者必须正确使用这些 API,实现证书验证,安全管理密钥,并妥善处理敏感数据。如果他们将 OpenSSL 捆绑在应用程序中,则有责任保持其最新状态并应用安全补丁。
加载不受信任的 QML 代码是否存在安全问题?
运行不受信任的 QML 代码明确不受支持,且被视为对 QML 引擎的误用。 Qt Qml 的设计基于这样一个假设:所有 QML 和 JavaScript 代码都是可信的,且由应用程序开发者提供。如果您的应用程序需要加载不可信内容,请使用适当的沙箱机制或替代方案,例如自定义领域特定语言(DSL)。
图像文件的漏洞问题如何处理?
Qt 将图像解码视为一个安全关键的 API,并负责安全地解析来自不可信来源的图像文件。Qt 图像解码器中的安全问题(缓冲区溢出、崩溃及类似问题)应向 Qt Group 或 Qt Project 报告。 不过,应用程序仍需验证图像来源、妥善处理大尺寸图像,并管理应用程序特有的图像安全问题。
如何报告安全问题?
请参阅“Qt 中的安全性”页面中的“报告安全问题”,了解向 Qt 项目报告安全问题的详细说明。
哪些版本的 Qt 会收到安全更新?
安全更新仅针对受支持的 Qt 版本提供。有关受支持版本的信息,请参阅“Qt 发布版本”;关于已终止支持版本的“扩展安全维护”信息,请参阅相关页面。
其他资源
有关 Qt 安全性的更多信息,请参阅:
- Qt 中的安全性
- 处理不受信任的数据
- 应用程序权限
- QUIP 15Qt 项目安全政策
- Qt 产品已知漏洞列表
© 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.