Launch Audit
アプリがハッキングや訴訟に遭わないように監査します。作業は4つのリファレンスファイルに分割されています。目の前のスタックに該当するファイル(およびセクション)のみをお読みください。
| ファイル | 用途 |
|---|---|
references/prelaunch-checklist.md | 20項目のGo/No-Goゲート。まずはここから。 |
references/security.md | 完全なセキュリティレビュー: シークレット、認証、アクセス制御、インジェクション、ブラウザ/トランスポート、サプライチェーン、AI機能、運用。 |
references/legal-compliance.md | ポリシー、同意、プライバシー権、誠実なマーケティング、子ども、メール、知的財産、アクセシビリティ。 |
references/stack-notes.md | プラットフォーム固有の落とし穴: Supabase、Firebase、Next.js、Express、Django、Rails、Laravel、モバイル、Stripe、LLMアプリ。 |
すべてのチェックリスト項目にはID(SEC-*、LEG-*、A11Y-*)が付いています。レポートではこれらのIDを使用して、発見事項を追跡可能にしてください。
モードを選択
- Quick(「ローンチチェックリスト」「リリース準備はできている?」時間がない場合)→
prelaunch-checklist.mdのみ。 - Security(「セキュリティ監査」「ハッキングを避けたい」「これは安全か?」)→
security.md+ 該当するstack-notes.mdのセクション。 - Legal(「訴訟を避けたい」「GDPR」「クッキーバナー」「プライバシーポリシー」)→
legal-compliance.md。 - Full(ユーザーがリリース前に単に「アプリを監査して」と言った場合のデフォルト)→ 上記すべて。
ワークフロー
1. スコープ — ほぼ自動
リポジトリから以下を事前に確認し、質問は最小限に:
- スタック: フレームワーク、言語、バックエンド/BaaS(Supabase、Firebase、自前サーバー)、DB、認証プロバイダー、ホスティング、Web vs モバイル vs 両方。
package.json、ロックファイル、requirements.txt/pyproject.toml、Gemfile、composer.json、pubspec.yaml、supabase/、firebase.json、vercel.json、Dockerfile、CIファイルを確認。 - データインベントリ: 収集される個人データ(フォーム、サインアップフィールド、アナリティクス)、保存場所、受信するサードパーティSDK/サービス(アナリティクス、広告、クラッシュレポート、決済、メール、AI API)。
- お金: 決済、サブスクリプション、トライアル、アプリ内課金。
- 表面: 公開ページ、APIルート、サーバーアクション、エッジ/クラウド関数、Webhook、管理画面、ファイルアップロード、AI/LLM機能。
その後、1回のメッセージで、コードからはわからないことだけをユーザーに尋ねます: ターゲット市場(EU/UK/US/ブラジル/その他)、未成年者が使用する可能性があるか、ライブまたはステージングURL(ある場合)、修正を適用するかレポートのみかを確認。
ユーザーが応答できない場合、EU + US、成人のみ、レポート優先と仮定し、その旨をレポートの先頭に明記します。
2. 自動パス
python3 scripts/scan.py <repo-path> # ワーキングツリー
python3 scripts/scan.py <repo-path> --history # git履歴もシークレットスキャン
python3 scripts/check_live.py https://staging.example.com # ライブヘッダー、クッキー、CORS、公開ファイル
両スクリプトともPython 3標準ライブラリのみで動作します。check_live.pyは無害なGETリクエストをいくつか送信します — ユーザーが所有するか、テストを許可されたサイトに対してのみ実行してください。
また、エコシステムの依存関係監査ツール(npm audit、pnpm audit、pip-audit、osv-scanner、bundle audit、composer audit、cargo audit)が利用可能な場合は実行します。scan.pyは検出したマニフェストに応じて適切なコマンドを表示します。
スクリプトの出力は手がかりであり、確定判定ではありません。各ヒットはコードを読んで確認し、誤検知は除外してください。スキャンがクリーンでも安全とは限りません。最も被害が大きいバグ(壊れたアクセス制御、欠落したサーバーサイドチェック、テナントリーク)は、コードを読んで初めて見つかるロジックバグです。
3. 手動レビュー
以下の順序で読み進めます:
- 認証設定とミドルウェア。サーバーが呼び出し元をどのように識別するか。
- すべての APIルート、サーバーアクション、エッジ/クラウド関数、Webhookハンドラー。
- データベースアクセスルール: RLSポリシー、Firebaseルール、ORMスコープ、DBユーザー権限。
- 入力からSQL、シェルコマンド、HTML、ファイルパス、URLを構築するものすべて。
- ファイルアップロードおよびダウンロードハンドラー。
- AI/LLM機能: 信頼できないテキストがモデルに到達するか、モデルが呼び出せるツール。
- 法務ページ、クッキーバナー、サインアップおよびチェックアウトフロー、マーケティングコピー、メール。
すべてのエンドポイントについて、4つの質問に答えます: 誰が呼び出しているか?サーバーで確認されているか?レコードはその人(またはそのテナント)のものか?どのフィールドを書き込めるか? 「いいえ」または「わからない」は発見事項です。
4. 分類
各項目のステータス: FAIL · WARN · PASS · MANUAL(人間の判断が必要: 法的テキストレビュー、復元訓練、弁護士) · N/A。
実際に確認していない項目にPASSを付けないでください — 代わりにMANUALを使用してください。
障害の深刻度:
- Critical — 現在悪用可能、またはすでに露出しているもの: リポジトリ/バンドル/履歴内のライブシークレット、認証なしで読み書き可能なデータベース、ユーザーデータを含むテーブルでRLSが無効、認証バイパス、個人データのIDOR、SQL/コマンドインジェクション、RCE。
- High — 小さな前提条件で深刻: ログイン/リセットのレート制限欠如、保存型XSS、Webhook署名チェック欠如、弱いパスワードハッシュ、認証情報付きの過剰なCORS、本番環境でのデバッグモード、バックアップなし。法的: 表明された市場に対して必須要件が欠如(個人データを収集しているのにプライバシーポリシーがない、EU/UKで同意前に非必須トラッキング、アプリストアアプリでアカウント削除機能なし)。
- Medium — 多層防御のギャップ: セキュリティヘッダー欠如、詳細なエラー、監査ログなし、古いが悪用不可の依存関係。法的: 不完全なポリシー内容、同意UXの問題、アクセシビリティ不備。
- Low — 衛生と洗練。
5. レポート
templates/report.mdに記入。評決を先頭に記載:
- 🔴 準備未完了 — Critical、または個人データやお金に触れるHigh項目がある場合。
- 🟡 修正すれば準備完了 — High/Mediumがあり、今週中の修正計画がある場合。
- 🟢 準備完了 — Critical/Highなし。Mediumは追跡中。
各発見事項: ID、深刻度、証拠(file:lineまたはURL + ヘッダー)、リスクの1行説明、具体的な修正方法(短いコードならコードも)。深刻度ごとにグループ化し、チェックリストの順序には従わない。PASS項目はコンパクトな表にまとめる。
レポートやチャットに完全なシークレットを貼り付けないでください。 最初の4文字を表示し、残りはマスクします(sk_l****)。
6. 修正
深刻度順に修正を提案。ユーザーが修正を依頼した場合、または同意した場合のみコードを編集。修正後、scan.py(およびデプロイ後はcheck_live.py)を再実行し、レポートを更新。
漏洩したシークレットは、常にこの順序で対応: プロバイダーでキーを失効/ローテーション → コードから削除してサーバーサイド環境変数に移動 → git履歴から削除(git filter-repoまたはBFG)し、force-push。削除だけでは無意味: キーはすでにクローン、フォーク、CIログ、キャッシュに存在します。
基本ルール
- 法的助言ではありません。 プライバシーポリシー、利用規約、クッキーポリシー、返金ポリシーのドラフトは作成できますが、ドラフトはアプリが実際に行っていること(ステップ1〜3で見つけたデータ、SDK、処理者)を説明するものでなければならず、他社からコピーしてはならず、対象市場の弁護士によるレビューを促すフラグを立てる必要があります。
- 防御のみ。 ユーザーが所有するか、テストを許可されたシステムのみテスト。脆弱性と修正を説明し、第三者に対する実用的なエクスプロイトを構築しない。
- コードベースなし、URLのみ?
check_live.pyを実行し、サイトを調査(フッターの法的リンク、同意前にトラッカーが起動するか、「拒否」が「同意」と同じくらい簡単か、フォームとチェックアウト)。コードレベルの項目はMANUALとマーク。 - モバイルアプリ: アプリバイナリに出荷されたものはすべて公開されています。モバイルアプリ内のシークレットは漏洩したシークレットです。
- 手作りの修正よりもプラットフォームネイティブの修正(RLSポリシー、フレームワークミドルウェア、プロバイダー設定)を優先。