1. AI 生成コードのセキュリティの現状
2025 年から 2026 年にかけて Vibe コーディングがブームになりますが、それに伴いセキュリティ上の深刻な懸念が生じます。
| 研究 | 結果 |
|---|---|
| ベラコード (2026) | AI コードを使用するアプリの 72% にセキュリティ上の欠陥がある |
| スタンフォード (2025) | AI を使用する開発者は安全性の低いコードを作成し、セキュリティについてはより自信を持っています |
| GitHub (2026) | AI コード スキャンは、AI 生成コードと併用すると 3 倍多くの問題を検出します |
核心的な問題: AI は、セキュリティ上の脆弱性のあるコードを含む公開コードに基づいてトレーニングされています。 AIは差別しない コード例 (チュートリアル、StackOverflow) プロダクションコード。
2. OWASP トップ 10 と Vibe コーディング
2.1.注射 (A03:2021)
AI は安全でない SQL クエリを生成することがよくあります。
// ❌ AI có thể generate:
const users = await db.query(
`SELECT * FROM users WHERE email = '${email}'`
);
// ✅ Phải yêu cầu:
const users = await db.query(
'SELECT * FROM users WHERE email = $1',
[email]
);
// Prompt an toàn:
Always use parameterized queries. Never concatenate user input
into SQL strings. Use ORM methods when available.
2.2.認証の失敗 (A07:2021)
// ❌ AI có thể generate weak JWT: jwt.sign(payload, 'secret123') // Hardcoded secret!
// ✅ Secure version: jwt.sign(payload, process.env.JWT_SECRET!, { expiresIn: '15m', algorithm: 'RS256', // Asymmetric })
2.3.機密データの漏洩 (A02:2021)
// ❌ AI có thể log sensitive data: console.log('User login:', { email, password }); res.json({ user: { ...user } }); // Includes password hash!
// ✅ Chỉ return cần thiết: const { password, ...safeUser } = user; res.json({ user: safeUser });
2.4.安全でない直接オブジェクト参照 (A01:2021)
// ❌ AI thường bỏ auth check: app.get('/api/tasks/:id', async (req, res) => { const task = await prisma.task.findUnique({ where: { id: req.params.id }, }); res.json(task); // Any user can access any task! });
// ✅ Luôn check ownership: app.get('/api/tasks/:id', auth, async (req, res) => { const task = await prisma.task.findFirst({ where: { id: req.params.id, project: { members: { some: { userId: req.userId } }, }, }, }); if (!task) return res.status(404).json({ error: 'Not found' }); res.json(task); });
3. AI コードの一般的な脆弱性
| 脆弱性 | AIの頻度 | 例 |
|---|---|---|
| ハードコードされたシークレット | 非常に高い | コード内の API キー、パスワード |
| 入力検証が欠落している | 高 | ユーザー入力を検証しない |
| 弱い暗号通貨 | 高 | bcrypt、SHA-256 の代わりに MD5 |
| 認証チェックが欠落している | 平均 | エンドポイントがユーザーを検証しない |
| SQLインジェクション | 平均 | 文字列連結クエリ |
| XSS | 平均 | HTML の直接レンダリング |
| パストラバーサル | 低い | サニタイズされていないファイルパス |
4. 即時注射のリスク
MCP サーバーを使用する場合、または AI を介してユーザー入力を処理する場合:
// User nhập vào form:
"; DROP TABLE users; --
// Nếu AI xử lý raw input:
AI có thể generate code chứa malicious input
予防:
- ユーザー入力を AI プロンプトに直接渡さないでください
- AI に送信する前に入力をサニタイズする
- 実行前に AI 出力を検証する
- 拒否リストの代わりに許可リストを使用する
5. 安全なプロンプトパターン
5.1.セキュリティのためのカスタム指示
## Security Requirements
- NEVER hardcode secrets, API keys, or passwords
- ALWAYS use parameterized queries, never string concatenation for SQL
- ALWAYS validate and sanitize user input at API boundaries
- ALWAYS check authorization before returning data
- NEVER log sensitive data (passwords, tokens, PII)
- Use bcrypt with cost factor >= 12 for password hashing
- Use HTTPS for all external API calls
- Set security headers (CORS, CSP, HSTS)
Implement rate limiting on auth endpoints
5.2.セキュリティ第一のプロンプト
// Thay vì:
Create a login endpoint
// Dùng:
Create a secure login endpoint with:
- Rate limiting (5 attempts per minute per IP)
- Password hashing with bcrypt (cost 12)
- JWT with short expiry (15 min) + refresh token
- Account lockout after 10 failed attempts
- Audit logging for failed attempts
No password in response or logs
6. セキュリティスキャンツール
6.1. GitHub の高度なセキュリティ
GitHub Secret Scanning: phát hiện secrets trong code
CodeQL: static analysis cho security vulnerabilities
Dependabot: scan dependencies cho known vulnerabilities
6.2. CI/CD パイプライン内
# .github/workflows/security.yml name: Security Scan on: [pull_request] jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4# Dependency scan - run: npm audit --audit-level=high # Secret detection - uses: trufflesecurity/trufflehog@main with: path: ./ # SAST scan - uses: github/codeql-action/analyze@v3 with: languages: javascript-typescript # Container scan (if using Docker) - uses: aquasecurity/trivy-action@master with: scan-type: fs scan-ref: .
6.3. IDEレベルのスキャン
// Copilot itself can help with security review:
@workspace /review Check all API endpoints for:
1. Missing authentication middleware
2. Missing input validation
3. SQL injection vulnerabilities
4. Hardcoded secrets
5. Sensitive data in responses
7. Vibe コーディングの安全なコーディング パターン
パターン 1: 最初にミドルウェアを検証する
// Yêu cầu AI tạo validation middleware:
const validateRequest = (schema: z.ZodSchema) => {
return (req: Request, res: Response, next: NextFunction) => {
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({
error: 'Validation failed',
details: result.error.issues,
});
}
req.body = result.data; // Use validated data
next();
};
};
パターン 2: 認可ガード
// Resource-level authorization:
const canAccessProject = async (userId: string, projectId: string) => {
const member = await prisma.projectMember.findUnique({
where: {
userId_projectId: { userId, projectId },
},
});
return member !== null;
};
パターン 3: 出力のサニタイズ
// Chỉ return fields cần thiết:
const sanitizeUser = (user: User) => ({
id: user.id,
name: user.name,
email: user.email,
avatar: user.avatar,
// Exclude: password, resetToken, etc.
});
8. Vibe コーディングのセキュリティ チェックリスト
| # | チェックする | いつ |
|---|---|---|
| 1 | ハードコードされたシークレットはありません | すべてのコミット |
| 2 | すべてのエンドポイントでの入力検証 | 新しい各エンドポイント |
| 3 | 保護されたルートの認証ミドルウェア | それぞれの新ルート |
| 4 | パラメータ化されたクエリ | 各DBクエリ |
| 5 | ログ/応答に機密データがない | 各APIのレスポンス |
| 6 | 依存関係には CVE がありません | 毎週 |
| 7 | 設定されたセキュリティヘッダー | 1 回 + 検証 |
| 8 | 認証エンドポイントのレート制限 | 1 回 + 検証 |
9. まとめ
Vibe コーディングのセキュリティには次の要件が必要です 異なる考え方:
- 信頼するが検証する: AI コードには常にセキュリティ レビューが必要です
- 多層防御: 複数層のセキュリティチェック
- スキャンを自動化する: CI/CD は AI の問題を強制的に作成する必要があります
- デフォルトで安全: カスタム命令によりセキュリティ パターンを適用
- 最新情報を入手: AI モデルは向上しますが、脅威の状況も変化します
次の記事: 技術的負債と保守性 — Vibe コーディングを使用する際の技術的負債を管理します。