---
title: アプリケーション・ライフサイクルでの脅威
sidebar:
  order: 9
i18nReady: true
---

Tauri アプリケーションは、アプリケーション・ライフサイクル（製品寿命）の様々な時点で作られた数多くの部分から構成されています。
ここでは、従来からある脅威と、それに対して**どのように対処すべきか**について説明します。

その個々の処理手順をすべて、以下の各セクション毎に説明します。

![Threat Stages During Development](@assets/concept/application-flow-simple.svg)

> > > Upstream：　[上流工程での脅威](#上流工程での脅威)
> > > Development：　[開発時の脅威](#開発時の脅威)
> > > Building：　[ビルド時の脅威](#ビルド時の脅威)
> > > Distribution：　[配布時の脅威](#配布時の脅威)
> > > Runtime：　[実行時の脅威](#実行時の脅威)

:::note[（注記）]
アプリケーション・ライフサイクルでの最も弱いリンク箇所が、基本的にはセキュリティ内容を決定する場所になります。
各段階での処理が、その後に続くすべての段階の前提と整合性を損ねる可能性がありますので、常に全体像を把握することが重要です。
:::

## 上流工程での脅威

Tauri はあなたのプロジェクトの直接的な拠り所であり、コミット、レビュー、プル・リクエスト、リリースの厳格な作成者の管理を行なっており、
依存関係を最新の状態に保ち、更新またはフォーク・修正を行なうための措置を講じることに最善を尽くしています。Tauri 以外で作成するプロジェクトではそれほど適切に管理されず、監査も一度も行なわれていないかもしれません。

{/* 原文は a direct dependency on 「直接依存」となっているが、文意不明のため「拠り所」と意訳 */}

他からのプロジェクトを統合する際には、その健全性を考慮してください。さもないと、知らないうちにアーキテクチャ由来の「負債」を抱えてしまう可能性があります。

### 自分のアプリケーションを最新の状態に保つ

アプリを「在野に」リリースする場合、Tauri が含まれたバンドルも出荷することになります。
Tauri に影響する脆弱性があれば、アプリケーションのセキュリティにも影響を及ぼす可能性があります。
Tauri を最新バージョンに更新することで、すでに重大な脆弱性にパッチが当てられ、アプリケーションで悪用されないようになるのです。
また、コンパイラ（`rustc`）とトランスパイラ（`nodejs`）も最新の状態に保ってください。というのも、セキュリティ上の問題が解決されていることがよくあるからです。
これは開発システム全般にも言えることです。

### 依存関係の評価

NPM（Node Package Manager）と Crates.io は多くの便利なパッケージを提供していますが、
信頼できるサードパーティのライブラリを選択するのはあなたの責任です。あるいは Rust で全部書き直してください。
既知の脆弱性の影響を受けていたり、メンテナンスされていない古いライブラリを使用すると、アプリケーションのセキュリティと心地よい一夜の眠りが危険に曝されることになるかもしれません。

このプロセスを自動化するために [`npm Audit`](https://docs.npmjs.com/cli/v10/commands/npm-audit) や [`cargo Audit`](https://crates.io/crates/cargo-audit) などのツールを利用し、セキュリティ・コミュニティの重要な取り組みに頼りましょう。

[`cargo-vet`](https://github.com/mozilla/cargo-vet) や [`cargo crev`](https://github.com/crev-dev/cargo-crev) のような Rust エコシステムの最近の傾向は、サプライチェーン攻撃の可能性をさらに低減するのに役立つでしょう。
自分が誰の肩の上に立っているか、すなわち、どの先人の知識を利用させて貰っているのか、を知るには、[`cargo supply chain`](https://github.com/rust-secure-code/cargo-supply-chain) ツールを使用してください。

私たちが強く推奨推奨している方法は、最善策として「リビジョンのハッシュ値（hash revisions）」を、次善の策としては「名前付きタグ（named tags）」を使用して、git からの重要な依存関係のみを使用することです。
これは Rust だけでなく Node のエコシステムにも当てはまります。

## 開発時の脅威

開発者であるあなたは、開発環境に気を配っていることと思います。
使用しているオペレーティング・システム、ビルド・ツールチェーン、および関連する依存関係が最新の状態に保たれ、適切に保護されているかを確認するのはユーザーであるあなたの責任です。

私たち全員が直面している真のリスクは、「サプライチェーン攻撃」と呼ばれるもので、それは通常、あなたのプロジェクトの直接的な依存関係に対する攻撃であると考えられます。
しかしながら、開発マシンを直接標的とする攻撃が巷では増加しており、この問題に正面から取り組んで備えておきましょう。

### 開発サーバー

Tauri アプリケーションのフロントエンドは、さまざまな Web フレームワークを使用して開発できます。
これらのフレームワークはどれも、通常、独自の開発サーバーを提供しており、フロントエンド・アセットはオープン・ポート経由でローカル・システムやネットワークに公開されています。
これにより、フロントエンドを Webview またはブラウザ内で「ホットリロード」（アプリ実行中のコード変更適用）してデバッグできるようになります。

実際には、この接続はデフォルトでは大抵、暗号化も認証もされていません。
このことは組み込みの Tauri 開発サーバーにも当て嵌まり、あなたのフロントエンドとアセットがローカル・ネットワークに公開されます。さらに、これにより攻撃者は、攻撃者と同じネットワーク内の開発デバイスに攻撃者自身のフロントエンド・コードをプッシュできます。
どのような機能・内容が公開されているのかによりますが、最悪の場合、デバイスのセキュリティ侵害につながる可能性があります。

あなたの開発デバイスを安全に公開できる信頼できるネットワークでのみ開発を行なう必要があります。
それが不可能な場合は、開発サーバーがあなたの開発デバイスとの接続に、**相互**認証と暗号化（mTLS など）を使用していることを**絶対に**確認してください。

> > > 《訳注》mTLS = mutual Transport Layer Security： 相互TLS認証。

:::note[（注記）]
組み込みの Tauri 開発サーバーは、現時点では「相互認証」と「トランスポート暗号化」に対応していないため、信頼できないネットワークでは使用しないでください。
:::

### 開発マシンの強化

自分の開発システムを強化することについては、さまざまな要因と個人々々の脅威モデルによって異なりますが、一般的なアドバイスとして、以下のようなことをお勧めします：

- コーディングなどの日常的なタスクに管理者アカウントを使用しない
- 開発マシンで本番環境の秘密情報を使用しない
- 秘密情報をソースコードのバージョン管理で検証しない
- セキュリティ・ハードウェア・トークンなどを使用して、セキュリティ侵害のあるシステムの影響を軽減する
- 自分のシステムを最新の状態に保つ
- インストールするアプリケーションを最小限に抑える

より実用的な方法についての様々な情報は、[優れたセキュリティ強化コレクション](https://github.com/decalage2/awesome-security-hardening) （英語サイト）でご覧いただけます。

もちろん、自分の開発環境を仮想化して攻撃者を喰い止めることもできますが、それでは、開発マシンだけを標的にしたものではなく、あなたのプロジェクトそのものを標的とする攻撃には対処できません。

### ソース管理認証と承認の確実な実施

大多数の開発者と作業している場合と同様に、ソースコードのバージョン管理ツールとサービス・プロバイダーを利用することは、開発中の不可欠な手順です。

あなたのソースコードが権限のない者によって変更されないようにするためには、ソースコード・バージョン管理システムのアクセス制御を理解し、正しく設定することが重要です。

また、悪意のあるコミットが、セキュリティ侵害を受けていない、あるいは悪意を持たない貢献者によるものと誤認される状況を防ぐために、すべての（いつもの）貢献者に対して、コミットへの署名を要求することを検討してください。

## ビルド時の脅威

現代のシステム開発では、バイナリ成果物を作成するために「CI/CD」（継続的インテグレーション／継続的デリバリー）と呼ばれるアプリケーション開発自動化プロセスを使用しています。

こうしたリモート・システム（およびサードパーティ所有のシステム）では、ソースコードやシークレットにアクセス可能で、生成されたバイナリがあなた自身のローカル・コードと同じであるかをあなたが検証可能な形で証明できない形でビルドを変更できてしまいますので、これらのシステムを完全に信頼できる必要があります。
つまり、信頼のおけるプロバイダーを頼りにするか、自らの管理されたハードウェアでこうしたシステムをホストする必要があります。

Tauri では、複数のプラットフォームでアプリを構築するための GitHub ワークフローを提供しています。
もし自分自身で CI/CD を構築し、サードパーティのツールに依存している場合は、あなたがバージョンを明示的に固定していないアクションには注意してください。

あなたは、配布先のプラットフォームに合わせて、作成したアプリのバイナリに署名する必要があります。
このやりかたはセットアップが複雑で、多少コストがかかる可能性がありますが、エンド・ユーザーはあなたのアプリが正式にあなたから発行されたものであるという証を求めています。

暗号化の秘密がハードウェア・トークンに適切に保存されている場合、セキュリティ侵害されたビルド・システムでは関連する署名キーを漏洩することはできませんが、悪意のあるリリースの署名に使用することはできます。

### 再現可能なビルド

ビルド時の「バックドア・インジェクション」（バックドア型攻撃）に対抗するには、ビルドを再現可能にする必要があります。そうすることで、自分の PC でビルドしたときでも、別の独立したプロバイダーでビルドしたときでも、ビルド・アセットがまったく同じであることを検証できます。

第一の問題は、Rust が完全に**信頼性のある**再現可能なビルドをデフォルトで生成していないことです。理論上はこれをサポートしていますが、まだバグがあり、最近のリリースでは中止になりました。

現在の状況は、Rust プロジェクトの [公開バグ・トラッカー](https://github.com/rust-lang/rust/labels/A-reproducibility) で追跡できます。

次に遭遇する問題は、多くの一般的なフロントエンド・バンドラーも再現可能な出力を生成しないことで、そのため、バンドルされたアセットが再現可能なビルドを破損する可能性があることです。

つまり、デフォルトでの再現可能なビルドに完全に頼ることはできず、残念ながら自分のビルド・システムに全幅の信頼を置くしかありません。

## 配布時の脅威

私たちは、アプリへのホット・アップデート（再起動不要の更新）をできる限り簡単かつ安全に配信できるように最善を尽くしました。
ただし、マニフェスト・サーバー、ビルド・サーバー、あるいはバイナリ・ホスティング・サービスの管理ができないと、すべてが台無しになります。

自分でシステムを構築する場合は、専門の OPS アーキテクトに相談して適切に構築してください。

> > > 《訳注》 OPS = Official Production System（プロダクションシステム記述言語）？

もし、Tauri アプリの信頼できる配信サービスをお探しの場合、Tauri のパートナーである CrabNebula がクラウド・サービスを提供しています： [https://crabnebula.dev/cloud](https://crabnebula.dev/cloud)

## 実行時の脅威

私たちは Webview が安全ではないと考えており、信頼できないユーザーランド・コンテンツを読み込むという観点から、Webview からシステム API へのアクセスに関していくつかの保護を Tauri に実装することにしました。

> > > 《訳注》 **ユーザーランド**　オペレーティング・システムの中核（カーネル）以外の部分。一般ユーザーの権限で操作できる領域。

[コンテンツ・セキュリティ・ポリシー](/ja/security/csp/)を使用すると、Webview が実行できる通信タイプを封鎖します。
さらに、[セキュリティ・レベル](/ja/security/capabilities/) 設定により、信頼できないコンテンツやスクリプトが Webview 内の API にアクセスするのを防ぐことができます。

また、[Tauri への情報提供](/ja/security/#協調的な情報開示)と同様の、脆弱性を報告するための簡単で安全な方法を設定することもお勧めします。

<div style="text-align: right;">
  【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>
