# セキュリティ設計書

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータのセキュリティ設計について記述します。GhosttyはZig言語で実装されたクロスプラットフォームのターミナルエミュレータであり、ネイティブアプリケーションとして動作します。本プロジェクトはWebアプリケーションではないため、従来のWeb向けセキュリティ対策（CSRF、SQLインジェクション等）は適用対象外です。代わりに、ターミナルエミュレータ固有のセキュリティリスクに対応した設計となっています。

## 認証設計

### 認証方式

Ghosttyはローカルで動作するネイティブアプリケーションであり、独自の認証システムは実装していません。ユーザー認証はOSレベルで行われ、アプリケーションは現在のOSユーザーの権限で実行されます。

| 項目 | 内容 |
| --- | --- |
| 認証方式 | OSレベル認証（アプリケーション固有の認証なし） |
| ユーザー管理 | OSのユーザー管理に委任 |

### セッション管理

Ghosttyはターミナルエミュレータであり、Webアプリケーション的なセッション管理は行いません。PTY（疑似端末）セッションの管理は以下の方式で行われます。

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| PTYセッション | プロセス単位で管理 | 各ターミナルサーフェスが独立したPTYを持つ |
| セッション終了確認 | `confirm-close-surface`設定で制御 | `true`（デフォルト）、`false`、`always`から選択可能 |
| プロセス分離 | fork/execによる子プロセス実行 | CLOEXEC設定によるファイルディスクリプタ漏洩防止 |

## 認可設計

### 権限体系

Ghosttyはターミナルエミュレータとして、アプリケーション内でのユーザーロール管理は行いません。権限はOSレベルの権限に依存します。

| ロール | 権限 | 説明 |
| --- | --- | --- |
| OSユーザー | 完全操作 | アプリケーションを起動したユーザーの権限で動作 |

### アクセス制御

#### クリップボードアクセス制御

ターミナルアプリケーションからのクリップボードアクセスは、セキュリティ上重要な機能です。Ghosttyは設定ベースのアクセス制御を提供しています。

| 設定項目 | デフォルト値 | 説明 |
| --- | --- | --- |
| `clipboard-read` | `ask` | クリップボード読み取りアクセス（`allow`/`ask`/`deny`） |
| `clipboard-write` | `allow` | クリップボード書き込みアクセス（`allow`/`ask`/`deny`） |
| `clipboard-paste-protection` | `true` | 安全でないペースト操作の確認要求 |
| `clipboard-paste-bracketed-safe` | `true` | ブラケットペーストモード時の安全性判定 |

#### Linuxリソース制御（cgroup）

Linux環境では、systemd cgroupを使用したリソース制限が可能です。

| 設定項目 | デフォルト値 | 説明 |
| --- | --- | --- |
| `linux-cgroup-memory-limit` | 未設定（無制限） | ターミナルプロセスのメモリ上限（MemoryHigh設定） |
| `linux-cgroup-processes-limit` | 未設定（無制限） | ターミナルプロセス数の上限（TasksMax設定） |

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| ネットワーク通信 | 本アプリケーションはネットワーク通信を行わない（クラッシュレポートの手動送信を除く） |
| プロセス間通信 | PTYを介した標準入出力による通信 |
| ファイルディスクリプタ | CLOEXEC設定により子プロセスへの漏洩を防止 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | 該当なし（ローカルPTY通信のみ） |
| 保存データ | 該当なし（設定ファイルは平文保存） |
| クラッシュレポート | ローカル保存のみ、ネットワーク送信はユーザー操作が必要 |

### 機密情報管理

Ghosttyは機密情報をアプリケーション内で管理しません。ターミナル内でユーザーが入力する機密情報（パスワード等）は、PTYを介して子プロセスに渡されます。

#### クラッシュレポートのプライバシー

クラッシュレポートは`$XDG_STATE_HOME/ghostty/crash`ディレクトリに保存されます。

| 項目 | 内容 |
| --- | --- |
| 自動送信 | なし（ユーザーが手動で送信する必要あり） |
| 保存形式 | Sentry envelope形式 |
| 含まれる可能性のある情報 | スタックメモリ（機密情報を含む可能性あり） |

## 入出力対策

### ペースト攻撃対策

ターミナルエミュレータにおける「コピー/ペースト攻撃」は、悪意のあるテキストをクリップボードにコピーし、ユーザーにペーストさせることで意図しないコマンドを実行させる攻撃です。

