Tauri 团队很高兴宣布 1.3 版本。此版本包括安全改进、新功能和重要的错误修复。
升级
确保将 NPM 和 Cargo 依赖项都更新到 1.3.0 版本。你可以使用以下命令更新 NPM 依赖项
- npm
- Yarn Classic
- Yarn Berry
- pnpm
npm install @tauri-apps/cli@latest @tauri-apps/api@latest
yarn upgrade @tauri-apps/cli @tauri-apps/api --latest
yarn up @tauri-apps/cli @tauri-apps/api
pnpm update @tauri-apps/cli @tauri-apps/api --latest
若要更新 Cargo 依赖项,请在 src-tauri
文件夹中运行以下命令
cargo update
1.3.0 中的内容
NSIS
Tauri CLI 现在可以使用 NSIS 创建 Windows 应用程序安装程序。此新捆绑目标在 macOS 和 Linux 上也可用作一项实验性功能,因此你可以交叉编译 Windows 安装程序。关于后者的文档将很快发布。
Tauri 1.3 审计
内部审计由 @tweidinger 和 @chippers 执行,他们参与了 Tauri 项目中的大多数安全主题。它是在 CrabNebula 的付费时间内执行的,我们很感激能够将我们工作时间的一部分贡献给开源项目,并使其成为一个更安全的环境 ❤️。
我们手动审计了超过 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
上有一个完全受信任的网络服务,现在可以配置安全范围以允许某些窗口甚至插件访问自定义实现的命令,以及内置的 Tauri API(可选)
"security": {
"dangerousRemoteUrlIpcAccess": [
{
"windows": ["main", "settings"],
"domain": "trusted.example",
"plugins": ["trusted-plugin"],
"enableTauriAPI": false
},
],
}
在任何情况下都不得为此使用共享域。我们不限制对路径或特定文件的访问。您只能使用受信任的(子)域6进行范围限定。另一个非常危险的陷阱是,开发人员必须确保在应用程序的生命周期内域所有权不会发生变化。域接管可能导致用户设备遭到破坏。
浏览器参数 #5799
由于某些 webview 功能未启用或无法访问,社区贡献引入了向新窗口中创建的 webview 进程添加其他参数的可能性。
此功能已在 window
端点中向前端公开。我们发现这种公开具有很高的风险,因为大多数 webview 具有可以通过进程参数允许的非常有影响力的功能和标记。
所有以下威胁模型假设都基于 tauri.conf
的 allowlist
中允许创建 Tauri 窗口,因此向前端公开。此 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。
由于该功能仅用于已验证和受信任的文件,因此此处的风险几乎为零。无论如何,我们更改了实现以方便使用适当的提取方法。
Bundler 加固 #6039
Bundler 不会转义传递给 handlebars::Handlebars::render()
的内容,这可能导致在 bundler 阶段出现意外的代码执行。这也是一个影响较小的 issue,但已得到及时修复。
其他更改
新增
- 创建窗口时新增
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 上,根据窗口主题更改 Web 视图主题,以获得更准确的
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
发生崩溃。 #5873 - 修复在
productName
中包含 Unicode 字符的应用程序构建。 #5872 - 在所有窗口中同步
__TAURI_METADATA__.__windows
。 #5615 - 修复在顶部调整大小区域中双击自定义标题栏时调整大小的故障。 #5966
- 在 Linux 上禁用光标鼠标事件。 #6025
- 修复在
invoke
中使用时 jsMap
的序列化。 #6099
- 进程间通信,在本例中是在 Tauri 核心和在 Web 视图中运行的前端代码之间的通信。↩
- 安全影响:此威胁组合的理论最大影响是什么?这在很大程度上取决于 Tauri API 端点的正确作用域和自定义实现的 Tauri 命令的强化。↩
- 暴露:描述此功能对用户或对手暴露的作用域项。可以将暴露限制为仅某些域、窗口或仅自定义实现的命令。↩
- 对手能力:对手有哪些权限?范围可以从诱骗用户输入恶意输入到通过跨站点脚本在前端执行代码(这是我们案例中前端代码的最高权限)。OWASP 文档 中描述了常见功能。↩
- 如果应用程序解析用户输入以做出 URL 重定向决策,而该决策未得到适当验证,则该应用程序可能会被利用。 维基百科来源↩
- 请参阅 Reqwest 参考↩