SuperAPI AI 工具集

understanding-tauri-runtime-authority

安全与审计

查看项目

更新于 10-15 15:23

技能介绍

用途

本技能文档说明 Tauri 运行时代理(Runtime Authority)这一核心组件,它负责在应用执行期间强制实施安全策略:校验权限、解析能力并注入作用域,且这一切都发生在命令执行之前。运行时代理位于 WebView 前端与 Tauri 命令之间,充当所有 IPC(进程间通信)请求的守门层。

主要能力

当 WebView 调用 Tauri 命令时,运行时代理会:

  • 接收来自 WebView 的 invoke 请求;
  • 校验来源是否被允许调用所请求的命令;
  • 确认来源属于适用的能力(capability);
  • 将已定义的作用域注入请求;
  • 将校验通过的请求传递给 Tauri 命令。

如果来源不被允许,请求会被拒绝,命令永远不会执行。

信任边界模型

Tauri 在 Rust 核心代码与 WebView 前端代码之间建立信任边界:Rust 核心拥有完全信任、可不受限制地访问系统;WebView 前端仅有有限信任,只能通过 IPC 访问被暴露的资源。运行时代理在运行时强制维护这一边界。

关键组件

  • Permissions(权限):定义存在哪些命令及其访问规则。
  • Capabilities(能力):把权限映射到特定的窗口/WebView。
  • Scopes(作用域):通过路径/资源限制约束命令行为。
  • Runtime Authority(运行时代理):在执行时强制执行上述全部内容。

运行时能力解析

当命令被调用时,运行时代理按以下流程解析适用的能力:

  1. 识别来源:确定发起请求的窗口/WebView;
  2. 匹配能力:找出包含该窗口的所有能力;
  3. 收集权限:汇总匹配能力中的所有权限;
  4. 检查命令访问:确认该命令被允许;
  5. 合并作用域:合并所有适用的作用域限制;
  6. 校验或拒绝:要么继续注入作用域,要么拒绝。

当窗口属于多个能力时,安全边界会合并。例如窗口 main 同时属于 basic-access(fs:allow-read-file)与 write-access(fs:allow-write-file),则 main 窗口同时获得读与写权限。能力还可以针对特定平台,运行时只考虑匹配当前平台的能力:例如 platforms 为 linux、macOS、windows 的能力在 iOS/Android 上会被忽略。

访问控制强制

deny 优先规则

