跳到内容
Tauri

Tauri 1.3.0 发布公告

Tauri 1.3 Launch Hero Image

Tauri 团队很高兴地宣布 1.3 版本发布。此版本包含安全改进、新功能和重要的错误修复。

请确保将 NPM 和 Cargo 依赖项更新到 1.3.0 版本。您可以使用以下命令更新依赖项:

npm install @tauri-apps/cli@latest @tauri-apps/api@latest

Tauri CLI 现在可以使用 NSIS 创建 Windows 应用程序安装程序。此新捆绑目标也可在 macOS 和 Linux 上作为实验性功能使用,因此您可以交叉编译 Windows 安装程序。有关后者的文档将很快发布。

内部审计由 @tweidinger@chippers 执行,他们参与了 Tauri 项目的大多数安全主题。审计是在 CrabNebula 的带薪时间内进行的,我们非常感谢能够利用部分工作时间为开源项目做贡献,并使其成为一个更安全的环境 :heart:。

我们手动审计了 45 多个 PR。一些 PR(例如 #5544)让我们深入研究了非常老的 RFC(RFC6068RFC3966)、NSIS 文档(例如 #6039)以及许多其他外部资源。我们以 markdown 文件的形式记录了问题、笔记和发现,并与负责的开发人员共享这些笔记,以确保适当的修复。

审计结果和安全角度的变化总结在以下小节中。

这是我们调查过的影响最大、耗时最长的 PR。此 PR 引入了一种简化应用程序允许外部域访问 Tauri IPC 层1 的方式,其使用情况主要影响 Tauri 应用程序的安全模型。安全影响2 取决于功能的暴露程度3、启用的 Tauri 命令以及攻击者4 的能力。

我们认为这项新功能类似于驾驶一辆没有启用任何安全功能的非常快的赛车,并敦促开发人员非常非常仔细地考虑他们是否真的需要这种暴露。

在此添加被合并之前,应用程序开发人员(滥)用了一个半已知的漏洞来实现相同的功能。为了让整个社区意识到此风险,我们发布了一份安全公告以提前提醒。如果应用程序允许用户导航到任意域或存在开放重定向漏洞5,则会受到影响。如果您实现此类功能,应尽快更新到 1.3 版本。

最初的 PR 更改允许使用通配符(https://*)和全局模式,我们认为这很有帮助,但不应该暴露给所有 Tauri 开发人员。我们得出结论,过度暴露的风险(例如允许列表切换以启用所有 Tauri API 端点)并不能证明这种宽松的暴露是合理的。最终实现允许配置指定的(子)域6(例如:example.com)以获得对 Tauri IPC 的远程访问权限。

少数需要通配符或更进一步暴露的边缘用例可以通过能够动态修改 IPC 访问的自定义 Rust 代码来实现。我们现在以类似于 fshttp 作用域的方式暴露此远程 IPC 作用域。

假设在 https://trusted.example 上有一个完全受信任的 Web 服务,现在可以配置安全作用域以允许某些窗口甚至插件访问自定义实现的命令以及可选的内置 Tauri API

"security": {
"dangerousRemoteUrlIpcAccess": [
{
"windows": ["main", "settings"],
"domain": "trusted.example",
"plugins": ["trusted-plugin"],
"enableTauriAPI": false
},
],
}

在任何情况下都不得将共享域用于此目的。我们不限制对路径或特定文件的访问。您只能使用受信任的(子)域6进行作用域设置。另一个非常危险的问题是,开发人员必须确保域名所有权在应用程序的生命周期内不会更改。域名劫持可能导致用户设备受损。

由于某些 Webview 功能未启用或无法访问,社区贡献引入了向在新窗口中创建的 Webview 进程添加额外参数的可能性。

此功能在 window 端点中暴露给前端。我们发现这种暴露的风险很高,因为大多数 Webview 都有非常重要的功能和标志,可以通过进程参数来允许。

以下所有威胁模型假设都基于 tauri.confallowlist 中允许创建 Tauri 窗口,因此暴露给前端。此 PR 仅影响 Windows,因此对其他支持的操作系统没有影响。

有能力创建窗口并向 Webview 传递命令行参数的攻击者可以提升其权限,以逃脱 Tauri 和 Webview 的严格沙盒。

这些标志允许启用几个危险的 Webview 功能,从加载当前默认配置文件文件夹之外的配置文件(窃取设备中的浏览器会话)到禁用 Webview 的安全措施(例如:证书验证、沙盒、webdriver/headless 模式、设备管理端点等)。

我们在 https://peter.sh/experiments/chromium-command-line-switches/ 找到了一个旧但仍然独一无二的文档参考,它帮助我们了解 Windows 上可能存在的风险,因为 Webview2 使用相同的标志。

此功能随后更改为仅在 Rust 侧暴露。Tauri 应用程序开发人员可以使用它来实现自定义命令,以使用特定于用例的参数调用 Webview 窗口。

我们发现,用于提取远程打包器文件(如 Webview2 安装程序)的组件是使用 extract_zip 函数手动提取单个文件,该函数使用了 ZipFile::name() 而非文档中推荐的 ZipFile::enclosed_name()。名称中带有 ../../../../foo.sh 等的文件可能被提取到文件系统上预期目录之外。这种漏洞被称为 ZipSlip

由于该函数仅用于经过验证和受信任的文件,因此此处的影响几乎为零。尽管如此,我们还是更改了实现以使用正确的提取方法。

打包器未对传递给 handlebars::Handlebars::render() 的内容进行转义,这可能导致在打包器阶段发生意外的代码执行。这也是一个影响较小的问题,但已迅速修复。

  • 创建窗口时增加 additional_browser_args 选项 #5799
  • 添加 is_minimized() 窗口方法。 #5618
  • 添加 title 窗口 getter。 #5515
  • 内容保护 API #5513
  • 添加 Builder::device_event_filterApp::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_tooltipSystemTrayHandle::set_tooltip#5938
  • tauri.bundle.macOS.frameworks 添加 dylib 支持。 #5732
  • 在 Windows 上,msi 安装程序的 Launch App 复选框将默认选中。 #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
  • 添加 --ci 标志,并在 signer generate 命令中尊重 CI 环境变量。在这种情况下,默认密码将为空字符串,并且 CLI 不会提示输入值。 #6097
  • TAURI_KEY_PASSWORD 环境变量为空且提供了 --ci 参数或设置了 CI 环境变量时,在构建命令中跳过密码提示。 d4f89af18d69fd95a4d8a1ede8442547c6a6d0ee
  • 修复了在新创建的项目中没有 Cargo.lock 文件时,tauri info 解析 crate 版本会崩溃的问题。 #5873
  • 修复了在 productName 中包含 Unicode 字符的应用程序构建问题。 #5872
  • 同步所有窗口的 __TAURI_METADATA__.__windows#5615
  • 修复了在顶部调整大小区域双击自定义标题栏时出现的调整大小故障。 #5966
  • 禁用 Linux 上的光标鼠标事件。 #6025
  • 修复了 invoke 中使用 JS Map 时的序列化问题。 #6099
  1. 进程间通信,在此实例中指 Tauri 核心与 Webview 中运行的前端代码之间的通信。

  2. 安全影响:这种威胁组合理论上最大的影响是什么?这在很大程度上取决于 Tauri API 端点的正确作用域以及自定义实现 Tauri 命令的强化。

  3. 暴露:描述此功能暴露给用户或攻击者的作用域项。可以将暴露限制为仅特定域、窗口或仅自定义实现的命令。

  4. 攻击者能力:攻击者拥有哪种权限?范围可以从诱骗用户输入恶意输入到通过跨站脚本在前台执行代码(在我们的例子中这是前台代码的最高权限)。常见的能力在 OWASP 文档中描述。

  5. 如果应用程序解析用户输入以做出 URL 重定向决策,但未进行适当验证,则可能被利用。 维基百科来源

  6. 请参阅 Reqwest 参考 2


© 2025 Tauri 贡献者。CC-BY / MIT