GitHubの決断
GitHubが低品質なAI生成コードによるContributeを拒否する仕組みを検討・実装中だというニュースが話題になっています。
同時期に、AI評価機関METRが「SWE-benchのテストに合格したPRでも、人間のレビュアーはマージを拒否する」という調査結果を発表しました。
テストが通る ≠ 本番に出せるコード
この当たり前のことが、AI生成コードの時代に改めて突きつけられています。
実際にAI生成コードをスキャンして分かったこと
私はここ2週間、AI生成コードに特化したセキュリティスキャナー「CodeHeal」を開発しています。14カテゴリ・93ルールの静的解析エンジンで、LLMは一切使わず、パターンマッチと正規表現だけで検出します。
開発中に実際のAI生成コードをスキャンして気づいたのは、テストでは絶対に見つからない脆弱性パターンが大量に存在するということでした。
パターン1: 「動くけど危険な」シークレット管理
// AIが生成しがちなコード
const API_KEY = "sk-proj-abc123...";
const response = await fetch(url, {
headers: { Authorization: `Bearer ${API_KEY}` }
});
テストは通ります。アプリも動きます。でもAPIキーがソースコードにハードコードされています。
最初のスキャン精度テストで6ファイルを通したとき、2ファイルでルールのバグを発見しました。1つはrm -rfの変数展開が未クォートのケース、もう1つはfetch()のURL検証漏れ。修正後に全6ファイルが正しく検出できるようになりましたが、ルールを書く側も見落とすレベルの微妙な問題がAI生成コードには潜んでいます。
パターン2: 過剰に寛容なCORS設定
// Express/Next.jsでAIが頻繁に生成するパターン
app.use(cors({ origin: '*' }));
開発環境では問題なく動きます。テストも通ります。でも本番環境でこれは、任意のドメインからAPIを叩ける状態です。
パターン3: パラメータ化されていないSQLクエリ
// テンプレートリテラルでの直接埋め込み
const result = await db.query(
`SELECT * FROM users WHERE id = ${userId}`
);
テストデータはクリーンなので通ります。本番でuserIdに1 OR 1=1が来たら全データ流出です。
パターン4: 入力バリデーションの欠如
AI生成コードは「ハッピーパス」を完璧に実装します。でも信頼境界でのバリデーションが抜けがちです。文字列長のチェック、型の検証、サニタイズ処理 — テストでは正常値しか渡さないので問題が顕在化しません。
なぜ既存ツールでは不十分なのか
開発の最初の1週間、SemgrepとESLintでAI生成コード特有のパターンを検出できないか試しました。結論: できなくはないが、ルール設計の前提が違う。
既存のSASTツールは「人間が書くコードのパターン」を前提に設計されています。経験のあるエンジニアが書くミス(バッファオーバーフロー、既知のCVE)は得意ですが、AI特有の「表面上は正しいが意図が危険な」パターンへの対応は限定的です。
例えば:
- 難読化コード検出: 人間の悪意あるコードだけでなく、AIが「最適化」と称して生成する読みにくいコードも検出する必要がある
- 同意ギャップ検出: コードの説明と実際の動作が乖離しているケース(AIのハルシネーション由来)
- メタデータ品質: package.jsonの不審な設定、存在しないリポジトリURLなど
これらはAI生成コード特有の問題で、従来のセキュリティスキャナーの守備範囲外です。
Google Wiz買収が示すもの
今週、GoogleがセキュリティスタートアップWizの買収を正式に完了しました。評価額は約320億ドル(約5兆円)。セキュリティ市場はAIの普及に比例して急拡大しています。
日本市場に目を向けると、AI生成コードに特化した日本語対応のセキュリティスキャナーは現時点で存在しません。Snyk、SonarQube、Semgrep — いずれも優れたツールですが、AI生成コード特化という切り口はありません。
数字で見る現状
CodeHealの検出エンジンの現在のスペック:
| 項目 | 数値 |
|---|---|
| 検出カテゴリ | 14 |
| 検出ルール数 | 93+ |
| 精度テスト合格率 | 6/6 (100%) |
| LLM使用 | なし(静的解析のみ) |
| API費用 | $0 |
| 再現性 | 100%(同じコード → 同じ結果) |
LLMを使わない理由は単純で、再現性が欲しかったからです。LLMベースのスキャンは実行するたびに結果が変わります。5回スキャンして5回とも違う結果が返ってきたとき、「これはセキュリティツールとして根本的に破綻している」と気づきました。
コードをスキャンしてみませんか?
AI生成コードを本番に出す前に、テストでは見つからない脆弱性パターンをチェックできます。無料でスキャン可能です。
CodeHeal — AI生成コード特化セキュリティスキャナー
無料でスキャンする →