# セキュリティ設計書

## 概要

本ドキュメントは、Jestテスティングフレームワークのセキュリティ設計について記載する。Jestはローカル開発環境で動作するテストフレームワークであり、Webアプリケーションとは異なるセキュリティモデルを持つ。主要なセキュリティ機能として、テスト実行環境の分離、設定バリデーション、CI/CDパイプラインでの権限管理が実装されている。

## 認証設計

### 認証方式

Jestはローカル開発ツールおよびCI/CDパイプラインで使用されるテスティングフレームワークであり、**独自の認証機能は実装されていない**。

認証が必要となるシナリオでは、以下の外部システムに依存する:

| シナリオ | 認証方式 | 備考 |
| --- | --- | --- |
| npm/Yarn パッケージ取得 | npm registry認証トークン | .npmrc または環境変数 |
| GitHub Actions CI/CD | GITHUB_TOKEN | ワークフロー内で自動提供 |
| Git操作 | SSH鍵 または PAT | 開発者環境で設定 |

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | 該当なし | ステートレス実行モデル |
| セッション固定化対策 | 該当なし | Webセッションは使用しない |

## 認可設計

### 権限体系

Jestはローカル実行ツールであるため、アプリケーションレベルの認可機能は持たない。ただし、以下の実行時権限管理が存在する:

| ロール | 権限 | 説明 |
| --- | --- | --- |
| テスト実行プロセス | ファイルシステムアクセス | graceful-fsを通じたファイル読み書き |
| Node.js VM Context | 分離された実行環境 | グローバル変数の隔離 |
| Worker プロセス | 制限付き実行 | jest-workerによる並列実行 |

### アクセス制御

**テスト環境の分離メカニズム**

Jestは `vm` モジュールの `createContext` と `runInContext` を使用して、各テストファイルを分離されたVMコンテキストで実行する。

```typescript
// packages/jest-environment-node/src/index.ts
this.context = createContext(this._globalProxy.proxy());
const global = runInContext(
  'this',
  Object.assign(this.context, projectConfig.testEnvironmentOptions),
) as Global.Global;
```

**グローバル変数の制御**

特定のグローバル変数はdenylistによって制限される:

```typescript
const denyList = new Set([
  'GLOBAL',
  'root',
  'global',
  'globalThis',
  'Buffer',
  'ArrayBuffer',
  'Uint8Array',
  'jest-symbol-do-not-touch',
]);
```

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | npm/Yarn registryとの通信はHTTPS必須 |
| HSTS | 該当なし（ローカル実行ツール） |
| ローカル通信 | Worker間通信はNode.js IPCを使用 |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | TLS（外部registry通信時のみ） |
| キャッシュキー生成 | SHA-1ハッシュ（`createHash('sha1')`） |
| 変換結果キャッシュ | ハッシュベースのキャッシュキー |

**キャッシュキー生成の実装**

```typescript
// packages/jest-create-cache-key-function/src/index.ts
return createHash('sha1')
  .update(globalCacheKey)
  .update('\0', 'utf8')
  .update(sourceText)
  .update('\0', 'utf8')
  .update(config.rootDir ? relative(config.rootDir, sourcePath) : '')
  .update('\0', 'utf8')
  .update(instrument ? 'instrument' : '')
  .digest('hex')
  .slice(0, length);
```

### 機密情報管理

**環境変数の取り扱い**

- `NODE_ENV`、`BABEL_ENV` などの環境変数はキャッシュキー生成に使用される
- テスト環境では `process.env` は `createProcessObject()` によって新しいオブジェクトとして提供される
- 機密情報を含む環境変数はテストコード内で直接参照可能なため、テストファイルの管理に注意が必要

**ファイルアクセス**

- `graceful-fs` ラッパーを通じてファイルアクセスを行う（ESLintで `fs` 直接使用を禁止）
- `jest-native-read-file`、`jest-native-write-file` などのシンボルでファイルアクセス関数を保護

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（CLIツールのため） |
| SQLインジェクション | 該当なし（データベース接続なし） |
| CSRF | 該当なし（Webサーバー機能なし） |
| 不正な設定値 | jest-validateによるスキーマ検証 |
| パストラバーサル | ファイルパス解決時の正規化 |

**設定バリデーション**

`jest-validate` パッケージにより、設定ファイルの構造と値が検証される:

```typescript
// packages/jest-validate/src/validate.ts
const validate = (
  config: Record<string, unknown>,
  options: ValidationOptions,
): {hasDeprecationWarnings: boolean; isValid: boolean} => {
  // 設定値の検証ロジック
};
```

**denylistによる検証スキップ制御**

```typescript
const shouldSkipValidationForPath = (
  path: Array<string>,
  key: string,
  denylist?: Array<string>,
) => (denylist ? denylist.includes([...path, key].join('.')) : false);
```

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| テスト実行ログ | テスト結果、失敗詳細 | 実行セッション中 |
| CI/CDログ | GitHub Actions実行ログ | GitHubの保持ポリシーに従う |
| カバレッジレポート | コードカバレッジ情報 | CI/CD設定に依存 |

**セキュリティイベントログ**

Jestは専用のセキュリティ監査ログ機能を持たない。セキュリティ関連のイベントは以下で記録される:
- 標準エラー出力への警告メッセージ
- Jest Reporter経由のテスト結果出力
- CI/CD環境のビルドログ

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

### GitHub Actions権限設定

```yaml
# .github/workflows/nodejs.yml
permissions:
  contents: read # コード取得のみに制限
```

### セキュリティベストプラクティス

| 項目 | 実装 |
| --- | --- |
| 最小権限の原則 | `contents: read` のみを許可 |
| 認証情報の非永続化 | `persist-credentials: false` |
| 依存関係の固定 | `yarn --immutable` でロックファイル検証 |
| アクションのピン留め | SHA指定によるアクションバージョン固定 |

```yaml
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
  with:
    persist-credentials: false
```

## 脆弱性管理

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

`SECURITY.md` に記載されている脆弱性報告プロセス:

1. GitHubの「Report a vulnerability」フォームを使用してプライベートに報告
2. 公開Issueでの脆弱性報告は禁止
3. 6営業日以内に確認がない場合はOpenJS Foundation CNAにエスカレーション
4. 修正後にセキュリティアドバイザリとCVEを公開

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

| 対策 | 説明 |
| --- | --- |
| Yarn制約 | `yarn.config.cjs` で依存関係バージョンの一貫性を検証 |
| 重複検出 | `yarn dedupe --check` で重複依存関係を検出 |
| ロックファイル検証 | `yarn --immutable` で意図しない変更を防止 |

## 備考

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

1. **信頼境界**: Jestはテストコードを信頼して実行する設計であり、悪意のあるテストコードからの保護は想定していない
2. **環境分離**: VMコンテキストによる分離は便宜的なものであり、セキュリティ境界ではない
3. **実行権限**: テスト実行プロセスはNode.jsの全権限を持つため、機密情報へのアクセスが可能

### 推奨されるセキュリティプラクティス

- テストコードのコードレビューを実施する
- CI/CD環境での機密情報はシークレット管理サービスを使用する
- 本番環境の認証情報をテスト環境に含めない
- 依存関係の定期的なセキュリティ監査を実施する