| 脅威 | 対策 | 実装箇所 |
| --- | --- | --- |
| 改行を含むペースト | `clipboard-paste-protection`設定により確認ダイアログ表示 | `src/input/paste.zig` |
| ブラケットペースト終端インジェクション | `\x1b[201~`シーケンスの検出と警告 | `src/input/paste.zig` |
| 危険な制御文字 | NUL、BS、ESC、DEL等をスペースに置換 | `src/input/paste.zig` |

#### ペーストエンコーディングで除去される制御文字

以下の制御文字はペースト時にスペースに置換されます（xtermの動作に準拠）：

- `0x00` (NUL)
- `0x03` (VINTR/Ctrl+C)
- `0x04` (EOT)
- `0x05` (ENQ)
- `0x08` (BS)
- `0x0F` (VDISCARD/Ctrl+O)
- `0x11` (VSTART/Ctrl+Q)
- `0x12` (VREPRINT/Ctrl+R)
- `0x13` (VSTOP/Ctrl+S)
- `0x15` (VKILL/Ctrl+U)
- `0x16` (VLNEXT/Ctrl+V)
- `0x17` (VWERASE/Ctrl+W)
- `0x1A` (VSUSP/Ctrl+Z)
- `0x1B` (ESC)
- `0x1C` (VQUIT/Ctrl+\\)
- `0x7F` (DEL)

### VTパーサーのセキュリティ

| 脅威 | 対策 | 実装箇所 |
| --- | --- | --- |
| バッファオーバーフロー | 固定サイズの中間バッファ使用（MAX_INTERMEDIATE=4） | `src/terminal/Parser.zig` |
| CSIパラメータ過剰 | MAX_PARAMS=24の制限 | `src/terminal/Parser.zig` |
| 不正なシーケンス | ステートマシンによる厳密な構文解析 | `src/terminal/Parser.zig` |

### OSCコマンドのアクセス制御

| 機能 | 対策 |
| --- | --- |
| OSC 52（クリップボード） | `clipboard-read`/`clipboard-write`設定による制御 |
| Kitty Clipboard Protocol（OSC 5522） | 同上 |
| OSC色レポート | `osc-color-report-format`設定による制御 |

## プロセス実行セキュリティ

### 子プロセス実行

| 項目 | 対策 |
| --- | --- |
| ファイルディスクリプタ漏洩 | マスターFDにCLOEXECフラグを設定 |
| シグナル処理 | fork後、exec前にシグナルハンドラをリセット |
| プロセスグループ | setsid()による新規セッション作成 |
| 制御端末 | TIOCSCTTYによる制御端末の設定 |

### Windows固有のセキュリティ

| 項目 | 対策 |
| --- | --- |
| 名前付きパイプ | ローカルパイプ（`\\.\pipe\LOCAL\ghostty-pty-*`）を使用 |
| ハンドル継承 | `SetHandleInformation`による継承制御 |

## 監査ログ

Ghosttyは標準的なアプリケーションログを出力しますが、専用の監査ログ機能は実装していません。

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| アプリケーションログ | 内部エラー、デバッグ情報 | セッション中のみ |
| クラッシュレポート | スタックトレース、スレッド情報 | 手動削除まで永続保存 |

## 備考

### ターミナルエミュレータ固有のセキュリティ考慮事項

1. **ブラケットペーストモード**: ターミナルアプリケーションがブラケットペーストモード（モード2004）を有効にしている場合、ペーストされたデータは`\x1b[200~`と`\x1b[201~`で囲まれます。これにより、アプリケーションはペーストされたデータを識別でき、コマンドとして誤実行することを防止できます。

2. **KAMモード（キーボードアクションモード）**: ANSIモード2のKAMモードは、設定により無効化可能です。これは、悪意のあるシーケンスによるキーボード入力の無効化を防ぎます。

3. **リソース制限の復元**: fork後、exec前に、Ghosttyが設定したrlimitsを復元します。これにより、子プロセスがGhosttyの内部設定の影響を受けないようにします。

### プロジェクトの特性

- 本プロジェクトはWebアプリケーションではないため、XSS、CSRF、SQLインジェクション等のWeb固有の脆弱性対策は適用対象外です。
- ネットワーク通信を行わないため、TLS/SSL設定やCORS設定は該当しません。
- ユーザー認証・認可はOSレベルに委任しており、アプリケーション固有の認証機構は持ちません。
