本页内容

安全使用 Qt 开发工具

关于安全运行 Qt 开发工具的建议。

概述

Qt 框架提供了一套用于开发 Qt 应用程序的全面工具:构建系统前端(如qmake和qt-cmake);编译器和生成器(如Meta-Object Compiler (moc)、User Interface Compiler (uic)、Resource Compiler (rcc)、Qt Shader Baker (qsb),以及用于接口描述的代码生成器,例如Qt Remote Objects 编译器 (repc) 或Qt D-Bus XML 编译器 (qdbusxml2cpp); QML 工具,例如qmllint和QML 类型编译器;资源导入工具;以及部署工具,例如windeployqt、macdeployqt 和androiddeployqt。完整列表请参阅“工具和实用程序”。

大多数工具是命令行工具,用于将输入文件转换为输出文件,并作为项目构建系统的一部分执行。其他工具则在后台运行,例如在 IDE 中提供代码补全或语法检查功能。

本页面阐述了所提供的开发工具的安全模型,以及如何安全地使用它们。这是Qt 共享安全模型的一部分,该模型描述了应用程序开发人员、Qt 以及运营商或设备制造商之间如何分担安全责任。

开发工具的安全模型

这些工具旨在高效处理复杂的输入文件。虽然它们会对输入进行一般性有效性检查,但并未设计用于防范或处理恶意构造的输入。因此,默认假设输入是可信的。

根据Qt 共享安全模型,开发工具及其处理的项目完全属于开发者的责任范围。Qt 负责其发布的工具的完整性;而您仅需确保向这些工具提供可信的输入。

为何这很重要

由于这些工具在处理输入时不会将其视为恶意,因此即使在开发、配置或构建阶段——甚至在生成的应用程序尚未运行之前——恶意或格式错误的项目就可能造成危害。

特别是,这些工具会:

  • 读取文件。构建系统可能会通过绝对路径或相对路径(路径遍历)读取项目目录外的文件。
  • 写入文件。输出路径由输入决定。这可能导致文件被写入预定输出目录之外,或导致现有文件被覆盖。
  • 调用外部进程。构建前端和某些生成器会启动编译器、脚本或其他可执行文件。不可信的输入可能会影响运行哪些程序以及使用哪些参数。
  • 生成后续将被编译和执行的代码。许多工具会生成 C++、Qml 或其他源文件,这些文件将成为应用程序的一部分。经过精心构造的输入可能会影响生成的输出,从而影响最终进入 Qt 应用程序或设备中的代码。

实际后果是:构建不可信项目可能会导致在您的构建机器上以您的权限执行任意代码,并访问该环境中的任何内容,例如凭据、签名密钥或源代码。这可能会泄露您的私人数据、危及您的机器,并最终危及您正在构建的应用程序或设备,从而危及所有用户。

这种风险并非仅由 Qt 工具引起。 当您使用 CMake(一种流行的 C++ 构建系统)配置项目时,您允许该项目在任意路径上运行本地程序(execute_process() ),或在未经进一步检查的情况下获取网络资源(FetchContent 模块)。这也是为什么集成开发环境(IDE)有时会在配置项目前发出警告,例如 Visual Studio Code的“工作区信任”功能。

建议

  • 仅打开并构建您信任的项目。切勿配置或构建来自未知或不可信来源的项目,这与您不会运行来源不明的脚本是一样的道理。
  • 隔离不受信任的构建。若必须处理某个您无法完全信任的项目,请在隔离环境(如容器或虚拟机)中进行。以最低权限运行构建,并确保其无法访问机密信息、凭据或签名密钥。
  • 在构建期间限制网络访问。尽量确保构建完全在本地进行。如果项目在构建时需要访问远程资源,这不仅可能因可用性问题引发故障(例如,若构建机向远程服务器发出过多请求,可能会被该服务器封锁),还会成为破坏构建环境和构建结果的另一个攻击途径。
  • 从可信来源获取 Qt。仅通过官方渠道安装 Qt 及其工具,并保持其最新状态以获取安全修复程序。请参阅《Qt 中的安全性》。
  • 保持构建环境的可信性。例如,请确保PATH 中的目录及其所解析的工具均值得信赖,以免开发工具调用意外的可执行文件。

范围

本页面涵盖在您自己的机器上运行的构建时开发工具。Qt 框架还提供具有不同威胁模型的工具:

  • 用户可能在终端用户系统上安装和运行的面向用户的工具,例如 Qt Linguist, Qt Widgets Designer 以及 Qt Assistant。有关这些工具的安全指南,请参阅相应的手册页。
  • 由库或其他工具间接调用的辅助工具。由于该工具及其调用机制均属于攻击面的一部分,因此需要特别关注。

有关在运行时处理来自不可信来源的数据的一般指导,请参阅《处理不可信数据》。

© 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.