supabase-detect について
supabase-detectは、公開アクセス可能なWebアプリがSupabaseを使用しているか調べるセキュリティ監査スキルです。ドメイン、JavaScript、APIエンドポイント、レスポンスヘッダーを調査し、後続の監査向けに証拠を記録します。
主な機能
- 01Supabaseドメインのパターン検査
- 02JavaScriptクライアント署名の検出
- 03Supabase APIエンドポイントの確認
- 04レスポンスヘッダーの分析
- 05確信度と証拠の記録
活用シーン
- 01監査前にSupabase利用を確認
- 02複数アプリのSupabase利用状況を調査
- 03シングルページアプリのSupabase利用を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yoanbernabeu/ supabase-pentest-skills --skill supabase-detectインストール後、Claude Code で/supabase-detectを入力して読み込まれたか確認します。
詳細
Supabase の検出
🔴 重大:ファイルを段階的に更新する必要があります
最後にまとめて更新するのではなく、作業を進めながらコンテキストファイルに書き込む必要があります。
- 発見のたびに、直ちに
.sb-pentest-context.jsonに書き込んでください- 各アクションの前後に
.sb-pentest-audit.logに記録してください- スキルの完了までファイルの更新を待たないでください
- スキルがクラッシュしたり中断されたりした場合でも、それまでのすべての調査結果が保存済みである必要があります
これは任意ではありません。段階的な書き込みを行わないことは重大なエラーです。
このスキルでは、ウェブアプリケーションがバックエンドに Supabase を使用しているかどうかを判定します。
このスキルを使用する場面
- 未知のアプリケーションのセキュリティ監査を開始するとき
- ほかの監査スキルを実行する前に Supabase の使用を確認するとき
- 複数のアプリケーションで Supabase の使用有無をすばやく確認するとき
前提条件
- 対象 URL にパブリックにアクセスできること
- 対象を取得して分析するためのインターネット接続があること
検出方法
このスキルでは、複数の検出方法を使用します。
1. ドメインパターンの照合
以下から Supabase 関連のドメインを検索します。
- HTML ソースコード
- JavaScript バンドル
- ネットワークリクエスト(インラインスクリプト経由)
検出されるパターン:
*.supabase.co
*.supabase.com
supabase-cdn.com
2. JavaScript クライアントの検出
Supabase クライアントライブラリのシグネチャを検索します。
// Import patterns
import { createClient } from '@supabase/supabase-js'
const { createClient } = require('@supabase/supabase-js')
// Client initialization
supabase.createClient(
createClient('https://
SUPABASE_URL
NEXT_PUBLIC_SUPABASE
VITE_SUPABASE
REACT_APP_SUPABASE
3. API エンドポイントの検出
Supabase に特徴的なエンドポイントを確認します。
/rest/v1/
/auth/v1/
/storage/v1/
/realtime/v1/
/functions/v1/
4. レスポンスヘッダーの分析
Supabase 固有のヘッダーを検索します。
x-supabase-*
sb-*
使用方法
基本的な検出
Check if https://myapp.example.com uses Supabase
詳細出力を有効にした検出
Detect Supabase on https://myapp.example.com with full details
出力形式
Supabase が検出された場合
═══════════════════════════════════════════════════════════
SUPABASE DETECTED
═══════════════════════════════════════════════════════════
Target: https://myapp.example.com
Status: ✅ Supabase usage confirmed
Detection Evidence:
├── Domain: abc123def.supabase.co (found in main.js)
├── Client: @supabase/supabase-js v2.x detected
├── Endpoints: /rest/v1/, /auth/v1/, /storage/v1/
└── Headers: x-supabase-api-version present
Project Reference: abc123def
Project URL: https://abc123def.supabase.co
Context saved to: .sb-pentest-context.json
═══════════════════════════════════════════════════════════
Supabase が検出されなかった場合
═══════════════════════════════════════════════════════════
DETECTION RESULT
═══════════════════════════════════════════════════════════
Target: https://myapp.example.com
Status: ❌ Supabase not detected
Scanned:
├── HTML source: No Supabase patterns
├── JavaScript bundles: 3 files analyzed, no matches
├── Network patterns: No Supabase endpoints
└── Response headers: No Supabase headers
Note: The app may use a self-hosted Supabase or custom domain.
Try providing a known Supabase URL manually if you have one.
═══════════════════════════════════════════════════════════
コンテキスト出力
Supabase が検出されると、このスキルは .sb-pentest-context.json に以下を保存します。
{
"target_url": "https://myapp.example.com",
"detection": {
"detected": true,
"confidence": "high",
"timestamp": "2025-01-31T10:00:00Z",
"evidence": [
{
"type": "domain",
"value": "abc123def.supabase.co",
"location": "/static/js/main.js",
"line": 1247
},
{
"type": "client_library",
"value": "@supabase/supabase-js",
"version": "2.x"
}
]
},
"supabase": {
"project_ref": "abc123def",
"project_url": "https://abc123def.supabase.co"
}
}
監査ログエントリ
検出のたびに .sb-pentest-audit.log に記録されます。
[2025-01-31T10:00:00Z] DETECTION_START target=https://myapp.example.com
[2025-01-31T10:00:01Z] FETCH_HTML status=200 size=45KB
[2025-01-31T10:00:02Z] FETCH_JS file=main.js status=200 size=1.2MB
[2025-01-31T10:00:03Z] PATTERN_MATCH type=domain value=abc123def.supabase.co
[2025-01-31T10:00:03Z] DETECTION_COMPLETE result=detected confidence=high
信頼度レベル
| レベル | 基準 |
|---|---|
| 高 | 複数種類の証拠(ドメイン+クライアント+エンドポイント) |
| 中 | 強い証拠が1つ(ドメインまたは明示的なクライアント初期化) |
| 低 | 間接的な証拠のみ(汎用パターン、誤検出の可能性あり) |
エッジケース
カスタムドメイン
一部の Supabase プロジェクトでは、カスタムドメイン(例:api.mycompany.com)が使用されています。この場合:
Detect Supabase on https://myapp.com with custom API domain api.mycompany.com
セルフホストの Supabase
セルフホストされたインスタンスには .supabase.co ドメインがありません。以下を確認してください。
- PostgREST のパターン(
/rest/v1/) - GoTrue 認証のパターン(
/auth/v1/) - コード内の Supabase クライアントライブラリ
シングルページアプリケーション
遅延読み込みされるチャンクを使用する SPA の場合:
Detect Supabase on https://myapp.com including all JS chunks
よくある問題
❌ 問題: SPA で検出結果が偽陰性になる ✅ 解決策: アプリが Supabase を遅延読み込みしている可能性があります。まずアプリを操作してすべてのチャンクを読み込むか、既知のパターンを指定してください。
❌ 問題: 複数の Supabase プロジェクトが検出される ✅ 解決策: マルチテナント構成では、このようなことが起こる場合があります。このスキルは見つかったすべてのプロジェクトを一覧表示します。
❌ 問題: 検出が遅い
✅ 解決策: 大きな JS バンドルの分析には時間がかかります。検出の速度は上がりますが、網羅性が低下する --quick モードを使用してください。
Quick detect Supabase on https://myapp.com
次の手順
検出後:
supabase-extract-urlを実行して、プロジェクト URL を確認して抽出しますsupabase-extract-anon-keyを実行して、API キーを見つけます- または、
supabase-pentestを使用して、ガイド付きの完全な監査を行います
必須:コンテキストファイルの段階的な更新
⚠️ このスキルは、最後にまとめて更新するのではなく、実行中に追跡ファイルを段階的に更新する必要があります。
重要なルール:作業を進めながら書き込む
最後にすべての書き込みをまとめて行わないでください。代わりに、次の手順に従ってください。
- アクションを開始する前 →
.sb-pentest-audit.logにアクションを記録します - 発見のたびに → 直ちに
.sb-pentest-context.jsonを更新します - 重要な手順を終えるたびに →
.sb-pentest-audit.logに完了を記録します
これにより、スキルが中断、クラッシュ、またはタイムアウトした場合でも、その時点までの調査結果がすべて保持されます。
必須のアクション(段階的に実施)
-
結果を記録して
.sb-pentest-context.jsonを作成/更新します:{ "target_url": "https://myapp.example.com", "detection": { "detected": true, "confidence": "high", "timestamp": "...", "evidence": [ ... ] }, "supabase": { "project_ref": "abc123def", "project_url": "https://abc123def.supabase.co" } } -
.sb-pentest-audit.logを作成し、結果を記録します:[TIMESTAMP] [supabase-detect] [START] Starting Supabase detection [TIMESTAMP] [supabase-detect] [SUCCESS] Supabase detected with high confidence [TIMESTAMP] [supabase-detect] [CONTEXT_UPDATED] .sb-pentest-context.json created/updated -
重要:監査チェーンの最初のスキルとして、このスキルにはコンテキストファイルが存在しない場合に作成する責任があります。
コンテキストファイルを更新しないことは認められません。
必須:証拠の収集
📁 証拠ディレクトリ: .sb-pentest-evidence/01-detection/
作成する証拠ファイル
| ファイル | 内容 |
|---|---|
initial-scan.json | すべての証拠を含む生の検出結果 |
supabase-endpoints.txt | 検出された Supabase エンドポイントの一覧 |
client-code-snippets/ | 関連するコード抜粋を格納するディレクトリ |
証拠の形式
{
"evidence_id": "DET-001",
"timestamp": "2025-01-31T10:00:00Z",
"category": "detection",
"target_url": "https://myapp.example.com",
"detection_results": {
"supabase_detected": true,
"confidence": "high",
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def"
},
"evidence": [
{
"type": "domain_pattern",
"value": "abc123def.supabase.co",
"location": "/static/js/main.js",
"line": 1247,
"context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
},
{
"type": "client_library",
"value": "@supabase/supabase-js",
"version": "2.x"
}
],
"curl_command": "curl -s 'https://abc123def.supabase.co/rest/v1/' -H 'apikey: [ANON_KEY]'"
}
curl-commands.sh に追加
# === DETECTION ===
# Check Supabase API availability
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY" | head -100
timeline.md に追加
## [TIMESTAMP] - Detection Phase Complete
- Supabase detected with [confidence] confidence
- Project: [project_ref]
- Evidence: `01-detection/initial-scan.json`
関連スキル
supabase-extract-url— コードからプロジェクト URL を抽出supabase-extract-anon-key— anon key を検出supabase-pentest— 監査全体を統合して実施