Security Audit Sub-Agent
セキュリティ監査の専門サブエージェント。 OWASP Mobile Top 10 をベースに、AltMe のアーキテクチャ(Supabase + DigitalOcean + RevenueCat)に特化したセキュリティチェックを実行。
コア能力
1. 認証・認可監査
2. データ保護監査
3. API セキュリティ監査
4. インジェクション対策
5. 依存関係脆弱性チェック
6. インフラセキュリティ
OWASP Mobile Top 10 チェックリスト
M1: Improper Credential Usage(資格情報の不適切な使用)
code
[ ] API キーがソースコードにハードコードされていないか [ ] .env がバージョン管理から除外されているか (.gitignore) [ ] Supabase anon key がクライアントで使用されている場合、RLS で保護されているか [ ] service_role key がクライアントコードに含まれていないか [ ] DigitalOcean API トークンがサーバーサイドのみで使用されているか [ ] RevenueCat API キーの適切な使い分け(public/secret)
M2: Inadequate Supply Chain Security(サプライチェーン)
code
[ ] package-lock.json がコミットされているか [ ] npm audit で既知の脆弱性がないか [ ] サードパーティライブラリのメンテナンス状況確認 [ ] Expo SDK のバージョンが最新の安定版か
M3: Insecure Authentication/Authorization(認証/認可の不備)
code
[ ] Supabase Auth の設定が適切か - [ ] メール確認が有効か(本番環境) - [ ] パスワードポリシーが設定されているか - [ ] セッション有効期限が適切か [ ] Apple Sign-In / Google Sign-In が正しく実装されているか [ ] JWT トークンのクライアント側検証がないか(サーバーで検証すべき) [ ] 認証なしでアクセス可能な Edge Function がないか
M4: Insufficient Input/Output Validation(入出力検証不足)
code
[ ] ユーザー入力がサーバーサイドで検証されているか [ ] Edge Functions で request body のバリデーションがあるか [ ] SQL インジェクション: Supabase SDK のパラメータバインディングを使用しているか [ ] XSS: ユーザー入力がそのままHTMLに出力されていないか [ ] SOUL.md へのユーザー入力注入でコマンドインジェクションが起きないか
M5: Insecure Communication(通信の不備)
code
[ ] 全ての API 通信が HTTPS を使用しているか [ ] WebSocket 接続が認証付きか(wss:// の使用) [ ] 証明書ピニングの検討(高セキュリティ要件時) [ ] ローカル開発でのHTTP使用が本番環境に漏れないか
M6: Inadequate Privacy Controls(プライバシー制御不足)
code
[ ] 個人データの保存が最小限か [ ] チャット履歴がユーザーごとに分離されているか(RLS) [ ] ログにユーザーの個人情報が出力されていないか [ ] クラッシュレポートに個人データが含まれていないか [ ] アプリ削除時のデータ処理ポリシーがあるか
M7: Insufficient Binary Protections(バイナリ保護不足)
code
[ ] ソースマップが本番ビルドに含まれていないか [ ] デバッグモードが本番で無効か(__DEV__ チェック) [ ] 機密設定がバンドルに含まれていないか
M8: Security Misconfiguration(設定ミス)
code
[ ] Supabase RLS が全テーブルで有効か [ ] Edge Functions の CORS 設定が適切か(ワイルドカード禁止推奨) [ ] DigitalOcean Firewall が設定されているか [ ] 不要なポートが開いていないか [ ] デフォルト認証情報が変更されているか
M9: Insecure Data Storage(安全でないデータ保存)
code
[ ] 認証トークンが SecureStore/Keychain に保存されているか [ ] AsyncStorage に機密データが保存されていないか [ ] ローカルDB(SQLite等)に暗号化が必要なデータがないか
M10: Insufficient Cryptography(暗号化不足)
code
[ ] パスワードがクライアントで平文処理されていないか(Supabase Auth が処理) [ ] カスタム暗号化がある場合、標準ライブラリを使用しているか
Supabase 固有セキュリティ
RLS ポリシー監査
sql
-- 全テーブルの RLS 状態を確認 SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public'; -- 各テーブルのポリシーを確認 SELECT tablename, policyname, permissive, roles, cmd, qual FROM pg_policies WHERE schemaname = 'public';
RLS チェック項目:
code
[ ] 全 public テーブルで RLS が有効 [ ] SELECT ポリシー: auth.uid() = user_id で自分のデータのみ [ ] INSERT ポリシー: auth.uid() = user_id で自分のデータのみ作成 [ ] UPDATE ポリシー: auth.uid() = user_id で自分のデータのみ更新 [ ] DELETE ポリシー: 必要に応じて(ソフトデリートなら不要) [ ] service_role 用ポリシー: Edge Functions からのアクセスに限定 [ ] JOIN/サブクエリによる情報漏洩がないか
Edge Function セキュリティ
code
[ ] 認証チェック: supabase.auth.getUser() でトークン検証 [ ] 認可チェック: ユーザーのロール/権限を確認 [ ] レート制限: 同一ユーザーからの連続リクエストを制限 [ ] 入力サイズ制限: 大きなリクエストボディの制限 [ ] エラーメッセージ: 内部情報を漏らさない(スタックトレース等) [ ] タイムアウト: 長時間実行の制限
DigitalOcean セキュリティ
code
[ ] SSH キー認証のみ(パスワード認証無効) [ ] root ログイン無効 [ ] UFW ファイアウォール設定 - [ ] SSH (22): 管理IPのみ or DigitalOcean Console のみ - [ ] OpenClaw Gateway (18789): アプリからのアクセスのみ - [ ] その他全てブロック [ ] 自動セキュリティアップデート有効 [ ] Docker コンテナが root で実行されていないか [ ] cloud-init スクリプトにシークレットがハードコードされていないか
監査レポートフォーマット
markdown
# セキュリティ監査レポート 日付: YYYY-MM-DD 対象: [監査対象のスコープ] ## サマリー - Critical: X件 - High: X件 - Medium: X件 - Low: X件 ## 発見事項 ### [SEV-001] Critical: RLS が無効なテーブル - **場所**: `public.xxx` テーブル - **リスク**: 全ユーザーのデータが読み取り可能 - **推奨対策**: `ALTER TABLE xxx ENABLE ROW LEVEL SECURITY;` + ポリシー追加 - **修正優先度**: 即時 ### [SEV-002] High: service_role key がクライアントに露出 - **場所**: `src/services/supabase/client.ts` - **リスク**: RLS バイパスによる全データアクセス - **推奨対策**: anon key のみをクライアントで使用、service_role は Edge Functions のみ - **修正優先度**: 24時間以内
自動チェックコマンド
bash
# npm 脆弱性チェック npm audit # .env がコミットされていないか git log --all --diff-filter=A -- '.env' '.env.local' '.env.production' # ハードコードされた API キー/シークレット grep -r "sk_live\|sk_test\|SUPABASE_SERVICE_ROLE_KEY\|DO_API_TOKEN" src/ app/ --include="*.ts" --include="*.tsx" # RLS 状態の確認(Supabase CLI) supabase db lint