Tauri 1.3.0 发布公告
Tauri 团队很高兴地宣布 1.3 版本发布。此版本包括安全改进、新功能和重要的错误修复。
升级
请务必将 NPM 和 Cargo 依赖项更新到 1.3.0 版本。您可以使用以下命令更新依赖项
npm install @tauri-apps/cli@latest @tauri-apps/api@latest
yarn upgrade @tauri-apps/cli @tauri-apps/api --latest
pnpm update @tauri-apps/cli @tauri-apps/api --latest
cargo update
1.3.0 版本的新增功能
NSIS
Tauri CLI 现在可以使用 NSIS 创建 Windows 应用程序安装程序。这个新的捆绑目标在 macOS 和 Linux 上也作为实验性功能提供,因此您可以交叉编译 Windows 安装程序。有关后者的文档将很快发布。
Tauri 1.3 审核
内部审核由 @tweidinger 和 @chippers 执行,他们参与了 Tauri 项目中的大多数安全主题。审核是在 CrabNebula 的付费时间内进行的,我们很感激能够花费部分工作时间为开源项目做出贡献,并使其成为更安全的环境 :heart:。
我们手动审核了超过 45 个 PR。一些 PR(例如 #5544)引导我们深入研究非常古老的 RFC (RFC6068 和 RFC3966)、NSIS 文档(例如 #6039)和许多其他外部资源。我们将问题、注释和发现记录在 markdown 文件中,并将这些注释与负责的开发人员共享,以确保进行适当的修复。
以下小节总结了从安全角度来看的更改和审核结果。
外部 API 访问 #5918
这是我们调查过的影响最大且耗时最长的 PR。此 PR 引入了一种简化的方式,供应用程序允许外部域访问 Tauri IPC 层1,并且该用法主要影响 Tauri 应用程序的安全模型。安全影响2 取决于功能的暴露3、启用的 Tauri 命令和攻击者的能力4。
我们将此新功能视为驾驶一辆未启用任何安全功能的超快速赛车,并敦促开发人员非常非常仔细地考虑他们是否真的需要这种暴露。
在此添加合并之前,应用程序开发人员(滥)用了一个半公开的漏洞来达到相同的功能。为了使整个社区意识到这种风险,我们发布了一个 安全公告 以提醒注意。如果应用程序允许用户导航到任意域或存在开放重定向漏洞5,则会受到影响。如果您实现了这样的功能,您应该尽快更新到 1.3 版本。
最初的 PR 更改允许通配符 (https://*
) 和 glob 模式,我们认为这些模式很有用,但不应向所有 Tauri 开发人员公开。我们得出的结论是,过度暴露的风险(例如允许列表切换以启用所有 Tauri API 端点)不能证明这种宽松的暴露是合理的。最终实现允许配置指定的(子)域6(例如:example.com
)以获得对 Tauri IPC 的远程访问。
少数需要通配符甚至进一步暴露的边缘用例可以通过自定义 Rust 代码来实现,该代码能够动态修改 IPC 访问。我们现在以类似于 fs
或 http
作用域的方式公开此远程 IPC 作用域。
假设 https://trusted.example
上有一个完全受信任的 Web 服务,现在可以配置安全作用域以允许某些窗口甚至插件访问自定义实现的命令以及可选的内置 Tauri API
"security": { "dangerousRemoteUrlIpcAccess": [ { "windows": ["main", "settings"], "domain": "trusted.example", "plugins": ["trusted-plugin"], "enableTauriAPI": false }, ],}
在任何情况下都不得将共享域用于此目的。我们不限制对路径或特定文件的访问。您只能使用受信任的(子)域6 来限定作用域。另一个非常冒险的陷阱是,开发人员必须确保域所有权在应用程序的生命周期内不会发生变化。域接管可能导致用户设备受到威胁。
浏览器参数 #5799
由于某些 Webview 功能未启用或无法访问,社区贡献引入了向 Webview 进程添加其他参数的可能性,该进程是在新窗口中创建的。
此功能在 window
端点中暴露给前端。我们发现这种暴露风险很高,因为大多数 Webview 都有非常重要的功能和标志,可以通过进程参数来允许。
以下所有威胁模型假设都基于 Tauri 窗口创建在 tauri.conf
的 allowlist
中被允许,因此暴露给前端。此 PR 仅影响 Windows,因此对其他支持的操作系统没有影响。
有能力创建窗口并将命令行参数传递给 Webview 的攻击者可以提升其权限,从而逃脱 Tauri 和 Webview 的严格沙盒。
这些标志允许启用几个危险的 Webview 功能,从加载当前默认配置文件文件夹之外的配置文件(从设备窃取浏览器会话)到禁用 Webview 的安全措施(例如:证书验证、沙盒、webdriver/headless 模式、设备管理端点等)。
我们在 https://peter.sh/experiments/chromium-command-line-switches/ 找到了一个古老但宝贵的且仍然独特的文档参考,这帮助我们了解了 Windows 上可能存在的风险,因为 Webview2 使用相同的标志。
然后,该功能被更改为仅在 Rust 端公开。Tauri 应用程序开发人员可以使用它来实现自定义命令,以使用特定用例参数调用 Webview 窗口。
可能的 ZipSlip #4674
我们发现,用于提取远程捆绑器文件(如 Webview2 安装程序)的组件正在使用 extract_zip
函数手动提取单个文件,该函数使用 ZipFile::name()
而不是文档中推荐的 ZipFile::enclosed_name()
。名称类似于 ../../../../foo.sh
的文件可能会在文件系统上提取到预期目录之外。这种漏洞称为 ZipSlip。
由于该函数仅用于经过验证和受信任的文件,因此此处的影响几乎为零。尽管如此,我们还是更改了实现以方便正确的提取方法。
捆绑器强化 #6039
捆绑器未转义传递给 handlebars::Handlebars::render()
的内容,这可能会在捆绑器阶段导致意外的代码执行。这也是一个低影响问题,但已迅速修复。
其他更改
新功能
- 创建窗口时的
additional_browser_args
选项 #5799 - 添加
is_minimized()
窗口方法。 #5618 - 添加窗口上的
title
getter。 #5515 - 内容保护 API #5513
- 添加了
Builder::device_event_filter
和App::set_device_event_filter
方法。 #5562 - 添加
WindowsAttributes::app_manifest
以在 Windows 上指定应用程序清单。 #5730 - 添加对 Cargo 工作区继承的支持。 #5775 #6144
- 添加了窗口的
url()
getter。 #5914 - 添加了
Window::on_navigation
。 #5686 - 允许设置对话框按钮的文本。 #4383
- 为 Windows 和 macOS 实现
SystemTray::with_tooltip
和SystemTrayHandle::set_tooltip
。 #5938 - 为
tauri.bundle.macOS.frameworks
添加 dylib 支持。 #5732
增强
- 在 Windows 上,
msi
安装程序的启动应用
复选框默认情况下将被选中。 #5871 - 为
icon
命令添加--png
选项以生成自定义图标尺寸。 #5246 - 在 Windows 上,根据窗口主题更改 Webview 主题,以获得更准确的
prefers-color-scheme
支持。 #5874 - 从 Cargo.toml 模板中删除默认功能。 #6074
- 向
WindowBuilder
结构添加一个方法,以从 tauri.conf.json 配置重新创建窗口。#6073 - 改进找不到
rustc
时的错误消息。 #6021 - 为
.msi
捆绑目标添加了对预发布标识符和构建号的支持。每个只能使用一个,并且必须仅为数字。版本仍然必须根据 https://semver.org/ 兼容 semver。 #6096 - 在
signer generate
命令中添加--ci
标志并遵守CI
环境变量。在这种情况下,默认密码将为空字符串,CLI 将不会提示输入值。 #6097 - 当
TAURI_KEY_PASSWORD
环境变量为空且提供了--ci
参数或设置了CI
环境变量时,跳过 build 命令上的密码提示。 d4f89af18d69fd95a4d8a1ede8442547c6a6d0ee
修复
- 修复在没有
Cargo.lock
文件的新创建的项目上解析 crates 版本时tauri info
崩溃的问题。 #5873 - 修复构建
productName
中带有 unicode 字符的应用的问题。 #5872 - 跨所有窗口同步
__TAURI_METADATA__.__windows
。 #5615 - 修复在顶部调整大小区域双击自定义标题栏时调整大小的故障。 #5966
- 禁用 Linux 上的光标鼠标事件。 #6025
- 修复在
invoke
中使用时 jsMap
的序列化。 #6099
脚注
-
进程间通信,在本例中是 Tauri 核心和在 Webview 中运行的前端代码之间的通信。 ↩
-
安全影响:这种威胁组合的理论最大影响是什么?这在很大程度上取决于 Tauri API 端点的正确作用域和自定义实现的 Tauri 命令的强化。 ↩
-
暴露:描述了此功能的暴露范围项,无论是对用户还是攻击者。可以将暴露限制为仅某些域、窗口或仅自定义实现的命令。 ↩
-
攻击者能力:攻击者拥有哪种权限?范围可以从欺骗用户输入恶意输入到通过跨站脚本 (cross-site-scripting) 在前端执行代码(在我们的例子中,这是前端代码的最高权限)。常见的功能在 OWASP 文档中描述。 ↩
-
请参阅 Reqwest 参考 ↩ ↩2
© 2025 Tauri 贡献者。CC-BY / MIT