评估访问时,deny 规则始终优先于 allow。例如允许读取 $HOME/** 但拒绝 $HOME/.ssh/** 时:读取 $HOME/documents/file.txt 被允许,而读取 $HOME/.ssh/id_rsa 被拒绝。

命令级校验

任何命令执行前,运行时代理会检查命令权限是否存在、验证调用窗口是否通过其能力拥有该权限、并验证作用域限制是否满足。以窗口 editor 调用 fs.readFile("/home/user/doc.txt") 为例:检查 editor 是否拥有 fs:allow-read-file(是)、路径是否在允许作用域内(是)、是否在任何拒绝作用域内(否),随后命令在注入作用域的情况下执行。

作用域注入

作用域不仅是校验规则,还会注入到命令执行上下文中,命令可访问其适用作用域以实施限制。运行时作用域变量会解析为实际路径:$APP(应用安装目录)、$APPDATA(应用数据目录)、$APPCONFIG(应用配置目录)、$HOME(用户主目录)、$TEMP(临时目录)、$DOCUMENT(文档目录)、$DOWNLOAD(下载目录)、$DESKTOP(桌面目录)。

运行时代理内置路径遍历防护:请求 /usr/path/to/../../../etc/passwd 会被拒绝(检测到路径遍历),路径中的父目录访问符 .. 会被阻止,确保作用域限制无法被绕过。

配置示例

文档给出多个配置示例,文件位于 src-tauri/capabilities/ 下,以下保留原始内容。

基本运行时安全设置 src-tauri/capabilities/default.json: { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default-capability", "description": "Default runtime permissions", "windows": ["main"], "permissions": [ "core:default", "core:event:default", "core:window:default" ] }

受限文件系统访问 src-tauri/capabilities/files.json: { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "file-access", "description": "Controlled filesystem access", "windows": ["main"], "permissions": [ "fs:default", { "identifier": "fs:allow-read-file", "allow": [ { "path": "$APPDATA/" }, { "path": "$DOCUMENT/" } ], "deny": [ { "path": "$DOCUMENT/private/" } ] }, { "identifier": "fs:allow-write-file", "allow": [ { "path": "$APPDATA/" } ] } ] }

多窗口安全边界 src-tauri/capabilities/editor.json: { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "editor-capability", "description": "Full editor permissions", "windows": ["editor"], "permissions": [ "core:default", "fs:default", "fs:allow-read-file", "fs:allow-write-file", "dialog:default" ] }

src-tauri/capabilities/preview.json: { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "preview-capability", "description": "Read-only preview permissions", "windows": ["preview"], "permissions": [ "core:window:default", "core:event:default", { "identifier": "fs:allow-read-file", "allow": [{ "path": "$TEMP/preview/**" }] } ] }

运行时效果:editor 窗口能读写文件并打开对话框;preview 窗口只能读取临时预览目录。

HTTP 请求作用域: { "identifier": "api-access", "windows": ["main"], "permissions": [ { "identifier": "http:default", "allow": [ { "url": "https://api.myapp.com/" }, { "url": "https://cdn.myapp.com/" } ], "deny": [ { "url": "https://api.myapp.com/admin/*" } ] } ] }

运行时安全保证

可防护的威胁:前端被攻陷(损害被限制在已授予权限内)、未授权命令访问(未明确授予能力的命令会被拒绝)、路径遍历攻击(运行时内置防护)、作用域绕过尝试(所有作用域在命令执行前被强制)、跨窗口访问(每个窗口被隔离到其能力范围内)。

不可防护的威胁:恶意 Rust 代码(Rust 核心拥有完全信任)、过于宽松的配置(属开发者责任)、WebView 漏洞(属操作系统 WebView 安全边界)、供应链攻击(属依赖安全范畴)。

调试与常见问题

权限被拒时可按序检查:窗口标签(确认发起请求的窗口)、能力(确保有面向该窗口的能力)、权限(确认权限已加入该能力)、作用域(确认资源在允许范围内且未被拒绝)。常见问题包括:命令不被允许(能力中缺少权限,需添加)、作用域未生效(权限未定义作用域,需添加 allow 作用域)、有 allow 却被拒(deny 规则优先,需移除冲突的 deny)、窗口无任何权限(能力未指向该窗口,需检查能力中的窗口标签)。可通过查看生成的 schema 查看可用权限:src-tauri/gen/schemas/desktop-schema.json 与 src-tauri/gen/schemas/mobile-schema.json。

适用场景与最佳实践

本技能面向需要理解与配置 Tauri 应用运行时安全边界的开发者。最佳实践包括:最小权限原则,仅授予每个窗口实际需要的权限;始终定义作用域,不要为文件系统或网络权限留下无作用域配置;显式拒绝敏感路径(如 $HOME/.ssh/、$HOME/.gnupg/、$HOME/.aws/**);按信任级别拆分能力(如 main-trusted.json 完全访问、plugin-limited.json 受限、preview-readonly.json 只读);对操作系统特定权限使用平台定向,避免仅在桌面端生效的权限在移动端被评估。

限制

资料中未提供关于收费、价格、具体平台支持范围之外的信息或使用步骤以外的额外承诺;文档所述内容仅限运行时代理的机制、配置示例与安全边界说明。Tauri 本身对恶意 Rust 代码、过于宽松的配置、WebView 漏洞和供应链攻击不提供运行时代理层面的防护,这些被明确列为不受保护的范围。