---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 32
  claims_with_evidence: 28
  claims_without_evidence: 4
confidence_derived: 0.88
---

# 根拠レポート：セキュリティ設計書

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.88**
  - 根拠あり：28 / 32、根拠なし：4
- 優先レビュー（高）
  1. **HSTS 設定方針**：CMS コードに設定なし。デプロイ環境依存の記述は推定
  2. **CSP 設定方針**：CMS コードに明示的な設定がなく、デプロイ環境依存の記述は推定
  3. **Git プロバイダ監査ログ仕様**：各プロバイダの具体的な監査ログ保持期間は外部仕様に依存
  4. **レート制限の不在**：不在であること自体はコード解析から確認済みだが、Git プロバイダ側の制限に関する記述は推定

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/decap-cms-lib-auth/src/pkce-oauth.js`（PKCE OAuth 実装）
- E-02: `packages/decap-cms-lib-auth/src/implicit-oauth.js`（Implicit OAuth 実装）
- E-03: `packages/decap-cms-lib-auth/src/netlify-auth.js`（Netlify Authenticator 実装）
- E-04: `packages/decap-cms-lib-auth/src/utils.js`（認証ユーティリティ：nonce, HTTPS チェック）
- E-05: `packages/decap-cms-backend-github/src/API.ts`（GitHub API クライアント）
- E-06: `packages/decap-cms-backend-github/src/GraphQLAPI.ts`（GitHub GraphQL API）
- E-07: `packages/decap-cms-backend-github/src/AuthenticationPage.js`（GitHub 認証ページ・Open Authoring）
- E-08: `packages/decap-cms-backend-git-gateway/src/implementation.ts`（Git Gateway 実装）
- E-09: `packages/decap-cms-ui-auth/src/PKCEAuthenticationPage.js`（PKCE 認証 UI・JWT デコード）
- E-10: `packages/decap-cms-ui-auth/src/NetlifyAuthenticationPage.js`（Netlify 認証 UI）
- E-11: `packages/decap-cms-widget-markdown/src/MarkdownPreview.js`（DOMPurify サニタイズ）
- E-12: `packages/decap-cms-widget-markdown/package.json`（DOMPurify 依存関係）
- E-13: `packages/decap-cms-core/src/actions/editorialWorkflow.ts`（ワークフロー管理）
- E-14: `packages/decap-cms-core/src/constants/configSchema.js`（設定バリデーション）
- E-15: `packages/decap-cms-core/package.json`（コア依存関係・sanitize-filename）
- E-16: `packages/decap-cms-lib-util/src/unsentRequest.js`（リクエストタイムアウト）
- E-17: `functions/publish.js`（Slack Webhook 署名検証・HMAC）
- E-18: `packages/decap-cms-core/src/components/Editor/EditorInterface.js`（localStorage 使用状況）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | PKCE OAuth フローが RFC 7636 に準拠して実装されている | E-01 | ○ |
| C-02 | コード検証子は `window.crypto.getRandomValues()` で128文字のランダム文字列を生成 | E-01 | ○ |
| C-03 | コードチャレンジは SHA-256 ハッシュで生成される | E-01 | ○ |
| C-04 | PKCE コード検証子は sessionStorage に保存しトークン交換後に削除 | E-01 | ○ |
| C-05 | State パラメータに nonce を含めて CSRF 対策を実施 | E-01, E-04 | ○ |
| C-06 | Implicit OAuth フローで URL ハッシュからトークンを除去 | E-02 | ○ |
| C-07 | PostMessage 通信でオリジン検証を実施 | E-03 | ○ |
| C-08 | リフレッシュトークンのエンドポイントが提供されている | E-03 | ○ |
| C-09 | GoTrue JS ライブラリによる JWT ベース認証 | E-08, E-09 | ○ |
| C-10 | JWT から `app_metadata.roles` でロールを抽出 | E-08 | ○ |
| C-11 | 認証トークンはメモリ内（Redux Store）のみに保持 | E-05, E-09 | ○ |
| C-12 | nonce は UUID ベースで生成し sessionStorage に保存 | E-04 | ○ |
| C-13 | nonce 削除処理に localStorage/sessionStorage の不整合バグがある | E-04 | ○ |
| C-14 | localStorage にはUI状態のみ保存し機密情報は保存しない | E-18 | ○ |
| C-15 | エディトリアルワークフローで DRAFT→REVIEW→APPROVED→PUBLISHED の遷移管理 | E-13 | ○ |
| C-16 | Open Authoring で Fork ベースの PR ワークフローを提供 | E-07 | ○ |
| C-17 | OAuth フロー開始前に HTTPS プロトコルチェックを実施 | E-04 | ○ |
| C-18 | localhost / 127.0.0.1 は開発用に HTTPS 例外を許可 | E-04 | ○ |
| C-19 | リダイレクト URI を `document.location.origin + pathname` に固定 | E-01 | ○ |
| C-20 | API リクエストに60秒のタイムアウトを設定 | E-16 | ○ |
| C-21 | 外部リンクに `rel="noopener noreferrer"` を付与 | E-10 | ○ |
| C-22 | DOMPurify (^3.2.6) による HTML サニタイズを実装 | E-11, E-12 | ○ |
| C-23 | サニタイズは `sanitize_preview` フラグが有効な場合のみ適用 | E-11 | ○ |
| C-24 | `sanitize-filename` によるファイル名サニタイズ | E-15 | ○ |
| C-25 | AJV による JSON Schema 設定バリデーション | E-14 | ○ |
| C-26 | `encodeURIComponent()` による URL パラメータエンコード | E-05 | ○ |
| C-27 | Slack Webhook で HMAC-SHA256 署名検証およびタイミングセーフ比較を実装 | E-17 | ○ |
| C-28 | Slack Webhook でタイムスタンプ検証（5分以上前のリクエスト拒否）を実装 | E-17 | ○ |
| C-29 | HSTS はデプロイ先の Web サーバーで設定する必要がある | **根拠なし** | △ |
| C-30 | CSP はデプロイ先の Web サーバーで設定する必要がある | **根拠なし** | △ |
| C-31 | Git プロバイダの監査ログに依存する | **根拠なし** | △ |
| C-32 | レート制限は Git プロバイダ側の制限に依存する | **根拠なし** | △ |

## 4) 不足情報（Unknown / Missing）
- HSTS / CSP 設定に関する記述はコードベースに明示的な実装がないため、デプロイ環境に委ねるべきという記述は推定に基づく
  - 候補：デプロイガイドライン / ホスティング設定ドキュメント / Netlify 公式ドキュメント
- Git プロバイダの監査ログ仕様は各プロバイダの外部ドキュメントに依存
  - 候補：GitHub Audit Log ドキュメント / GitLab Audit Events ドキュメント / Bitbucket 管理ドキュメント
- レート制限の実装状況は各 Git プロバイダの API ドキュメントに依存
  - 候補：GitHub API Rate Limiting / GitLab API Rate Limits

## 5) リスクフラグ（レビュー観点）
- **リスク 2（高）**: DOMPurify サニタイズがデフォルト無効（`sanitize_preview: false`）→ XSS リスクが設定依存
- **リスク 1（中）**: nonce 削除処理の localStorage/sessionStorage 不整合バグ → nonce が sessionStorage に残存する可能性
- **リスク 1（中）**: CSP / HSTS がアプリケーションレベルで未設定 → デプロイ環境での設定漏れリスク
- **リスク 1（中）**: 認証試行のレート制限不在 → ブルートフォース攻撃への脆弱性
- **リスク 0（低）**: 機密情報の localStorage 保存なし → 適切に設計済み

## 6) レビュアーチェックリスト（最小）
- [ ] PKCE OAuth フロー実装が RFC 7636 に準拠していることを確認
- [ ] `sanitize_preview` のデフォルト値がセキュリティポリシーに合致するか確認
- [ ] nonce 削除バグ（`utils.js:12`）が未修正であることを確認し、修正要否を判断
- [ ] デプロイ環境で HSTS / CSP ヘッダーが適切に設定されているか確認
- [ ] Slack Webhook 署名検証のタイミングセーフ比較が正しく機能しているか確認
- [ ] Git プロバイダの API レート制限がセキュリティ要件を満たすか確認
