In this article
Tauriの危険な落とし穴:デフォルトで組み込まれている5つのよくあるセキュリティ設定ミス
セキュリティモデルの強さは、デフォルト設定次第です。Tauriは、デスクトップアプリケーションを構築するためのセキュリティ重視のElectron代替として位置づけられています。そのアーキテクチャでは、Rustバックエンド(「Core」)とWebベースのフロントエンド(「Renderer」)の間で信頼を分離し、IPCレイヤーがアクセスを仲介します。
理論上、これは、Node.jsがレンダラープロセス内で動作するElectronの従来のモデルを大きく改善したものです(ただし現在のElectronでは、レンダラーでコンテキスト分離とサンドボックスがデフォルトで有効になっているため、Node.jsに直接アクセスできるのはメインプロセスだけです)。TauriはElectronより軽量にできるうえ、複数のバックエンドフレームワークに対応しており、Tauriに組み込むだけで実用的なデスクトップアプリを構築できるという利点もあります。
Tauriの設定項目を調査した結果、フレームワークのセキュリティ保証を知らないうちに損なう可能性がある、よくある設定ミスを5つ特定しました。その中には、デフォルト設定や公式サンプルに含まれているものもあります。
1. アセットプロトコルのワイルドカード:「/**/*」がディスク全体を意味するとき
Tauriのアセットプロトコルを使うと、フロントエンドからローカルファイルを読み込めます。画像の表示、ローカルデータの読み込み、静的コンテンツの配信などに便利です。問題は、スコープに/**/*のようなワイルドカードを設定した場合に発生します。
// src-tauri/tauri.conf.json
{
"security": {
"assetProtocol": {
"enable": true,
"scope": ["/**/*"]
}
}
}この設定では、どのレンダーウィンドウで実行されるJavaScriptからでもfetch("asset://localhost/etc/passwd")を呼び出して、アプリのプロセスがアクセスできる任意のファイルを読み取れます。ユーザー操作も確認ダイアログも不要で、追加の権限チェックもありません。
脅威となるのは、自分のコードだけではありません。XSSの脆弱性が1つあれば、侵害されたnpm依存関係や、WebView経由で挿入された悪意のあるスクリプトでさえ、ローカルファイルシステムの読み取りが可能になります。つまり、レンダラーがローカルファイルを窃取するツールになってしまいます。
対策:アセットプロトコルのスコープは、アプリが実際に必要とする特定のディレクトリに限定してください。本番環境では/**/*を絶対に使わないでください。アセットプロトコルが不要であれば、完全に無効化しましょう。
2. コマンドスコープが空だとすべて許可される
Tauriの権限システムでは、開発者がコマンドスコープを定義し、受け付ける入力を制限できます。しかし、コマンドにACLが設定されていない場合、コードはアクセスを拒否するのではなく、空のCommandScopeを返します。
これは直感に反する動作です。開発者は、未設定のコマンドではデフォルトですべての操作が拒否される(「デフォルトで拒否」する)と考えるかもしれません。しかし実際には、空のスコープに対するmatches()メソッドは、すべての入力に対してtrueを返します。
// Developer expects this to be restrictive, but it allows everything
fn handle_command(scope: CommandScope<MyArgs>) {
if scope.matches(&user_input) {
// This always passes when scope is empty
execute(user_input);
}
}デフォルトで拒否する動作を実現するには、開発者がscope.allows().is_empty()を手動で確認し、その場合の処理を実装する必要があります。
これが落とし穴その1と組み合わさると、コマンドのスコープを明示的に設定していない開発者は、気づかないうちに、あらゆるレンダラースクリプトに広範なアクセスを許してしまう可能性があります。
対策:アプリが公開するすべてのコマンドに、明示的な許可スコープを必ず定義してください。空のスコープはセキュリティ上のバグとして扱いましょう。スコープチェックをヘルパーでラップし、デフォルトで拒否する動作を徹底することも検討してください。
3. オブジェクトの凍結不足によるプロトタイプ汚染
Tauriではデフォルトで、レンダーラーのコンテキスト内のObject.prototypeは凍結されません。freezePrototypeオプションは用意されていますが、デフォルト値はfalseです。
TauriのIPC機構はJavaScriptを介して動作するため、これは重要な問題です。攻撃者がプロトタイプ汚染(JavaScriptではよく知られた攻撃手法)を実行できた場合、Tauriブリッジが依存するプロトタイプを変更して、IPC呼び出しを乗っ取る可能性があります。
// tauri.conf.json — not enabled by default
{
"app": {
"security": {
"freezePrototype": true
}
}
}プロトタイプ汚染はWebアプリケーションでも既知のリスクですが、ローカルシステムへのIPCアクセスを持つデスクトップアプリでは、影響が大幅に深刻化します。汚染されたプロトタイプによって、IPC呼び出しの転送先を変えたり、コマンド引数を変更したり、応答を傍受したりするおそれがあります。
対策:Tauriの設定でfreezePrototype: trueを指定してください。正当なコードへの影響を最小限に抑えながら、1行で変更できます。
4. ウィンドウ機能のワイルドカード指定
Tauriの機能システムでは、特定のウィンドウに権限を割り当てられます。しかし、ウィンドウ識別子にワイルドカードを使うと、その機能がアプリ内のすべてのウィンドウに付与されます。
{
"identifier": "my-capability",
"windows": ["*"],
"permissions": ["fs:allow-read-text-file"]
}このパターンは、動的に作成されたウィンドウ、新しいブラウザーウィンドウ、悪意のあるスクリプトが生成したウィンドウなど、すべてのウィンドウに適用されます。1つのウィンドウが侵害されても、攻撃者はほかのウィンドウへ侵入する必要がありません。すでに同じ権限を共有しているからです。
実際に、ウィンドウ間で過剰に広い権限を付与したTauriベースのアプリで、この問題が実証されています。その結果、本来は機能システムが提供するはずの隔離モデルが弱められていました。
対策:ウィンドウ識別子は必ず明示的に指定してください。機能の設定を確認し、権限が実際に必要な最小限のウィンドウだけに適用されていることを確かめましょう。
5. ナビゲーションのデフォルト設定が過剰に寛容
Tauriのデフォルトのナビゲーション動作では、WebViewが任意のURLに移動できます。組み込みの許可リストはありません。開発者が明示的にナビゲーション制限を実装する必要があります。
単独で見れば、中程度のリスクです。XSS攻撃によってWebViewがフィッシングサイトにリダイレクトされたり、ダウンロードが開始されたりする可能性があります。しかし、ウィンドウ機能のワイルドカード(落とし穴その4)や、弱いIPCオリジン制限と組み合わさると、権限昇格につながります。
攻撃の流れは次のとおりです。攻撃者は、権限のあるウィンドウを自身が管理するオリジンに移動させ、そのコンテキストからTauriのIPCコマンドを呼び出します。ウィンドウ機能に"*"が設定されていると、攻撃者のオリジンはその機能に割り当てられたすべての権限を引き継ぎます。
対策:許可するオリジンを制限するナビゲーションハンドラーを実装してください。アプリが読み込む必要のあるドメインへの移動だけを許可しましょう。
複合的な影響
これらの問題はそれぞれ個別に文書化されており、CVEが割り当てられているものもあります(IPCアクセス制御の回避に関するCVE-2024-35222や、シンボリックリンクによるスコープ回避に関するCVE-2022-39215など)。しかし、本当のリスクは、これらが重なり合ったときに生じます。
デフォルト設定のTauriアプリにXSSの脆弱性が1つあるだけで、凍結されていないプロトタイプによるIPCの乗っ取り、ワイルドカードスコープによるあらゆるコマンドへのアクセス、アセットプロトコルのワイルドカードによるファイルシステムの読み取り、そして寛容なナビゲーションによる攻撃者管理下のオリジンへのデータ流出へと、攻撃を連鎖させる可能性があります。
Tauriのセキュリティモデルは、アーキテクチャの点でElectronに似ています。しかし、アーキテクチャだけでは安全なソフトウェアは実現できません。重要なのはデフォルト設定です。現状、Tauriのデフォルト設定のいくつかは、フレームワークが提供するはずのセキュリティ保証を損なっています。
推奨する対策
tauri.conf.jsonと機能設定ファイルを確認し、上記の各落とし穴に該当しないか監査するfreezePrototype: trueを設定するすべてのワイルドカードスコープ(
/**/*、*)を、明示的なパスとウィンドウ識別子に置き換えるナビゲーションの許可リストを実装する
公開するすべてのコマンドに、明示的な許可・拒否スコープを追加する
Snykを使って、TauriアプリケーションのRustおよびJavaScript依存関係に既知の脆弱性がないかスキャンする
1つの欠陥がシステム全体の侵害につながるような設定ミスの連鎖から、デスクトップアプリを守れていますか?ホワイトペーパー「Python環境におけるAIセキュリティの危機」をダウンロードして、現代のチームがさまざまなプログラミング言語やフレームワークで、AI主導の開発をどのように保護しているかをご覧ください。