07 - Vibe コーディングのセキュリティ: リスクと緩和策
2025 年 7 月 21 日、SaaStr の創設者であるジェイソン レムキンは、 小さなアプリケーション。開発の 9 日目に、彼は本番データベースを使用していることに気づきました。 完全に削除されました。1,206 件の役員プロフィールと 1,196 社の企業が数秒で蒸発しました。 AI エージェントは、アクティブなコードのフリーズ中に実稼働テーブルを削除し、その後、 4,000件の架空の記録を捏造し、利用可能なロールバックオプションについて嘘をつきました。
これは特別なケースではありません。これは構造的な問題の兆候です。つまり、バイブコーディングと エージェントは運用コードベースに体系的な脆弱性を持ち込んでいます 従来のレビュープロセスにはそれを特定する機能が備わっていないということです。によると、 Veracode 2025 GenAI コードセキュリティレポート, コードサンプルの 45% は AI によって生成されました OWASP トップ 10 の脆弱性を引き起こすセキュリティ テストに不合格。見れば見るほどデータが悪くなる 特定の言語への依存: Java の失敗率は 72% ですが、Python、C#、および JavaScript は 38% ~ 45% の間で変動します。
これらは単なる明らかなバグではありません。 AI 生成コードの機能の 62% 欠陥設計 - 機能テストでは明らかにならないが、アーキテクチャ上の欠陥 これにより、遡って閉じることが困難な大きな攻撃対象領域が開かれます。研究者 バーリ大学の研究者は、AI によって生成されたコードには 2.74 倍のコードが含まれていると計算しました。 人間の上級開発者が書いたコードと比較した脆弱性。
この記事は、AI コーディング ツールを使用する開発者向けの実践的なガイドです。一つもありません 生産性において真の利益をもたらすパラダイムの非難だが、具体的な枠組み 安全にお使いいただくために。
何を学ぶか
- AI 生成コードで最も一般的な脆弱性とその発生理由
- サプライチェーンにおける「不法占拠」と幻覚的な依存関係の問題
- プロンプトインジェクション: コードアシスタントがどのように侵害されるか
- AI コード用の SAST および DAST: 基本的に Semgrep、SonarQube、Bandit
- AI 生成コード用の特定のセキュリティ ゲートを備えた CI/CD パイプライン
- 本番環境での AI エージェントのサンドボックス化と分離
- ベスト プラクティス: 最小特権の原則と多層防御
- 本番環境でバイブコーディングを使用するチーム向けの運用チェックリスト
AI 生成コードにおける脆弱性の状況
AI によって生成されたコードが体系的により脆弱である理由を理解するには、次のことを行う必要があります。 生成自体がどのように機能するかを理解します。言語モデルはセキュリティについて「推論」しない 工学的な意味での用語: 学習したパターンに基づいて次のトークンを予測します トレーニング中。トレーニング セットが脆弱なコードでいっぱいの場合 - 脆弱なコードが多数あるため、実際にそうなっています。 GitHub 上のパブリック コードの一部がセキュリティのベスト プラクティスに従っていない - パターンが再現される それらと同じパターン。
Veracode レポートでは、80 の構造化コーディング タスクにわたって 100 以上の LLM を分析して明らかにしました。 CWE (Common Weakness Enumeration) の弱点。結果は憂慮すべきものです:
| 脆弱性の種類 | AI サンプルの割合 | CWE リファレンス |
|---|---|---|
| クロスサイト スクリプティング (XSS) | サンプルの 86% | CWE-80 |
| ログインジェクション | サンプルの 88% | CWE-117 |
| SQLインジェクション | サンプルの約 20% | CWE-89 |
| ハードコードされた認証情報 | 頻繁(数値化されていない) | CWE-798 |
| クライアント側の認証 | Webプロジェクトでよくあること | CWE-603 |
| パストラバーサル | ファイル操作に存在します | CWE-22 |
特に憂慮すべき事実は、 長期にわたる安定性 これらの結果のうち: を搭載したモデルにもかかわらず、安全性能はほとんど変わりません。 生成されたコードの構文品質が大幅に向上しました。最新かつ最大のモデル それらは、以前のバージョンよりも大幅に安全なコードを生成するわけではありません。
SQL インジェクション: 決して消えることのない古典
データベースにアクセスできる API エンドポイントを生成するように AI に依頼すると、結果は 通常は、ユーザー入力を SQL クエリに直接連結します。コード例を見てみましょう 一般的に生成される脆弱性と修正バージョン:
# ================================================================
# VULNERABILE - Codice tipicamente generato da AI senza contesto
# ================================================================
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users/search')
def search_users():
name = request.args.get('name', '')
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
# VULNERABILE: concatenazione diretta dell'input
query = f"SELECT * FROM users WHERE name LIKE '%{name}%'"
cursor.execute(query)
results = cursor.fetchall()
conn.close()
return jsonify(results)
# Attacco: GET /users/search?name='; DROP TABLE users; --
# Risultato: cancellazione dell'intera tabella
# ================================================================
# SICURO - Versione con parametri bound
# ================================================================
from flask import Flask, request, jsonify
import sqlite3
from typing import Optional
import re
app = Flask(__name__)
MAX_NAME_LENGTH = 100
ALLOWED_NAME_PATTERN = re.compile(r'^[a-zA-Z\s\-\']+






