# 安全性について
AI がファイルを読み書きする以上、「勝手に大事なファイルを壊さないか?」は
当然の心配です。このドキュメントでは、サーバーが備えている安全機構を説明します。
---
## 1. サンドボックス(ファイルアクセス制限)
サーバーは **2 つのフォルダだけ** にアクセスできます。
それ以外のフォルダやファイルには一切触れません。
| 許可されたフォルダ | 内容 |
|---|---|
| **作業フォルダ** | STL / 3MF / G-code の置き場所(`--workdir` で指定) |
| **OrcaSlicer 設定フォルダ** | プロファイル(machine / filament / process)の保存場所 |
### 許可されていない場所にアクセスしようとすると?
即座にエラーが返され、操作は実行されません。
```
[403 Forbidden] Access denied: path "/etc/passwd" is outside the allowed directories
```
### パストラバーサル攻撃への対策
`../../etc/passwd` のように `..` を使ってフォルダ外に脱出しようとする
パス操作(パストラバーサル)は、すべてブロックされます。
以下のようなパスはすべて拒否されます:
- `../../windows/system32/config`
- `../../../etc/shadow`
- `subdir/../../../secret`
サーバーはパスを正規化(解決)してから、
許可リストに含まれるかどうかを判定しています。
---
## 2. ファイル名のバリデーション
ファイル名に使える文字は **厳密に制限** されています。
### 使える文字
- 英数字(`a-z`, `A-Z`, `0-9`)
- アンダースコア(`_`)
- ハイフン(`-`)
- ピリオド(`.`)
- スペース(` `)
### 拒否される文字の例
| 入力 | 拒否理由 |
|---|---|
| `../evil.json` | パス区切り文字 `/` を含む |
| `$(whoami).json` | シェルメタ文字 `$()` を含む |
| `` a`b`.json `` | バッククォートを含む |
| `file;rm -rf /` | セミコロンを含む |
これにより、ファイル名を通じたコマンドインジェクションを防止しています。
---
## 3. 元ファイルの保護(dry_run モード)
`update_profile_setting` でプロファイルの設定を変更するとき、
**デフォルトでは元のファイルを上書きしません**。
代わりに `_tuned` という接尾辞をつけたコピーファイルに保存されます。
```
元ファイル: standard_quality.json ← 変更されない
保存先: standard_quality_tuned.json ← 変更後の内容
```
これにより:
- 元の設定にいつでも戻せます
- 試行錯誤しても安全です
- AI が誤った値を設定しても、元ファイルは無傷です
明示的に `dry_run: false` を指定した場合のみ、元ファイルが直接上書きされます。
---
## 4. コマンドインジェクション対策
OrcaSlicer の CLI を呼び出す際、以下の対策を取っています:
- **`shell: true` は使用していません**: コマンドはシェルを介さず直接実行されます
- **引数は配列として渡されます**: 文字列結合ではなく `['--slice', 'input.stl', '-o', 'output.gcode']` の形式
- **ファイル名は事前にバリデーションされます**: シェルメタ文字を含むファイル名は拒否されます
---
## 5. 変更履歴の記録(監査ログ)
AI がプロファイルの設定を変更するたびに、
作業フォルダの `tuning_history.log` に記録が残ります。
### ログの形式
```json
{"ts":"2025-01-15T10:30:00.000Z","action":"update_profile_setting","type":"process","profile":"standard_quality.json","savedAs":"standard_quality_tuned.json","key":"infill_density","oldValue":20,"newValue":40,"dryRun":true}
```
### 記録される内容
| フィールド | 説明 |
|---|---|
| `ts` | 変更日時(ISO 8601 形式) |
| `action` | 実行された操作 |
| `type` | プロファイル種別 |
| `profile` | 元のプロファイル名 |
| `savedAs` | 実際に保存されたファイル名 |
| `key` | 変更された設定キー |
| `oldValue` | 変更前の値 |
| `newValue` | 変更後の値 |
| `dryRun` | dry_run モードだったかどうか |
このログを使えば、「いつ、何を、どう変えたか」を後から追跡できます。
---
## 6. スライスのタイムアウト
`slice_model` ツールには **5 分のタイムアウト** が設定されています。
OrcaSlicer のプロセスが何らかの理由でハングアップ(応答なし)になっても、
5 分後に自動的に強制終了されます。
タイムアウト値は `timeout_ms` 引数で変更できます。
---
## まとめ
| 脅威 | 対策 |
|---|---|
| 許可外フォルダへのアクセス | サンドボックス(許可リスト方式) |
| パストラバーサル(`../` 攻撃) | パスの正規化 + 許可リスト検証 |
| コマンドインジェクション | shell: false + 引数配列 + ファイル名バリデーション |
| 設定ファイルの破壊 | dry_run モード(デフォルト ON) |
| 変更の追跡不能 | 監査ログ(tuning_history.log) |
| プロセスのハングアップ | 5 分タイムアウト |
---
次のステップ: [トラブルシューティング](troubleshooting.md) でよくある問題の解決方法を確認しましょう。