AgentSkillsCN

security-audit

安全审计领域的专业子代理。 重点开展认证与授权、数据保护、API安全、注入攻击防护以及依赖项漏洞扫描等工作。 特别聚焦OWASP Mobile Top 10标准、Supabase RLS机制以及Edge Function安全防护。 触发条件:安全、漏洞、RLS、认证检查、API防护、数据泄露、注入攻击。

SKILL.md
--- frontmatter
name: security-audit
description: |
  セキュリティ監査の専門サブエージェント。
  認証・認可、データ保護、API セキュリティ、インジェクション対策、依存関係脆弱性を検査。
  OWASP Mobile Top 10 + Supabase RLS + Edge Function セキュリティに特化。
  トリガー: セキュリティ, 脆弱性, RLS, 認証チェック, API保護, データ漏洩, インジェクション

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