# セキュリティ設計書

## 概要

本ドキュメントは、Dear ImGui（v1.92.7 WIP）のセキュリティ設計について記載する。Dear ImGuiはC++で実装されたクロスプラットフォームのGUIライブラリであり、Webアプリケーションではなくデスクトップ/組み込みアプリケーション向けのライブラリである。そのため、一般的なWebセキュリティ（認証・認可、CSRF、XSS等）は適用されず、メモリ安全性、入力検証、コード品質に焦点を当てた設計となっている。

## 認証設計

### 認証方式

| 項目 | 内容 |
| --- | --- |
| 認証機能 | 該当なし |
| 理由 | Dear ImGuiはGUI描画ライブラリであり、ユーザー認証機能は提供していない。認証が必要な場合は、ホストアプリケーション側で実装する必要がある |

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | 該当なし | GUIライブラリのため、セッション概念は存在しない |
| セッション固定化対策 | 該当なし | 同上 |

**補足**: ImGuiContextという概念は存在するが、これはGUI状態管理用であり、セキュリティ上のセッション管理とは異なる。

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| 該当なし | 該当なし | GUIライブラリのため、ロールベースアクセス制御は提供していない |

### アクセス制御

Dear ImGuiはGUI描画ライブラリであり、アクセス制御機能は提供していない。アクセス制御が必要な場合は、ホストアプリケーション側で実装する必要がある。

**ライブラリレベルのアクセス制御**:
- `ImGuiInputTextFlags_ReadOnly`: 入力フィールドを読み取り専用に設定可能
- `ImGuiInputTextFlags_Password`: パスワード入力時のマスキング機能を提供

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | 該当なし（ネットワーク通信機能を提供していない） |
| HSTS | 該当なし |

**補足**: Dear ImGuiはローカルGUI描画に特化しており、ネットワーク通信機能は含まれない。Webベースのレンダリング（Emscripten/WebGL）を使用する場合は、ホストアプリケーション側でHTTPSを設定する必要がある。

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | 該当なし（通信機能を提供していない） |
| 保存データ | 該当なし（データ永続化機能を提供していない） |

**補足**: ImGuiの設定保存機能（imgui.ini）は平文で保存される。機密情報を含む設定を保存する場合は、ホストアプリケーション側で暗号化を実装する必要がある。

### 機密情報管理

1. **パスワード入力**: `ImGuiInputTextFlags_Password`フラグにより、入力文字をマスキング（`*`表示）可能
2. **クリップボード**: OSのクリップボード機能を使用。機密情報のクリップボード経由の漏洩はホストアプリケーション側で管理が必要
3. **メモリ上のデータ**: ライブラリ終了時にメモリは解放されるが、明示的なメモリワイプ機能は提供していない

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（Webブラウザベースのレンダリングは行わない。Emscripten使用時はWebGLを使用） |
| SQLインジェクション | 該当なし（データベース機能を提供していない） |
| CSRF | 該当なし（HTTP通信機能を提供していない） |
| バッファオーバーフロー | IM_ASSERT マクロによる境界チェック、固定サイズバッファへの入力長制限 |
| メモリ破壊 | カスタムメモリアロケータ機能（SetAllocatorFunctions）、アサーションによる検証 |
| 書式文字列攻撃 | IM_FMTARGS/IM_FMTLIST マクロによるprintf形式関数の引数検証（GCC/Clang） |

### 入力検証

1. **InputText系ウィジェット**:
   - `buf_size`パラメータによるバッファサイズ制限
   - `ImGuiInputTextFlags_CharsDecimal`: 数字のみ許可
   - `ImGuiInputTextFlags_CharsHexadecimal`: 16進数文字のみ許可
   - `ImGuiInputTextFlags_CharsUppercase`: 大文字のみ許可
   - `ImGuiInputTextFlags_CharsNoBlank`: 空白文字を除外
   - `ImGuiInputTextFlags_CallbackCharFilter`: カスタム文字フィルタリング

2. **数値入力ウィジェット**:
   - `ImGui::InputInt`/`InputFloat`: 数値型の検証
   - `ImGui::SliderInt`/`SliderFloat`: 範囲制限付き入力

3. **アサーションによる検証**:
   - `IM_ASSERT`マクロによるプログラマエラーの検出
   - `IMGUI_DEBUG_PARANOID`オプションによる追加検証

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| 該当なし | Dear ImGuiはログ出力機能を提供していない | 該当なし |

**補足**: アプリケーション側でGUI操作のログ記録が必要な場合は、ホストアプリケーション側で実装する必要がある。

## メモリ安全性設計

### メモリアロケータ

| 項目 | 内容 |
| --- | --- |
| デフォルトアロケータ | malloc/free（IMGUI_DISABLE_DEFAULT_ALLOCATORSで無効化可能） |
| カスタムアロケータ | `ImGui::SetAllocatorFunctions()`で独自アロケータを設定可能 |
| メモリリーク検出 | アサーションによる検証、Metrics/Debuggerウィンドウでの監視 |

### バッファ管理

```
imgui.h:
- ImVector<T>: 動的配列の安全な管理
- ImGuiTextBuffer: テキストバッファの安全な管理
```

| 対策 | 実装内容 |
| --- | --- |
| 境界チェック | IM_ASSERT によるインデックス検証 |
| バッファオーバーフロー防止 | InputText系関数での buf_size パラメータ必須 |
| メモリ解放 | ImGui::DestroyContext()での一括解放 |

## コンパイル時セキュリティオプション

| オプション | 説明 |
| --- | --- |
| IM_ASSERT | アサーションハンドラ（デフォルト: assert()） |
| IMGUI_DEBUG_PARANOID | 追加の安全性チェックを有効化 |
| IMGUI_DISABLE_DEFAULT_ALLOCATORS | デフォルトmalloc/freeの無効化 |
| IM_MSVC_RUNTIME_CHECKS_OFF/RESTORE | MSVCランタイムチェックの制御 |

## バックエンド固有のセキュリティ考慮事項

| バックエンド | セキュリティ考慮事項 |
| --- | --- |
| OpenGL | シェーダーインジェクション対策はホストアプリケーション側で実施 |
| DirectX (9/10/11/12) | COMオブジェクトの適切な解放、D3Dデバイスロストへの対応 |
| Vulkan | バリデーションレイヤーの使用推奨 |
| Metal | 該当する特別な考慮事項なし |
| WebGPU/Emscripten | Webセキュリティポリシー（CORS等）はホスト環境で設定 |

## 備考

1. **ライブラリの性質**: Dear ImGuiはGUI描画ライブラリであり、セキュリティ機能（認証、認可、暗号化等）は提供していない。これらの機能が必要な場合は、ホストアプリケーション側で実装する必要がある。

2. **信頼境界**: ImGuiは「信頼されたコード」から呼び出されることを前提としている。ユーザー入力は信頼できないものとして扱うべきであり、ImGuiに渡す前にホストアプリケーション側で検証することを推奨する。

3. **サードパーティ依存**:
   - stb_truetype.h（フォント処理）
   - stb_textedit.h（テキスト編集）
   - stb_rect_pack.h（矩形パッキング）
   - これらは信頼されたライブラリだが、フォントファイルなど外部データを処理する際は注意が必要

4. **静的解析**: GitHub Actionsで静的解析（PVS-Studio）が実行されており、コード品質が維持されている

5. **バージョン互換性チェック**: `IMGUI_CHECKVERSION()`マクロにより、コンパイル時のバージョンとリンク時のバージョンの整合性を検証可能
