# セキュリティ設計書

## 概要

本ドキュメントは、CoffeeScript（バージョン2.7.0）コンパイラプロジェクトのセキュリティ設計について記載する。CoffeeScriptはJavaScriptへコンパイルする言語およびコンパイラであり、Webアプリケーションフレームワークではないため、認証・認可・セッション管理などの一般的なセキュリティ機能は実装されていない。本書では、コンパイラとしてのセキュリティ考慮事項を中心に記載する。

## 認証設計

### 認証方式

本プロジェクトはコンパイラ/言語処理系であり、ユーザー認証機能は実装されていない。

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | N/A | コンパイラのため該当なし |
| セッション固定化対策 | N/A | コンパイラのため該当なし |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| N/A | N/A | コンパイラのため権限体系は存在しない |

### アクセス制御

コンパイラとしてのアクセス制御は、Node.jsのファイルシステム権限およびOSレベルの権限管理に依存する。コンパイル実行時は、実行ユーザーの権限でファイルの読み書きが行われる。

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | N/A（スタンドアロンコンパイラのため該当なし） |
| HSTS | N/A（スタンドアロンコンパイラのため該当なし） |

### ブラウザ環境での通信

ブラウザ版CoffeeScript（`browser.coffee`）では、XHR（XMLHttpRequest）を使用してリモートスクリプトを読み込む機能がある。

| 項目 | 実装内容 |
| --- | --- |
| XHR利用 | `CoffeeScript.load()`でリモートCoffeeScriptファイルを読み込み |
| 同一オリジン制約 | ブラウザのCORS制約に従う |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | N/A（コンパイラのため該当なし） |
| 保存データ | N/A（コンパイラのため該当なし） |

### 機密情報管理

コンパイラとして特定の機密情報管理機能は実装されていない。Babel連携時のトランスパイル設定など、外部設定ファイル（`.babelrc`等）はユーザー責任で管理される。

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | コンパイラ自体はXSS対策を提供しない。ブラウザ版では`eval`および`Function`を使用してコードを実行するため、信頼できないソースからのコードの実行には注意が必要 |
| SQLインジェクション | N/A（データベース機能なし） |
| CSRF | N/A（Webアプリケーションフレームワークではないため該当なし） |

### コード実行における考慮事項

| 機能 | ファイル | セキュリティ考慮事項 |
| --- | --- | --- |
| `CoffeeScript.eval()` | `browser.coffee:13-16`, `index.coffee:66-100` | `globalRoot['eval']`を使用してコードを実行。信頼できないコードの実行は避けるべき |
| `CoffeeScript.run()` | `browser.coffee:19-22` | `Function()`コンストラクタでコードを実行 |
| `CoffeeScript.load()` | `browser.coffee:40-56` | XHRでリモートスクリプトを読み込み実行。クロスオリジンの制約あり |
| REPL `eval` | `repl.coffee:17-27` | Node.js VMコンテキストでコードを評価 |
| `vm.runInContext()` | `index.coffee:99-100` | サンドボックス環境でのコード実行 |

### 入力検証

| 検証項目 | 実装場所 | 説明 |
| --- | --- | --- |
| エスケープシーケンス検証 | `lexer.coffee:1152-1169` | 無効なエスケープシーケンス（8進数、不正なUnicode等）を検出 |
| Unicodeコードポイント検証 | `helpers.coffee:307-319` | `\u{...}`形式のUnicodeエスケープを検証（0x10ffffを超える値を拒否） |
| 予約語チェック | `lexer.coffee:1258-1268` | JavaScript予約語の使用を検出してエラー |
| Shebangライン検証 | `coffeescript.coffee:325-336` | シェバン行の引数数をチェック（Linux互換性警告） |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| コンパイルログ | `--watch`モード時のコンパイル成功/失敗メッセージ | 出力のみ（永続化なし） |
| エラーログ | 構文エラー、コンパイルエラーの詳細 | 出力のみ（永続化なし） |

### 監査ログ出力例

- `command.coffee:433`: `timeLog "compiled #{sourcePath}"` - コンパイル成功時のタイムスタンプ付きログ
- `command.coffee:367`: `timeLog "removed #{source}"` - ファイル削除時のログ

## セキュリティ上の考慮事項

### コード実行のリスク

1. **`eval`/`Function`の使用**: ブラウザ版およびNode.js版の両方で、コンパイルされたJavaScriptを実行するために`eval`または`Function`コンストラクタを使用している。これらは信頼できないコードを実行する場合にセキュリティリスクとなる。

2. **`child_process.spawn`の使用**: `command.coffee:535`で`spawn`を使用してNode.jsプロセスをフォークしている。コマンドライン引数は適切に処理されている。

3. **動的`require`**: 複数の箇所で動的な`require`が使用されている（Babel連携等）。これらはユーザー指定のモジュールをロードする可能性がある。

### 推奨事項

| 項目 | 推奨事項 |
| --- | --- |
| 信頼できないコード | CoffeeScriptで信頼できないソースからのコードをコンパイル・実行しない |
| ブラウザ環境 | `CoffeeScript.load()`で読み込むスクリプトは信頼できるソースに限定する |
| サンドボックス | `CoffeeScript.eval()`使用時は、分離されたサンドボックス環境（`vm.createContext`）の使用を検討する |

## 依存関係のセキュリティ

### 開発依存パッケージ

| パッケージ | バージョン | 用途 |
| --- | --- | --- |
| @babel/core | ~7.17.9 | トランスパイル |
| @babel/preset-env | ~7.16.11 | Babel設定 |
| jison | ~0.4.18 | パーサー生成 |
| puppeteer | ~13.6.0 | テスト用ブラウザ自動化 |
| webpack | ~5.72.0 | バンドル |

### 本番依存パッケージ

CoffeeScriptは本番環境での外部依存パッケージを持たない（dependencies未定義）。これにより、サプライチェーン攻撃のリスクが低減されている。

## 備考

- 本プロジェクトはMITライセンスで公開されている
- Node.js 6以上が必要
- ブラウザ版とNode.js版で異なる実行環境に対応
- ESモジュールとCommonJSの両形式に対応
