AI 生成コードのセキュリティ検出
AI が生成したコードには一定の割合でセキュリティ上の脆弱性が存在します 2.5倍 手動で書かれたコードと比較してください。これは、SQL インジェクションなどの些細な問題ではありません。 ハードコーディングされたシークレット、弱い認証、安全でない構成が繰り返されるパターン AI アシスタントの出力で。根本的な原因は言語モデルが最適化されていることです セキュリティのためではなく、機能のためです。
この記事では、AI が生成したコードの最も一般的な脆弱性を次の基準に従って分析します。 分類 OWASP トップ 10 e CWE、エラーパターン AI アシスタントに特有の内容と、傍受するための自動スキャンの実装方法 生産前にこれらの問題を解決します。
何を学ぶか
- AI 生成コードで最も頻繁に発生する OWASP の脆弱性
- AI 出力に典型的な安全でないデフォルト パターン
- 生成されたコード内でハードコーディングされたシークレットと資格情報を検出する方法
- AI コードの SAST (静的アプリケーション セキュリティ テスト) 技術
- AI 固有の脆弱性の CWE 分類
- パイプラインでの自動セキュリティ スキャンの実装
AI コード コンテキストにおける OWASP トップ 10
OWASP トップ 10 分類は、最も重大かつ広範囲に及ぶ Web 脆弱性を表します。 AI によって生成されたコードのコンテキストでは、これらの脆弱性の一部が頻繁に出現します。 平均を大幅に上回っており、特にインジェクション、認証の破損が顕著です そしてセキュリティの設定ミス。
A03:2021 - 注射
インジェクションは、AI によって生成されたコードで最も一般的な脆弱性です。言語モデル 文字列、エスケープされていないシェル コマンドを連結することによって SQL クエリを頻繁に生成します。 サニタイズなしの HTML テンプレート。これは、トレーニング データに次のものが含まれているために発生します。 これらの安全でないパターンを含む例は何百万もあります。
# VULNERABILE: SQL injection tipica del codice AI
def get_user(username):
query = f"SELECT * FROM users WHERE username = '{username}'"
return db.execute(query)
# VULNERABILE: Command injection
def convert_file(filename):
import os
os.system(f"convert {filename} output.pdf")
# SICURO: Query parametrizzate
def get_user_safe(username):
query = "SELECT * FROM users WHERE username = %s"
return db.execute(query, (username,))
# SICURO: Subprocess con lista di argomenti
def convert_file_safe(filename):
import subprocess
import shlex
# Validazione del filename
if not filename.isalnum() and '.' not in filename:
raise ValueError("Invalid filename")
subprocess.run(["convert", filename, "output.pdf"],
check=True, capture_output=True)
A07:2021 - 識別と認証の失敗
AI は、構造的な欠陥を伴う認証メカニズム、つまりパスワードを頻繁に生成します。 平文、無期限セッション、予測可能なトークン、レート制限の欠如。これら パターンは、プロンプトを満たすために AI が適用する単純化から生じます。 できるだけ直接的に。
A05:2021 - セキュリティの構成ミス
安全でない構成は AI コードに蔓延する問題です: 寛容な CORS、 運用環境ではデバッグ モードがアクティブになっており、セキュリティ ヘッダーが欠落しており、TLS が無効になっています。 AI は、ローカル開発向けにそうではない機能構成を生成する傾向があります。 生産に適しています。
AI と人間のコードにおける OWASP 脆弱性の頻度
| OWASP の脆弱性 | ヒューマンコードの周波数 | AIコードの周波数 | CWE関連 |
|---|---|---|---|
| A03 - 注射 | 12% | 34% | CWE-89、CWE-78、CWE-79 |
| A07 - 認証の失敗 | 8% | 22% | CWE-287、CWE-798 |
| A05 - 構成ミス | 15% | 41% | CWE-16、CWE-611 |
| A02 - 暗号化の失敗 | 6% | 18% | CWE-327、CWE-328 |
| A01 - 壊れたアクセス制御 | 10% | 15% | CWE-284、CWE-862 |
AI における安全でないデフォルトのパターン
AI コードに関する最も厄介な問題の 1 つは、 安全でないデフォルト: 正しく動作するが安全ではない構成。 AI が最も多くの選択肢を選択する シンプルで機能的ですが、多くの場合、安全性の低いものと一致します。
# Pattern di insecure defaults tipici dell'AI
# 1. CORS permissivo
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # AI default: permette TUTTO. Nessuna restrizione di origin
# SICURO:
CORS(app, origins=["https://myapp.com"], methods=["GET", "POST"])
# 2. JWT senza scadenza
import jwt
token = jwt.encode({"user_id": 123}, SECRET_KEY) # Nessuna scadenza!
# SICURO:
from datetime import datetime, timedelta
token = jwt.encode(
{"user_id": 123, "exp": datetime.utcnow() + timedelta(hours=1)},
SECRET_KEY,
algorithm="HS256"
)
# 3. Hashing debole
import hashlib
password_hash = hashlib.md5(password.encode()).hexdigest() # MD5!
# SICURO:
import bcrypt
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
# 4. Debug mode in produzione
app.run(debug=True, host="0.0.0.0") # Espone debugger e stacktrace
# SICURO:
import os
app.run(debug=os.getenv("FLASK_DEBUG", "false").lower() == "true",
host="127.0.0.1")
ハードコードされたシークレットと認証情報
AI は、ハードコーディングされた資格情報 (API キー、データベース パスワード、 認証トークンと暗号化シークレットをソース コードに直接記述します。これは 1 つです 資格情報がバージョン管理に置かれるため、最も深刻なセキュリティ問題が発生します。 これらは、公開リポジトリまたは侵害されたリポジトリから抽出される可能性があります。
# Scanner per hardcoded secrets nel codice AI
import re
from pathlib import Path
class SecretScanner:
"""Rileva credenziali hardcoded nel codice sorgente"""
PATTERNS = [
(r'(?i)(api[_-]?key|apikey)\s*[=:]\s*["\']([A-Za-z0-9_\-]{20,})["\']',
"API Key", "HIGH"),
(r'(?i)(password|passwd|pwd)\s*[=:]\s*["\']([^"\']+)["\']',
"Password", "CRITICAL"),
(r'(?i)(secret|token)\s*[=:]\s*["\']([A-Za-z0-9_\-]{16,})["\']',
"Secret/Token", "CRITICAL"),
(r'(?i)(aws_access_key_id)\s*[=:]\s*["\']?(AKIA[A-Z0-9]{16})',
"AWS Access Key", "CRITICAL"),
(r'(?i)(mongodb(\+srv)?://[^"\'\s]+)',
"Database Connection String", "HIGH"),
(r'-----BEGIN (RSA |EC )?PRIVATE KEY-----',
"Private Key", "CRITICAL"),
(r'(?i)bearer\s+[A-Za-z0-9\-._~+/]+=*',
"Bearer Token", "HIGH"),
]
def scan_file(self, filepath):
"""Scansiona un file per credenziali hardcoded"""
findings = []
content = Path(filepath).read_text()
for pattern, name, severity in self.PATTERNS:
matches = re.finditer(pattern, content)
for match in matches:
line_num = content[:match.start()].count('\n') + 1
findings.append({
"file": filepath,
"line": line_num,
"type": name,
"severity": severity,
"match": match.group(0)[:50] + "..."
})
return findings
def scan_directory(self, directory, exclude_patterns=None):
"""Scansiona ricorsivamente una directory"""
all_findings = []
exclude = exclude_patterns or [".git", "node_modules", "__pycache__"]
for path in Path(directory).rglob("*"):
if any(excl in str(path) for excl in exclude):
continue
if path.is_file() and path.suffix in [".py", ".js", ".ts", ".java", ".go"]:
all_findings.extend(self.scan_file(str(path)))
return sorted(all_findings, key=lambda x: x["severity"] == "CRITICAL",
reverse=True)
AI 固有の脆弱性の CWE 分類
システム 共通弱点列挙 (CWE) 標準化されたカタログを提供します ソフトウェアの弱点。 AI によって生成されたコードの場合、一部の CWE は特に 関連性があり、繰り返し発生します。それらを理解すると、目的を絞った方法でセキュリティ スキャナーを構成するのに役立ちます。
AI 生成コードに対する CWE の批判
| CWE ID | 名前 | AIの頻度 | インパクト |
|---|---|---|---|
| CWE-89 | SQLインジェクション | 非常に高い | データ侵害、データ操作 |
| CWE-798 | ハードコードされた認証情報 | 高い | 不正アクセス |
| CWE-79 | クロスサイトスクリプティング | 高い | セッションハイジャック、フィッシング |
| CWE-327 | 壊れた暗号アルゴリズム | 平均 | データの漏洩 |
| CWE-862 | 権限がありません | 平均 | 権限昇格 |
| CWE-400 | 制御されていないリソース | 平均 | サービス妨害 |
AI コード用の SAST: ツールと構成
Il 静的アプリケーション セキュリティ テスト (SAST) それは対する防御の第一線です AI が生成したコードの脆弱性。 SAST ツールは、ソース コードを分析することなく、 それを実行し、安全でないコードパターン、脆弱な構成、および違反を特定します。 セキュリティのベストプラクティス。
# Configurazione Semgrep per codice AI-generated
# .semgrep.yml
rules:
- id: ai-sql-injection
patterns:
- pattern: |
$QUERY = f"... {$VAR} ..."
$DB.execute($QUERY)
message: "Possibile SQL injection: usa query parametrizzate"
languages: [python]
severity: ERROR
metadata:
cwe: "CWE-89"
confidence: HIGH
ai-specific: true
- id: ai-hardcoded-secret
patterns:
- pattern: |
$KEY = "..."
- metavariable-regex:
metavariable: $KEY
regex: ".*(secret|key|token|password|api_key).*"
message: "Credenziale hardcoded: usa variabili d'ambiente"
languages: [python]
severity: ERROR
metadata:
cwe: "CWE-798"
- id: ai-insecure-hash
patterns:
- pattern: hashlib.md5(...)
- pattern: hashlib.sha1(...)
message: "Algoritmo di hashing debole: usa SHA-256 o bcrypt"
languages: [python]
severity: WARNING
metadata:
cwe: "CWE-327"
セキュリティスキャンパイプライン
AI コードの効果的なセキュリティ スキャン パイプラインには、複数のレベルの分析が含まれている必要があります。 シークレット検出 (コミット前)、SAST (CI)、依存関係スキャン (CI)、および DAST (ステージング)。 各レベルはさまざまなカテゴリの脆弱性を遮断し、多層防御を構築します。
推奨されるセキュリティ スキャン レベル
- 事前コミット: git-secrets または detect-secrets を使用したシークレット検出により、コミット前に資格情報をロックします
- プルリクエスト: ソース コード分析用の Semgrep、CodeQL、または Snyk Code を使用した SAST
- CI パイプライン: dependabot、Snyk、OWASP 依存関係チェックによる依存関係スキャン
- ステージング: アプリケーション テストを実行するための OWASP ZAP または Burp Suite を使用した DAST
- 生産: RASP によるランタイム保護と継続的な脆弱性監視
AI 固有のセキュリティ アンチパターン
従来の脆弱性に加えて、AI コードは特定のセキュリティ アンチパターンを提示します これらは生成プロセスの性質から生じます。こういうパターンは難しいですね 従来のスキャナーで検出し、カスタム ルールが必要です。
- 許容範囲を超えたエラー メッセージ: AI は内部システムの詳細を明らかにするエラー メッセージを生成します
- 機密データのログ記録: 個人情報、トークン、資格情報がログに記録される
- 信頼境界違反: AI は信頼できる入力と信頼できない入力を区別しません
- 競合状態: AI は適切な同期を行わずに同時コードを生成します
- 安全でない逆シリアル化: 検証なしで pickle、eval、または JSON.parse を使用する
自動修復
AI コードで見つかった脆弱性は、多くの場合自動的に修正できます。ツール Semgrep、CodeQL、Snyk などは、安全でないパターンをリリースに変える自動修正をサポートしています 安全です。このアプローチにより、開発者の負担が軽減され、修正サイクルが短縮されます。
自動修復は、最も一般的な脆弱性に対して特に効果的です。 SQL インジェクション、ハードコードされたシークレット、および弱い暗号化アルゴリズムとして定義されます。 安全な変換は決定論的であり、十分に文書化されています。
結論
AI によって生成されたコードのセキュリティは、開発者の善意に任せることはできません。 統計によると、脆弱性の頻度とパターンは大幅に増加しています。 エラーは予測可能です。これにより、効果的な防御を構築することが可能になります。 自動スキャン、カスタム ルール、統合されたセキュリティ パイプライン。
次の記事では、 テストインテリジェンス: テストを生成する方法 突然変異テスト、プロパティベースのテスト、ファジングを使用した AI コードのインテリジェント 従来のテストでは検出できなかった欠陥を発見します。
セキュリティはオプションではなく、必須です。 AI によって生成されたコードの場合、この要件は コミットごとに自動化して検証する必要があります。







