跳到內容
Tauri

Tauri 1.3.0 版本發佈

Tauri 1.3 Launch Hero Image

Tauri 團隊很高興宣布 1.3 版本發佈。此版本包含安全性改進、新功能和重要的錯誤修正。

升級

請務必將 NPM 和 Cargo 依賴項更新至 1.3.0 版本。您可以使用以下命令更新依賴項:

npm install @tauri-apps/cli@latest @tauri-apps/api@latest

1.3.0 版本的新功能

NSIS

Tauri CLI 現在可以使用 NSIS 建立 Windows 應用程式安裝程式。這個新的套件目標在 macOS 和 Linux 上也以實驗性功能提供,因此您可以交叉編譯您的 Windows 安裝程式。後者的文件將很快發布。

Tauri 1.3 稽核

內部稽核由 @tweidinger@chippers 執行,他們參與了 Tauri 專案的大部分安全性議題。稽核是在 CrabNebula 的付費時間內進行的,我們很感激能夠花費部分工作時間貢獻於開源專案,並使其成為更安全的環境 :heart:。

我們手動稽核了超過 45 個 PR。一些 PR(例如 #5544)引導我們深入研究非常舊的 RFC(RFC6068RFC3966)、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 的遠端存取權。

少數需要萬用字元甚至更進一步暴露的邊緣案例,可以透過能夠動態修改 IPC 存取的自訂 Rust 程式碼來實作。我們現在以類似於 fshttp 範圍的方式暴露這個遠端 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 視窗建立已在 tauri.confallowlist 中允許,因此暴露給前端。此 PR 僅影響 Windows,因此對其他支援的作業系統沒有影響。

有能力建立視窗並將命令列參數傳遞給 webview 的攻擊者可以提升其權限,以逃脫 Tauri 和 webview 的嚴格沙箱。

這些標誌允許啟用幾個危險的 webview 功能,從載入目前預設設定檔資料夾外部的設定檔(從裝置竊取瀏覽器會話)到停用 webview 的安全措施(例如:憑證驗證、沙箱、webdriver/無頭模式、裝置管理端點等)。

我們在 https://peter.sh/experiments/chromium-command-line-switches/ 找到了一份古老但寶貴且仍然獨特的文件參考,這幫助我們了解 Windows 上可能存在的風險,因為 Webview2 使用相同的標誌。

然後,此功能被更改為僅在 rust 端公開。Tauri 應用程式開發人員可以使用它來實作自訂命令,以使用特定用例參數來調用 webview 視窗。

可能的 ZipSlip #4674

我們發現,用於提取遠端 bundler 檔案(例如 Webview2 安裝程式)的組件正在使用 extract_zip 函數手動提取單個檔案,該函數使用 ZipFile::name() 而不是文件中建議的 ZipFile::enclosed_name()。名稱如 ../../../../foo.sh 的檔案可能會被提取到檔案系統上預期目錄之外。這種漏洞稱為 ZipSlip

由於該函數僅用於經過驗證和受信任的檔案,因此這裡的影響幾乎為零。儘管如此,我們還是更改了實作方式,以方便正確的提取方法。

Bundler 強化 #6039

bundler 沒有逸出傳遞給 handlebars::Handlebars::render() 的內容,這可能會在 bundler 階段引起不必要的程式碼執行。這也是一個低影響問題,但已迅速修復。

其他變更

新增

  • 建立視窗時的 additional_browser_args 選項 #5799
  • 新增 is_minimized() 視窗方法。 #5618
  • 在視窗上新增 title getter。 #5515
  • 內容保護 API #5513
  • 新增 Builder::device_event_filterApp::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_tooltipSystemTrayHandle::set_tooltip#5938
  • 將 dylib 支援新增至 tauri.bundle.macOS.frameworks#5732

增強功能

  • 在 Windows 上,msi 安裝程式的 Launch App 核取方塊預設會被選取。 #5871
  • icon 命令新增 --png 選項,以產生自訂圖示大小。 #5246
  • 在 Windows 上,根據視窗主題變更 webview 主題,以更準確地支援 prefers-color-scheme#5874
  • 從 Cargo.toml 範本中移除預設功能。 #6074
  • WindowBuilder 結構中新增一個方法,以從 tauri.conf.json 設定重新建立視窗。#6073
  • 改進找不到 rustc 時的錯誤訊息。 #6021
  • .msi 套件目標新增對預發布識別符和建置編號的支援。每個只能使用一個,並且必須僅為數字。根據 https://semver.org/,版本仍然必須與 semver 相容。 #6096
  • signer generate 命令上新增 --ci 標誌並遵循 CI 環境變數。在這種情況下,預設密碼將為空字串,並且 CLI 不會提示輸入值。 #6097
  • TAURI_KEY_PASSWORD 環境變數為空且提供 --ci 引數或設定 CI 環境變數時,跳過建置命令上的密碼提示。 d4f89af18d69fd95a4d8a1ede8442547c6a6d0ee

修正

  • 修正在沒有 Cargo.lock 檔案的新建立專案上解析 crates 版本時 tauri info 崩潰的問題。 #5873
  • 修正建置其 productName 中包含 unicode 字元的應用程式的問題。 #5872
  • 在所有視窗之間同步 __TAURI_METADATA__.__windows#5615
  • 修正雙擊頂部調整大小區域中的自訂標題列時的大小調整故障。 #5966
  • 在 Linux 上停用游標滑鼠事件。 #6025
  • 修正在 invoke 中使用時 js Map 的序列化問題。 #6099

註腳

  1. 跨程序通訊,在此例中指的是 Tauri 核心與在 webview 內執行的前端程式碼之間的通訊。

  2. 安全性影響:這種威脅組合在理論上最大的影響是什麼?這高度取決於 Tauri API 端點的正確範圍設定以及自訂實作的 Tauri 命令的強化程度。

  3. 暴露程度:描述此功能暴露給使用者或攻擊者的範圍項目。可以將暴露限制為僅限於某些網域、視窗或僅限於自訂實作的命令。

  4. 攻擊者能力:攻擊者擁有哪種權限?範圍可以從誘騙使用者輸入惡意輸入到透過跨站腳本攻擊在前端執行程式碼(在我們的案例中,這是前端程式碼的最高權限)。常見的能力在 OWASP 文件 中描述。

  5. 如果應用程式解析使用者輸入以做出 URL 重定向決策,但未正確驗證,則可能會被利用。 維基百科來源

  6. 請參閱 Reqwest 參考 2


© 2025 Tauri 貢獻者。CC-BY / MIT