// docs / security guides / ai-code scanner
AI 生成コードのセキュリティスキャン: vibe-coded アプリ向け DAST
Cursor、Claude Code、Lovable、Bolt、v0、Replit、Windsurf で構築されたアプリは、前世代の Web ソフトウェアよりも早く出荷されます。また、予測可能な一連のセキュリティ ギャップを備えた状態で出荷されます。このページでは、AI- で生成されたアプリに従来の侵入テスト ツールとは異なるスキャンが必要な理由、どの脆弱性クラスが過剰に表れているか、コードベースが半分マシンで生成されている場合の DAST と SAST の違い、このワークロード用に構築されたスキャナーで何を探すべきかについて説明します。
AI-生成されたコードに別のセキュリティ スキャンが必要な理由
AI コーディング ツールは、オープンソース リポジトリで大規模にトレーニングされています。そのトレーニング データは make it secure よりも make it work に偏っています。そこからいくつかの構造パターンが導き出されます。
- Autocomplete bias. 最も近い一致するインポートが優先されます。
service_roleキーを使用する Supabase スニペットを 1 つのファイルに貼り付けると、そのキーが次のファイルでオートコンプリート候補になります。これは、そのキーが属していなかったクライアント側の React コンポーネントでも同様です。 - No long-term context. LLM には、最後の RLS バイパスやチームの事件事後分析の記憶がありません。生成された各ファイルは新鮮ですが、多くの場合、人間がファイル間で保持する防御パターンが欠落しています。
- Speed as the rewarded metric. ユーザーはスピードを賞賛します。 LLM トレーニングはそれを強化します。レイテンシ フィードバック信号に関しては、「最速の Next.js 認証を生成する」は、「最も安全な Next.js 認証を生成する」よりも優れています。
- Training data gaps. 古いコードベースはトレーニング データを支配しており、最新のセキュリティのデフォルト (厳密な CSP、
SameSite=Lax、HSTS、RLS) よりも古いものです。生成されたコードは、2019 年には正常だったが、現在では安全ではないパターンを反映しています。 - Implicit platform trust. Cursor が Vercel アプリを生成するとき、Vercel のデフォルトが安全であると想定します。一部は (auto-HTTPS、署名付き Cookie) です。多くはそうではありません (デフォルトでは CSP はなく、寛容な CORS、デフォルトの Next.js デバッグ ルート)。
バイブコード化されたアプリで過剰に発生する 10 の脆弱性クラス
AI- で生成されたアプリを何千回もスキャンすると、同じ検出クラスが不均衡に表示されます。
- Exposed Supabase service-role keys. クライアント バンドルにコミットされた
service_roleJWT (eyJで始まる) は、プロジェクトのすべての RLS ポリシーをバイパスします。 Cursor は境界の間違った側でオートコンプリートします。キーは/_next/static/...で発送されます。 - Missing Row-Level Security (RLS). モデルは
CREATE TABLE public.itemsを認識し、RLS を有効にせずに続行します。匿名ユーザーは、公開 anon キーを介して任意の行を読み書きできるようになります。 baas.supabase-rlsを参照してください。 - Open Firebase / Firestore rules. 生成されたルール ファイルでは、
allow read, write: if true;が読み取られるか、ルール ファイル全体がスキップされることがよくあります。デフォルトのテストモード ルールは 30 日後に期限切れになり、データベースをロックしますが、これは開発者が気づいた場合に限られます。 - Hardcoded API keys in bundles. Stripe ライブ キー、Anthropic
sk-ant-*、OpenAIsk-*、GoogleAIza*、AWSAKIA*キーは、env-var 規律が失われると JS ペイロードにインライン化されます。 secrets.browser-storage は、レンダリングされたページ レベルでフラグを立てます。 - Missing Content Security Policy. いいえ
Content-Security-Policy応答ヘッダーは、すべてのインライン スクリプト XSS が 1 クリックでアカウントの完全な乗っ取りを意味します。 CSP は抽象的です。 codegen は定期的にそれをスキップします。 headers.security-headers は、デプロイプラットフォーム固有の修正ガイダンスとのギャップを報告します。 - Next.js middleware misplacement.
src/レイアウトでは、Next.js はsrc/middleware.tsのみを選択します。ルートレベルのmiddleware.tsは暗黙的に無視されます。ページがrequireAuth()を呼び出すため、認証はまだ機能しているように見えますが、ヘッダー、CSP、およびレート制限は適用されません。 - IDOR via unsigned IDs. 生成された
GET /api/items/[id]ハンドラーは path パラメーターを信頼し、所有権を検証しません。整数または UUID 空間をたどると、すべてのテナントのデータが公開されます。 - Broken auth flows.
expires_atのないマジックリンク トークン。audとexpをスキップする JWT 検証。サーバー側getUser()の代わりに、クライアント側getSession()を呼び出します (未検証の Cookie を読み取ります)。 - Debug endpoints in production. 生成された
/api/debug、/api/health、/api/__nextjs_original-stack-frame、または/.next/traceルート リーク内部。 discovery.platform-vercel は、SPA フォールバックでの誤検知を回避するために、コンテンツ検証を使用してそれらを調査します。 - Plaintext sensitive fields. パスワード、API キー、および PII は、移行が
pgcryptoまたは外部ボールトに到達しなかったため、Postgres にプレーン テキストとして保存されました。
DAST と SAST: AI-生成されたコードにとって両方が重要な理由
静的解析 (SAST) と動的解析 (DAST) は補完的なものであり、代替品ではありません。分割は、手書きのコードよりも AI-生成されたコードの方が重要です。
SAST はディスク上のソース コードを読み取ります。ビルドが実行される前に、ソース ファイル内の秘密、危険な関数呼び出し、危険なパターンを検出します。ランタイム構成、デプロイされた環境変数、またはバンドラーがコードをどのように変換したかを確認することはできません。
DAST は、デプロイされたアプリケーションをユーザーと同様にヒットします。出荷された応答を確認し、本番バンドルに対して実行し、リポジトリとデプロイの間の構成のドリフトを捕捉します。トランスパイルされた JavaScript 内で、SAST がビルド時に process.env 割り当てを介して入力したために認識されなかったハードコーディングされたキーを検出します。
For AI-generated code, DAST is essential 出荷されるものはモデルが書いたものと異なるためです。バンドル、ツリーシェイキング、トランスパイル、環境変数のインライン化はすべて、新しいサーフェスを作成します。ソース上の SAST は、バンドルに埋め込まれたシークレットを完全に欠落する可能性があります。 DAST は両方のレイヤーをキャッチします。成熟したパイプラインは、デプロイされたプレビューに対して CI および DAST で SAST を実行します。これが FixVibe パターンです。
AI-コード スキャナーで何を探すか
ほとんどの汎用 DAST スキャナー (Burp Suite、OWASP ZAP、Nessus) は、モノリシック アプリと従来の認証フロー向けに設計されています。 Vercel + Supabase + Stripe AI- で生成されたアプリをスキャンするには、次のものが必要です。
- BaaS coverage. Supabase RLS、Firebase / Firestore ルール、Clerk config、AWS Amplify、およびこれらのサービスが発行する JWT シェイプに対して実際のチェックを行います。一般的な OWASP ルールでは、何をフラグを立てるべきかがわかりません。
- JS bundle inspection. API-key 形式、署名付きトークン、およびプロバイダー固有のパターン (Stripe
sk_live_、Anthropicsk-ant-、eyJで始まる Supabase JWTs) 用に調整された正規表現。一般的なエントロピー ヒューリスティックでは、誤検知が多すぎます。 - Passive + active split. パッシブ チェック (ヘッダー、Cookie、シークレット、BaaS 構成、DNS) は、あらゆる URL に対して安全に実行されます。アクティブ プローブ (SQLi、XSS、SSTI、IDOR ウォーキング) は、攻撃形式のペイロードを起動するため、承認境界が必要です。
- Framework awareness. Next.js App Router と Pages Router を認識し、Vite SPA 書き換え、Vercel 導入保護、Cloudflare ページ ルーティング。 Vite SPA フォールバックと実際の
/_next/build-manifest.jsonを区別しないスキャナーはノイズを生成します。 - Rate-limit safety. スキャンごとの制限付きリクエスト バジェット、WAF-混乱を招く誤検知を回避するためのベースラインとレスポンスの比較、ブランケット 403 導入を検出するためのランダム化されたパスプローブ ベースライン。
- Authorization gating for intrusive payloads. 所有していないドメインに SQLi または OS- コマンド ペイロードを送信することは、ほとんどの管轄区域で違法です。実際のスキャナでは、ターゲットに対してアクティブ モードを実行する前に、DNS または HTTP- ファイルの所有権を確認する必要があります。
FixVibe のアプローチ: 証拠に基づくスキャン、低い誤検知負荷
FixVibe is a DAST built specifically for AI-generated web apps. The passive phase runs 200+ checks on the rendered page (headers, CSP, cookies, leaked secrets, BaaS misconfiguration, tech fingerprinting, DNS, attack-surface discovery). The active phase adds payload-firing probes (SQLi, XSS, SSTI, CORS, redirects, IDOR walking, CSRF, account enumeration, blind-SSRF) gated behind verified-domain ownership. Repo scans add code-phase checks against connected GitHub repositories. Every finding includes evidence, a CWE link, a remediation recipe, and either a coding-agent prompt or operator steps depending on who can actually apply the fix. The scan engine is open in the changelog — every new check, accuracy improvement, and false-positive fix is logged publicly.
FixVibe vs Burp Suite、ZAP、Nessus: 各ツールが勝ったとき
すべてのワークフローを単一のツールでカバーできるわけではありません。 FixVibe が当てはまる場所の正直な枠組み:
| Aspect | げっぷスイート / OWASP ZAP | ネッスス / クアリス | FixVibe |
|---|---|---|---|
| Setup | プロキシとブラウザの手動構成 | ネットワークエージェントのインストール | URLを貼り付けてサインインしてください |
| 最初の発見までの時間 | 数分から数時間 | 数時間から数日 | 数秒から数分 |
| BaaS 設定チェック | ファーストクラスのサポートなし | No | Supabase RLS、Firebase ルール、店員、JWT 図形 |
| JS バンドル シークレットの検出 | 一般的なエントロピー正規表現 | No | Provider 固有のパターン + ブラウザ ストレージ スキャン |
| AI-コーディングされたフレームワークの認識 | Unaware | Unaware | Next.js、Vite、Vercel、Cloudflare ページ、Supabase |
| アクティブスキャン認証ゲート | 手動スコープ規律 | 手動スコープ規律 | 必須: DNS または HTTP- ファイル ドメインの検証 |
| ファーストクラス API + MCP | API が存在します | API が存在します | REST + MCP クロード用サーバー / Cursor / Continue |
ツールが相互に補完し合う場所
- Start with FixVibe passive は、あらゆる展開プレビューに対する無料の 30 秒ベースラインとして使用できます。何も表面化していない場合は、すぐに信頼シグナルが得られます。
- 独自のインフラストラクチャに対する完全なアクティブ カバレッジ (SQLi/SSTI/IDOR/etc.) が必要な場合は、検証済みドメインの Move to FixVibe active。
- Layer SAST (Semgrep、CodeQL、Snyk) の CI のソース コード。 SAST は、ランタイムが認識できないもの、つまりデプロイに到達しないコード パス内の危険なパターンを捕捉します。
- Reach for Burp Suite カスタム攻撃チェーン (特定の認証バイパス、複雑な IDOR シナリオ、ビジネス ロジックの欠陥) が必要な場合。げっぷは、利用可能な最も深い手動作業台です。 FixVibe は、最も高速な自動ベースラインです。
次のステップ
Continue と Vibe coding security checklist を組み合わせて 44 項目の出荷前監査を行うか、How to secure an app built with AI coding tools にジャンプしてコード スニペットを使用して段階的に強化します。
