AI開発アンチパターン 2025年11月2日

AI開発でセキュリティを軽視すると何が起きるか

vibe codingで最も深刻な問題の一つが、**セキュリティの軽視** です。 **統計データ:** AI生成コードに頻出するセキュリティ脆弱性を見てみましょう。 **危険なコード(AIが生成しがち):**。

川西智也

合同会社ロイヤルピース 代表

アンチパターン⑧「セキュリティ軽視」

AI開発で見落とされるセキュリティ

vibe codingで最も深刻な問題の一つが、セキュリティの軽視 です。

統計データ:

  • Veracodeレポート: AI生成コードの 45% にセキュリティ欠陥
  • Snyk調査: 開発者の 56% がAIツールによるセキュリティ脆弱性導入を報告

よくあるセキュリティ脆弱性

AI生成コードに頻出するセキュリティ脆弱性を見てみましょう。

SQLインジェクション

危険なコード(AIが生成しがち):

// ユーザー入力を直接クエリに埋め込み
const query = `SELECT * FROM users WHERE id = ${userId}`;

安全なコード:

// プレースホルダーを使用
const query = 'SELECT * FROM users WHERE id = $1';
const result = await db.query(query, [userId]);

XSS(クロスサイトスクリプティング)

危険なコード:

// ユーザー入力を直接HTMLに挿入
element.innerHTML = userInput;

安全なコード:

// テキストとして挿入、またはサニタイズ
element.textContent = userInput;
// または
element.innerHTML = DOMPurify.sanitize(userInput);

認証機能の実装ポイントバイパス

危険なコード:

// クライアントサイドでの認証チェックのみ
if (user.isAdmin) {
  showAdminPanel();
}

安全なコード:

// サーバーサイドでの認証チェック
app.get('/admin', authenticateAdmin, (req, res) => {
  // 認証済みのみここに到達
});

シークレット露出

危険なコード:

// クライアントサイドにAPIキー
const API_KEY = "sk-xxxxxxxxxxxxxxx";
fetch(`/api?key=${API_KEY}`);

安全なコード:

// サーバーサイドで環境変数から読み込み
const apiKey = process.env.API_KEY;

なぜAIはセキュアなコードを書けないのか

AIがセキュアなコードを生成しにくい理由があります。

理由1: トレーニングデータの問題

  • インターネット上のコードは脆弱性を含むものも多い
  • Stack Overflowの回答は「動く」ことが優先
  • セキュリティベストプラクティスは少数派

理由2: コンテキストの不足

  • AIはシステム全体を理解していない
  • 認証フローの全体像を把握していない
  • どのデータが機密かを知らない

理由3: 「動く」ことへの最適化

  • AIは「動くコード」を生成するよう訓練されている
  • 「セキュアなコード」は二次的な目標

実践的な解決策:セキュリティを最優先に

セキュリティ問題を防ぐための実践的な解決策があります。

実践的な解決策1: プロンプトにセキュリティ要件を含める

悪いプロンプト:

ログイン機能を作って

良いプロンプト:

ログイン機能を作って:
- パスワードはbcryptでハッシュ化
- ブルートフォース対策(レート制限)
- CSRF対策
- セッション管理はHTTPOnly Cookie
- SQLインジェクション対策

実践的な解決策2: セキュリティスキャンの導入

# GitHub Actions でのセキュリティスキャン
name: Security Scan
on: [push, pull_request]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Snyk
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

実践的な解決策3: OWASP Top 10チェックリスト

生成されたコードを以下の観点でレビュー:

  • A01: 認証の不備
  • A02: 暗号化の失敗
  • A03: インジェクション
  • A04: 安全でない設計
  • A05: セキュリティの設定ミス
  • A06: 脆弱なコンポーネント
  • A07: 認証と識別の失敗
  • A08: データの完全性
  • A09: ログとモニタリングの失敗
  • A10: SSRF

実践的な解決策4: 技術者によるセキュリティレビュー

  • 本番デプロイ前に必ずセキュリティレビュー
  • 非技術者は技術者とペアで
  • 外部のセキュリティ監査を検討

Lovable事件の教訓

別記事で紹介したLovable事件を振り返りましょう。

事件概要:

  • スウェーデンのvibe codingツール「Lovable」
  • 1,645件のアプリを分析
  • 170件 に個人情報露出の脆弱性

教訓:

  • 「動く」≠「安全」
  • ツールが生成したコードをそのまま使うな
  • セキュリティレビューは必須

この事例から学ぶべき教訓と実践ポイント

「セキュリティ軽視」から学ぶべきことは以下の通りです。

  1. AI生成コードの45%にセキュリティ欠陥

    • 「AIが書いたから安全」は幻想
  2. よくある脆弱性を知る

    • SQLインジェクション、XSS、認証バイパス
  3. プロンプトにセキュリティ要件を含める

    • 明示的に指示しなければ考慮されない
  4. 自動スキャンを導入

    • Snyk、SonarQubeなどのツール
  5. セキュリティレビューを必須化

    • 本番デプロイ前に技術者がレビュー

まとめ:重要ポイントの振り返り

  • AI生成コードの 45%にセキュリティ欠陥 (Veracode)
  • よくある脆弱性:SQLインジェクション、XSS、認証バイパス
  • AIは 「動く」ことに最適化 されている
  • 解決策:プロンプトにセキュリティ要件自動スキャンレビュー必須
  • 教訓:セキュリティは後付けではなく、最初から組み込め

実践的なスキルを習得しませんか?

ブログで学んだ知識を、研修で実践に変えましょう。