// 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 の脆弱性クラス
The same finding classes show up disproportionately in AI-generated apps:
- Exposed Supabase service-role keys. クライアント バンドルにコミットされた
service_roleJWT (eyJで始まる) は、プロジェクトのすべての RLS ポリシーをバイパスします。 Cursor は境界の間違った側でオートコンプリートします。キーは/_next/static/...で発送されます。 - Missing Row-Level Security (RLS). モデルは
CREATE TABLE public.itemsを認識し、RLS を有効にせずに続行します。匿名ユーザーは、公開 anon キーを介して任意の行を読み書きできるようになります。 Supabase Row-Level Securityを参照してください。 - Open Firebase / Firestore rules. Generated rules files often read
allow read, write: if true;or skip the rules file entirely. Test-mode rules let anyone read and overwrite data until someone replaces them. - Hardcoded API keys in bundles. Stripe ライブ キー、Anthropic
sk-ant-*、OpenAIsk-*、GoogleAIza*、AWSAKIA*キーは、env-var 規律が失われると JS ペイロードにインライン化されます。 Secrets in JavaScript Bundles は、レンダリングされたページ レベルでフラグを立てます。 - Missing Content Security Policy. いいえ
Content-Security-Policy応答ヘッダーは、すべてのインライン スクリプト XSS が 1 クリックでアカウントの完全な乗っ取りを意味します。 CSP は抽象的です。 codegen は定期的にそれをスキップします。 HTTP 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. Generated
/api/debug,/api/health,/api/__nextjs_original-stack-frame, or/.next/traceroutes leak internals. FixVibe reports them only with evidence that they really are exposed (Vercel-Specific Exposure). - 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. Recognising real API-key formats — Stripe
sk_live_, Anthropicsk-ant-, Supabase service-role keys — and telling a secret key from a publishable one. Generic pattern matching throws too many false positives. - Passive + active split. パッシブ チェック (ヘッダー、Cookie、シークレット、BaaS 構成、DNS) は、あらゆる URL に対して安全に実行されます。アクティブ プローブ (SQLi、XSS、SSTI、IDOR ウォーキング) は、攻撃形式のペイロードを起動するため、承認境界が必要です。
- Framework awareness. Recognising Next.js App Router vs Pages Router, Vite SPA rewrites, Vercel deployment-protection, Cloudflare Pages routing. A scanner that doesn't understand how these platforms answer unknown paths generates noise.
- Rate-limit safety. Bounded request budgets per scan, and findings that require positive evidence — a blanket
403from a WAF is not proof a file exists. - 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 230+ 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: 各ツールが勝ったとき
No single tool covers every workflow. For a sourced side-by-side of FixVibe, Burp Suite, ZAP, Snyk, Semgrep and Aikido, with a decision matrix, see choosing a security scanner for AI-built apps.
ツールが相互に補完し合う場所
- Start with FixVibe passive as a free baseline against any deploy preview — it usually finishes in under a minute. If nothing surfaces, you have a fast confidence signal.
- 独自のインフラストラクチャに対する完全なアクティブ カバレッジ (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 を組み合わせて 51 項目の出荷前監査を行うか、How to secure an app built with AI coding tools にジャンプしてコード スニペットを使用して段階的に強化します。
