AIセキュリティ 2025年7月5日

AI生成コードでAPIキーが露出する5つのパターン

vibe codingで最も多い脆弱性は、**APIキー・シークレットの露出** です。 **統計:** これは、vibe coderの半数近くがAPIキーを露出させているということです。 AIが生成しがちな危険なコードを見てみましょう。

川西智也

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

アンチパターン⑧「APIキー露出」

AI生成コードで最も多いセキュリティ脆弱性

vibe codingで最も多い脆弱性は、APIキー・シークレットの露出 です。

統計:

  • 2,000以上のvibe-codedサイト調査で49.5%に秘密情報露出(Wiz Research)
  • 露出している情報: APIキー、JWT、Google API keys

これは、vibe coderの半数近くがAPIキーを露出させているということです。


【要注意】典型的な危険コードパターン

AIが生成しがちな危険なコードを見てみましょう。

危険なコード(フロントエンドにハードコード):

// ❌ クライアントサイドにAPIキーを直接記述
const OPENAI_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxx";
const STRIPE_SECRET_KEY = "sk_live_xxxxxxxxxxxx";

// APIを呼び出し
fetch('https://api.openai.com/v1/chat/completions', {
  headers: { 
    'Authorization': `Bearer ${OPENAI_API_KEY}` 
  }
});

このコードをブラウザに配信すると、誰でもAPIキーを取得できます。


発見の容易さ

APIキーの発見は、驚くほど簡単です。

3クリックで発見:

  1. ブラウザで対象サイトを開く
  2. F12キーで開発者ツールを開く
  3. 「Network」タブまたは「Sources」タブを確認

これだけで、APIキーが見つかることがあります。

自動化ツールの存在:

攻撃者は自動化ツールを使い、大量のサイトからAPIキーを収集しています。

# 攻撃者が使うような検索パターン
grep -r "sk-" . --include="*.js"
grep -r "api_key" . --include="*.js"
grep -r "secret" . --include="*.js"

実際の被害事例

OpenAI APIキー流出事件:

“Hackers scraped thousands of OpenAI API keys from public Replit projects, which developers had left in plaintext. These keys were abused to access GPT-4 for free, racking up massive bills for unsuspecting users.”

SaaS開発者の悲劇:

“In one case, API keys were scraped from client-side code that AI had carelessly left exposed. The developer had to negotiate with OpenAI to forgive his bill.”

被害の種類:

  1. 課金被害: APIの無断使用で高額請求
  2. サービス停止: レート制限超過でサービスダウン
  3. データ漏洩: APIを通じた顧客データへのアクセス
  4. 評判損害: セキュリティインシデントによる信用失墜

なぜAIはAPIキーを露出させるのか

AIがAPIキーを露出させるコードを生成する理由があります。

理由1: 「動く」ことが優先

  • セキュリティよりも機能実現が優先
  • 環境変数の設定は「追加作業」として省略

理由2: 最短経路の提示

  • 最も簡単な実装方法を提示
  • 本番環境を想定していない

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

  • チュートリアルやサンプルコードでは簡略化されている
  • 本番用のセキュリティ設定は省略されていることが多い

実践的な解決策:正しいAPIキー管理

APIキーを安全に管理する方法を解説します。

実践的な解決策1: 環境変数を使用

フロントエンド(Next.js等):

// .env.local(サーバーサイドのみ)
OPENAI_API_KEY=sk-xxxxxxxx

// API Route (サーバーサイド)
export default function handler(req, res) {
  const apiKey = process.env.OPENAI_API_KEY;
  // サーバーサイドでAPIを呼び出し
}

注意: NEXT_PUBLIC_ プレフィックスを付けると、クライアントに露出します。

実践的な解決策2: バックエンドプロキシ

// フロントエンド
fetch('/api/chat', { method: 'POST', body: JSON.stringify(data) });

// バックエンド(API Route)
export default async function handler(req, res) {
  const response = await fetch('https://api.openai.com/...', {
    headers: { 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` }
  });
  res.json(await response.json());
}

実践的な解決策3: シークレット管理サービス

// AWS Secrets Manager
const { SecretsManager } = require('@aws-sdk/client-secrets-manager');
const client = new SecretsManager();

const secret = await client.getSecretValue({ SecretId: 'my-api-key' });
const apiKey = JSON.parse(secret.SecretString).OPENAI_API_KEY;

プロンプトによるセキュリティ対策

AIにコードを依頼する際、APIキー管理を明示的に指示しましょう。

悪いプロンプト:

OpenAI APIを使ってチャットボットを作って

良いプロンプト:

OpenAI APIを使ってチャットボットを作って:

## 必須のセキュリティ要件
- APIキーは環境変数から読み込む
- フロントエンドにAPIキーを露出しない
- バックエンドプロキシを使用
- レート制限を実装

実装前チェックリスト

APIキー露出を防ぐためのチェックリストです。

コミット前:

  • コードにAPIキーがハードコードされていないか
  • .env ファイルは .gitignore に含まれているか
  • フロントエンドに NEXT_PUBLIC_ 等の危険な環境変数がないか

デプロイ前:

  • 本番環境の環境変数は適切に設定されているか
  • シークレット管理サービスを使用しているか
  • ログにAPIキーが出力されていないか

定期確認:

  • GitHubのSecret Scanningを有効化
  • 公開リポジトリにシークレットがないか確認
  • APIキーのローテーションを実施

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

「APIキー露出」から学ぶべきことは以下の通りです。

  1. 49.5%のサイトに秘密情報露出

    • 非常に多い脆弱性
  2. 発見は驚くほど簡単

    • 3クリックで見つかる
  3. 被害は深刻

    • 高額課金、サービス停止、データ漏洩
  4. 解決策は明確

    • 環境変数、バックエンドプロキシ、シークレット管理
  5. プロンプトで明示

    • セキュリティ要件を指示

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

  • vibe-codedサイトの 49.5%にAPIキー露出 (Wiz Research)
  • 3クリック で発見可能
  • 被害:高額課金、サービス停止、データ漏洩
  • AIは 「動く」ことを優先 、セキュリティは後回し
  • 解決策:環境変数、バックエンドプロキシ、シークレット管理
  • プロンプトで セキュリティ要件を明示
  • 教訓:APIキーをフロントエンドに置くな

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

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