隔離模式
隔離模式是一種透過 JavaScript 攔截並修改前端傳送給 Tauri Core 的 Tauri API 訊息的方式。由隔離模式注入的安全 JavaScript 程式碼稱為隔離應用程式。
原因
隔離模式的目的是為開發人員提供一種機制,以幫助保護他們的應用程式免受對 Tauri Core 的不需要或惡意的前端呼叫。隔離模式的需求源於來自前端上執行的不受信任內容的威脅,這是具有許多依賴項的應用程式的常見情況。請參閱 安全性:威脅模型,以取得應用程式可能看到的許多威脅來源清單。
隔離模式在設計時考慮到的上述最大的威脅模型是開發威脅。許多前端建置時間工具不僅包含許多(或數百個)通常深度巢狀的依賴項,而且複雜的應用程式也可能具有大量的(通常也深度巢狀的)依賴項,這些依賴項會捆綁到最終輸出中。
何時
只要可以使用,Tauri 強烈建議使用隔離模式。由於隔離應用程式會攔截來自前端的所有訊息,因此它永遠可以使用。
當您使用外部 Tauri API 時,Tauri 也強烈建議鎖定您的應用程式。身為開發人員,您可以利用安全的隔離應用程式來嘗試驗證 IPC 輸入,以確保它們在一些預期的參數內。例如,您可能想要檢查讀取或寫入檔案的呼叫是否嘗試存取應用程式預期位置之外的路徑。另一個範例是確保 Tauri API HTTP 擷取呼叫僅將 Origin 標頭設定為您的應用程式預期的值。
話雖如此,它會攔截來自前端的所有訊息,因此它甚至可以與始終開啟的 API(例如 事件)一起使用。由於某些事件可能會導致您自己的 Rust 程式碼執行動作,因此可以對它們使用相同的驗證技術。
如何
隔離模式是關於在您的前端和 Tauri Core 之間注入一個安全的應用程式,以攔截和修改傳入的 IPC 訊息。它透過使用 <iframe>
的沙盒功能,在主前端應用程式旁安全地執行 JavaScript 來做到這一點。Tauri 在載入頁面的同時強制執行隔離模式,強制所有對 Tauri Core 的 IPC 呼叫改為先透過沙盒化的隔離應用程式路由。一旦訊息準備好傳遞給 Tauri Core,它就會使用瀏覽器的 SubtleCrypto 實作進行加密,並傳遞回主前端應用程式。一旦在那裡,它會直接傳遞給 Tauri Core,然後在那裡解密並像平常一樣讀取。
為了確保沒有人可以手動讀取您應用程式特定版本的金鑰,並在加密後用來修改訊息,每次執行您的應用程式時都會產生新的金鑰。
IPC 訊息的近似步驟
為了讓您更容易追蹤,以下是使用隔離模式將 IPC 訊息傳送給 Tauri Core 時,它將經歷的近似步驟清單
- Tauri 的 IPC 處理程式收到訊息
- IPC 處理程式 -> 隔離應用程式
[sandbox]
隔離應用程式掛鉤執行,並可能修改訊息[sandbox]
訊息使用執行階段產生的金鑰,以 AES-GCM 加密[加密]
隔離應用程式 -> IPC 處理程式[加密]
IPC 處理程式 -> Tauri Core
注意:箭頭 (->) 表示訊息傳遞。
效能影響
由於訊息會加密,因此與 Brownfield 模式 相比,即使安全的 Isolation 應用程式沒有執行任何動作,也會產生額外的負擔成本。除了效能敏感的應用程式(可能有一組經過仔細維護且較小的依賴項,以維持足夠的效能)之外,大多數應用程式不應注意到加密/解密 IPC 訊息的執行時間成本,因為這些成本相對較小,而 AES-GCM 也相對較快。如果您不熟悉 AES-GCM,在此脈絡中唯一相關的是,它是 SubtleCrypto 中唯一包含的認證模式演算法,而且您可能已經每天都在 TLS 的保護下使用它。
每次啟動 Tauri 應用程式時,也會產生一個密碼安全金鑰。如果系統已經有足夠的熵來立即傳回足夠的隨機數字,通常在桌面環境中很常見,則通常不會注意到。如果在無頭環境中執行以執行一些 使用 WebDriver 的整合測試,則如果您的作業系統沒有包含,您可能需要安裝某種類型的熵產生服務,例如 haveged
。Linux 5.6(2020 年 3 月)現在包含使用推測執行產生的熵。
限制事項
隔離模式中有一些限制事項,這些限制事項源於平台不一致。最顯著的限制是外部檔案無法在 Windows 上的沙盒化 <iframes>
中正確載入。因此,我們在建置期間實作了一個簡單的腳本內嵌步驟,它會擷取相對於隔離應用程式的腳本內容,並將它們內嵌注入。這表示典型的綑綁或簡單包含檔案(例如 <script src="index.js"></script>
)仍然可以正常運作,但較新的機制(例如 ES 模組)將無法成功載入。
建議事項
由於隔離應用程式的重點是防範開發威脅,我們強烈建議您盡可能讓隔離應用程式保持簡單。您不僅應努力將相依性降至最低,還應考慮將所需的建置步驟降至最低。這樣一來,您就無需擔心針對您的隔離應用程式(除了您的前端應用程式之外)發動的供應鏈攻擊。
建立隔離應用程式
在此範例中,我們將建立一個小型 hello-world 風格的隔離應用程式,並將它連結到一個虛擬的現有 Tauri 應用程式。它不會驗證通過它的訊息,只會將內容印出到 WebView 主控台。
針對此範例的目的,讓我們假設我們位於與 tauri.conf.json
相同的目錄中。現有的 Tauri 應用程式已將其 distDir
設定為 ../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 模式 引導至隔離模式即可。
組態
假設我們的主前端 distDir
設定為 ../dist
。我們也會將我們的 Isolation 應用程式輸出到 ../dist-isolation
。
{
"build": {
"distDir": "../dist"
},
"tauri": {
"pattern": {
"use": "isolation",
"options": {
"dir": "../dist-isolation"
}
}
}
}