# セキュリティ設計書

## 概要

本ドキュメントは、Babel（JavaScriptコンパイラ/トランスパイラ）プロジェクトにおけるセキュリティ設計について記載する。Babelはビルドツールとして動作するライブラリであり、Webアプリケーションとは異なるセキュリティモデルを持つ。主なセキュリティ対策は、入力検証、依存関係管理、CI/CDセキュリティ、および脆弱性報告プロセスに焦点を当てている。

## 認証設計

### 認証方式

Babelはビルドツール/ライブラリであり、エンドユーザー認証機能は持たない。ただし、以下のコンテキストで認証が関係する。

| コンテキスト | 認証方式 | 説明 |
| --- | --- | --- |
| npm公開 | npm認証トークン | パッケージ公開時のnpmレジストリ認証 |
| GitHub Actions | GITHUB_TOKEN | CI/CDワークフローでの認証 |
| GitHub Actions | BOT_TOKEN (secrets) | リリース自動化での権限昇格認証 |

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | 該当なし | ビルドツールのためセッション管理なし |
| セッション固定化対策 | 該当なし | ビルドツールのためセッション管理なし |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| GitHub Actions (contents: read) | リポジトリ読み取り | CI/CDでのコードチェックアウト |
| GitHub Actions (contents: write) | リポジトリ書き込み | リリースコミット・タグプッシュ |
| GitHub Actions (id-token: write) | OIDC トークン発行 | npm公開時のProvenance認証 |
| npm environment | npm公開権限 | npmパッケージの公開制御 |

### アクセス制御

GitHub Actionsのワークフローレベルで最小権限の原則に基づくアクセス制御を実施。

```yaml
permissions:
  contents: read  # デフォルトで読み取り専用
```

- リリースワークフローでのみ `contents: write` を付与
- npm公開は `environment: npm` で環境分離

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | npm/GitHubとの通信は全てHTTPS経由 |
| HSTS | 該当なし（ライブラリのため） |
| パッケージ整合性 | yarn.lockによる依存関係の固定 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | HTTPS (TLS) - npm/GitHub APIとの通信 |
| 保存データ | 該当なし（ソースコードリポジトリ） |

### 機密情報管理

- GitHub Secrets: `GITHUB_TOKEN`, `BOT_TOKEN`, `CODECOV_TOKEN`
- npm認証トークン: GitHub環境変数として保護
- `.gitignore` による機密ファイルの除外

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（ビルドツールのためUI無し） |
| SQLインジェクション | 該当なし（データベース使用なし） |
| CSRF | 該当なし（Webアプリケーションではない） |
| コードインジェクション | 設定オプションの厳格なバリデーション |
| 不正な入力 | `@babel/helper-validator-option` による型検証 |
| プロトタイプ汚染 | オブジェクト操作時の安全な処理 |

### 入力バリデーション詳細

Babelは以下のバリデーション機構を実装している。

#### option-assertions.ts
```typescript
// 型安全なオプション検証
export function assertString(loc: GeneralPath, value: unknown): string | undefined
export function assertBoolean(loc: GeneralPath, value: unknown): boolean | undefined
export function assertObject(loc: GeneralPath, value: unknown): Record<string, unknown> | undefined
export function assertPluginList(loc: OptionPath, value: unknown[]): PluginItem[]
```

#### OptionValidator クラス
```typescript
class OptionValidator {
  validateTopLevelOptions(options: object, TopLevelOptionShape: object): void
  validateBooleanOption<T extends boolean>(name: string, value?: boolean, defaultValue?: T): boolean | T
  validateStringOption<T extends string>(name: string, value?: string, defaultValue?: T): string | T
}
```

## サプライチェーンセキュリティ

### 依存関係管理

| 項目 | 対策 |
| --- | --- |
| ロックファイル | yarn.lock による厳格なバージョン固定 |
| 依存関係監査 | Renovate による自動依存関係更新 |
| Hardened Mode | `YARN_ENABLE_HARDENED_MODE: true` (CI環境) |
| スクリプト無効化 | `YARN_ENABLE_SCRIPTS: false` (キャッシュ準備時) |

### CI/CDセキュリティ

| 項目 | 対策 |
| --- | --- |
| 並行性制御 | `concurrency` による重複実行防止 |
| 依存関係チェック | `yarn constraints` による制約検証 |
| 重複検出 | `yarn dedupe --check` による重複依存検出 |
| 循環依存検出 | `release-tool check-cycles` |
| イミュータブルインストール | `YARN_ENABLE_IMMUTABLE_INSTALLS` |

### リリースセキュリティ

| 項目 | 対策 |
| --- | --- |
| Provenance | npm publish時のOIDC認証 (`id-token: write`) |
| 環境分離 | `environment: npm` による公開環境分離 |
| 手動承認 | `dependencyDashboardApproval: true` (Renovate) |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| GitHub Actions ログ | ビルド・テスト・リリース実行記録 | GitHub標準（90日） |
| npm監査ログ | パッケージ公開記録 | npm標準 |
| Codecov レポート | テストカバレッジ記録 | Codecov標準 |

## 脆弱性管理

### 脆弱性報告プロセス

`SECURITY.md` に基づく脆弱性報告フローを採用。

| 項目 | 内容 |
| --- | --- |
| 報告先 | security@babeljs.io |
| 報告要件 | 概念実証（PoC）または評価可能な情報 |
| サポートバージョン | 8.x (フルサポート)、7.x (1年間のセキュリティ更新) |
| 対応プロセス | リスク評価 → パッチ作成 → 調整された開示 |

### 依存関係の脆弱性

依存関係に脆弱性が発見された場合：
1. Babelが使用するsemver範囲でセキュリティ修正版が利用不可か確認
2. 脆弱性がBabelの依存関係の使用方法に影響するか確認

条件1が真で条件2が偽の場合、低リスクとして分類される可能性あり。

## 備考

### Babelのセキュリティモデルの特性

Babelはビルドツール/コンパイラとして以下の特性を持つ：

1. **信頼境界**: 開発者のローカル環境およびCI/CDパイプライン内で実行
2. **入力ソース**: 開発者が制御するソースコードと設定ファイル
3. **出力**: トランスパイルされたJavaScriptコード

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

- プラグインシステムにより任意のコード実行が可能なため、信頼できないプラグインの使用は避けること
- `babel.config.js` は実行可能なJavaScriptファイルであり、信頼できるソースからのみ使用すること
- CI/CD環境ではHardened Modeを有効化し、不正なパッケージインストールを防止
