From da34544806b77af7e958dd302a22e80c0a6a06df Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 9 Aug 2026 10:22:14 +0000 Subject: [PATCH] Fix arbitrary file check vulnerability in data_dir_has_documents This commit mitigates an arbitrary file existence check vulnerability by validating the provided directory path against Tauri's allowed filesystem scope using `tauri_plugin_fs`. - Added `tauri-plugin-fs` dependency. - Injected `AppHandle` into the `data_dir_has_documents` command. - Verified that the target file path (`documents.json`) is allowed within the app's `fs_scope` before calling `.exists()`. - Registered `tauri_plugin_fs` builder on startup. Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/src/main.rs | 13 +++++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 281bbeb..bef306e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3735,6 +3735,7 @@ dependencies = [ "tauri-build", "tauri-plugin-autostart", "tauri-plugin-dialog", + "tauri-plugin-fs", "tauri-plugin-global-shortcut", "tauri-plugin-opener", "tauri-plugin-process", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 9fa0b9b..caa5e16 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -21,6 +21,7 @@ serde_json = "1" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } chrono = "0.4" futures = "0.3.32" +tauri-plugin-fs = "2.5.1" [profile.release] strip = true diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 74c4642..052fb45 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -10,6 +10,7 @@ use tauri::menu::{Menu, MenuItem}; use tauri::tray::TrayIconBuilder; use tauri::{AppHandle, Emitter, Manager, WindowEvent}; use tauri_plugin_dialog::DialogExt; +use tauri_plugin_fs::FsExt; use tauri_plugin_opener::OpenerExt; const RATES_TTL_SECS: u64 = 3600; @@ -538,8 +539,15 @@ fn open_backups_folder(app: AppHandle, dir: Option) -> Result<(), String // ---------- data folder migration #[tauri::command] -fn data_dir_has_documents(dir: String) -> bool { - PathBuf::from(dir).join("documents.json").exists() +fn data_dir_has_documents(app: AppHandle, dir: String) -> bool { + let path = PathBuf::from(dir).join("documents.json"); + if !app + .try_fs_scope() + .is_some_and(|scope| scope.is_allowed(&path)) + { + return false; + } + path.exists() } /// strategy: "move" (copy mine, delete originals), "overwrite" (same, target @@ -715,6 +723,7 @@ fn toggle_window(app: &AppHandle) { fn main() { tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_single_instance::init(|app, args, _cwd| { if let Some(path) = args.iter().skip(1).find(|a| is_sheet_path(a)) { if let Ok(content) = fs::read_to_string(path) {