隔离模式
隔离模式是一种拦截和修改前端发送给 Tauri 核心的 Tauri API 消息的方法,所有操作都使用 JavaScript 完成。通过隔离模式注入的安全 JavaScript 代码被称为隔离应用程序。
隔离模式的目的是为开发者提供一种机制,帮助保护他们的应用程序免受前端对 Tauri 核心的非预期或恶意调用。隔离模式的需求源于在前端运行的不可信内容带来的威胁,这在有许多依赖项的应用程序中很常见。有关应用程序可能面临的多种威胁来源,请参阅安全:威胁模型。
上述威胁模型中,隔离模式设计时考虑的最大威胁是开发威胁。许多前端构建时工具不仅包含数十(或数百)个通常深度嵌套的依赖项,而且复杂的应用程序还可能包含大量(也通常深度嵌套的)捆绑到最终输出中的依赖项。
Tauri 强烈建议在任何可以使用隔离模式的情况下都使用它。由于隔离应用程序拦截了**所有**来自前端的消息,因此它**始终**可以使用。
Tauri 还强烈建议在使用外部 Tauri API 时锁定您的应用程序。作为开发者,您可以利用安全的隔离应用程序来尝试验证 IPC 输入,以确保它们在预期参数范围内。例如,您可能希望检查文件读写调用是否未尝试访问应用程序预期位置之外的路径。另一个例子是确保 Tauri API HTTP fetch 调用只将其 Origin 头部设置为应用程序预期值。
也就是说,它会拦截**所有**来自前端的消息,因此即使是事件等始终开启的 API 也能正常工作。由于某些事件可能会导致您的 Rust 代码执行操作,因此可以对它们使用相同的验证技术。
隔离模式旨在通过在前端和 Tauri 核心之间注入一个安全应用程序来拦截和修改传入的 IPC 消息。它通过使用 `
为了确保没有人可以手动读取特定版本应用程序的密钥并利用它在加密后修改消息,每次运行应用程序时都会生成新密钥。
为了更容易理解,下面列出了 IPC 消息在使用隔离模式发送到 Tauri 核心时所经历的大致步骤:
- Tauri 的 IPC 处理程序接收到消息。
- IPC 处理程序 -> 隔离应用程序
[沙箱]
隔离应用程序钩子运行并可能修改消息。[沙箱]
消息使用运行时生成的密钥通过 AES-GCM 加密。[加密]
隔离应用程序 -> IPC 处理程序[加密]
IPC 处理程序 -> Tauri 核心
注意:箭头(->)表示消息传递。
由于消息确实发生了加密,因此与Brownfield 模式相比,会产生额外的开销成本,即使安全的隔离应用程序没有执行任何操作。除了对性能敏感的应用程序(这些应用程序可能拥有精心维护的少量依赖项以保持足够的性能)之外,大多数应用程序应该不会注意到加密/解密 IPC 消息的运行时成本,因为它们相对较小且 AES-GCM 相对较快。如果您不熟悉 AES-GCM,那么在此上下文中,唯一相关的是它是 SubtleCrypto 中包含的唯一经过身份验证的模式算法,并且您可能每天都在 TLS 的底层使用它。
每次 Tauri 应用程序启动时还会生成一个加密安全的密钥。如果系统已经有足够的熵来立即返回足够的随机数,这在桌面环境中非常常见,通常不会察觉。如果在无头环境中进行WebDriver 集成测试,那么如果您的操作系统不包含熵生成服务,您可能需要安装类似 `haveged` 的服务。Linux 5.6 (2020 年 3 月) 现在包含使用推测执行的熵生成。
由于平台不一致性,隔离模式存在一些限制。最显著的限制是由于 Windows 上沙箱 `
由于隔离应用程序的目的是防止开发威胁,我们强烈建议您尽可能保持隔离应用程序的简单性。您不仅应努力将隔离应用程序的依赖项保持在最低限度,还应考虑将其所需的构建步骤保持在最低限度。这样,您就不必担心除了前端应用程序之外,隔离应用程序也会受到供应链攻击。
在本例中,我们将创建一个小的 Hello World 风格的隔离应用程序,并将其连接到一个假想的现有 Tauri 应用程序。它不会对通过它的消息进行任何验证,只会将内容打印到 WebView 控制台。
出于本示例的目的,假设我们位于 `tauri.conf.json` 的同一目录下。现有 Tauri 应用程序的 `frontendDist` 设置为 `../dist`。
../dist-isolation/index.html
:
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" /> <title>Isolation Secure Script</title> </head> <body> <script src="index.js"></script> </body></html>
../dist-isolation/index.js
:
window.__TAURI_ISOLATION_HOOK__ = (payload) => { // let's not verify or modify anything, just print the content from the hook console.log('hook', payload); return payload;};
现在,我们只需设置 `tauri.conf.json` 配置以使用隔离模式,就可以从Brownfield 模式引导到隔离模式。
假设我们的主要前端 `frontendDist` 设置为 `../dist`。我们还将隔离应用程序输出到 `../dist-isolation`。
{ "build": { "frontendDist": "../dist" }, "app": { "security": { "pattern": { "use": "isolation", "options": { "dir": "../dist-isolation" } } } }}
© 2025 Tauri 贡献者。CC-BY / MIT