# Risk map — tauri-apps/tauri

> Canonical page: https://codevetter.com/unpack/tauri/risk-map

# Risk map — tauri-apps/tauri

Scanned commit 745b9a48aeb6e7f48d70adf3d043e6203de5bac6 (2026-09-22). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

The highest-stakes code is the IPC authorization boundary: invoke_key verification, ACL resolution, remote-origin rejection, and eval-based response delivery all sit on the webview↔Rust seam. The `asset:` protocol touches the filesystem and relies entirely on scope checks. The CLI executes config-supplied shell commands and writes a predictable-path kill script. Several cross-language invariants (serialization key names, `plugin:` command syntax, JNI symbol names, JS template placeholders) are maintained only by comments, and the workspace release profile aborts on panic.
- ACL gatekeeping in `Webview::on_message` is the central security boundary: plugin commands, apps with an ACL manifest, and any non-local origin all require a resolved ACL entry or the invoke is rejected — a regression here silently opens commands to remote content. — [crates/tauri/src/webview/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/webview/mod.rs) [crates/tauri/src/ipc/authority.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/authority.rs)
- invoke_key is generated per-process (128-bit Z85) and injected into init scripts; on mismatch `on_message` logs/eprintln and returns silently — no user-visible error, which can mask attacks or bugs. — [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs) [crates/tauri/src/webview/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/webview/mod.rs)
- Responses are delivered by `webview.eval` of JS built by `format_callback`; any serialization gap there is an injection vector inside the webview context. (inferred) — [crates/tauri/src/ipc/protocol.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/protocol.rs) [crates/tauri/src/ipc/format_callback.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/format_callback.rs)
- The `asset:` protocol opens arbitrary paths from the filesystem with only `SafePathBuf` validation and `scope.is_allowed`; it sniffs mime types and serves range requests — scope misconfiguration exposes host files to the webview. — [crates/tauri/src/protocol/asset.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/protocol/asset.rs) [crates/tauri/src/scope/fs.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/scope/fs.rs)
- The ipc custom-protocol handler sets `Access-Control-Allow-Origin: *` on every response (and `Access-Control-Allow-Headers: *` on OPTIONS), relying on the invoke_key + ACL rather than origin restriction. — [crates/tauri/src/ipc/protocol.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/protocol.rs)
- `tauri dev` executes `build.beforeDevCommand`/`beforeBuildCommand` through `sh -c`/`cmd /S /C` — a shell-out of config-provided strings — and writes a fixed-name script `tauri-stop-dev-processes.sh` into the shared temp dir with mode 0o770. — [crates/tauri-cli/src/dev.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/dev.rs)
- The Isolation pattern decrypts IPC payloads (`crypto_keys.decrypt`) inside `handle_ipc_message`/`parse_invoke_request`; its correctness depends on iframe-origin checks in scripts/isolation.js and codegen injecting `__TAURI_ISOLATION_HOOK__`, which panics the build if absent. — [crates/tauri/src/ipc/protocol.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/protocol.rs) [crates/tauri/scripts/isolation.js](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/scripts/isolation.js) [crates/tauri-codegen/src/context.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-codegen/src/context.rs)
- Cross-language invariants are comment-enforced: `__TAURI_TO_IPC_KEY__` must match across core.ts, ipc.js and process-ipc-message-fn.js, and the Java `Java_app_tauri_plugin_PluginManager_handlePluginResponse` symbol is checked by the CLI — silent breakage risk on rename. — [packages/api/src/core.ts](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/packages/api/src/core.ts) [crates/tauri/scripts/process-ipc-message-fn.js](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/scripts/process-ipc-message-fn.js) [crates/tauri/scripts/ipc.js](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/scripts/ipc.js) [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs)
- `dynamic-acl` is a default feature enabling `Manager::add_capability` — runtime ACL mutation means permissions can broaden after startup, which complicates security review of an app built on this framework. — [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs) [crates/tauri/Cargo.toml](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/Cargo.toml) [crates/tauri/src/ipc/authority.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/authority.rs)
- Feature `process-relaunch-dangerous-allow-symlink-macos` is documented in lib.rs as dangerous; combined with `process::restart` in the exit path it is a self-reexec surface. — [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs) [crates/tauri/src/process.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/process.rs) [crates/tauri/src/app.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/app.rs)
- Build-time panics: context_codegen `panic!`s when frontendDist doesn't exist or the isolation dir lacks `__TAURI_ISOLATION_HOOK__`, and `Resolved::resolve(...).expect("failed to resolve ACL")` aborts compilation — config errors surface as rustc panics, not diagnostics. — [crates/tauri-codegen/src/context.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-codegen/src/context.rs)
- Blast-radius hotspots: `crates/tauri-utils` config/ACL types are consumed by tauri, tauri-build, tauri-codegen, tauri-cli and tauri-plugin simultaneously — a schema change ripples through five crates plus generated schema files guarded by check-generated-files.yml. (inferred) — [crates/tauri-utils/src/config.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-utils/src/config.rs) [crates/tauri-utils/src/acl/manifest.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-utils/src/acl/manifest.rs) [.github/workflows/check-generated-files.yml](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/.github/workflows/check-generated-files.yml)
- The workspace release profile sets `panic = "abort"`, so any panic in a shipped app (including in plugin code or the asset protocol task spawns) terminates the process without unwind. — [Cargo.toml](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/Cargo.toml)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
