Broken by Default: A Formal Verification Study of Security Vulnerabilities in AI-Generated Code

この論文は、7 つの最先端 LLM が生成した 3,500 件のコードを Z3 ソルバーを用いた形式検証で分析した結果、どのモデルも「D 評価」以下であり、55.8% のコードに数学的に証明された脆弱性が存在し、既存のセキュリティツールはこれらを検出できないことを示している。

原著者: Dominik Blain, Maxime Noiseux

公開日 2026-04-08✓ Author reviewed
📖 1 分で読めます☕ さくっと読める

これは以下の論文のAI生成解説です。著者が執筆したものではありません。技術的な正確性については原論文を参照してください。 免責事項の全文を読む

Each language version is independently generated for its own context, not a direct translation.

「デフォルトで壊れている」:AI が書くコードの安全性に関する驚きの調査

この論文は、**「AI が自動生成したコードは、実は非常に危険な状態にある」**という衝撃的な事実を、数学的な証明を使って突き止めた研究報告です。

まるで「自動運転カー」が、運転席に誰もいない状態で高速道路を走り出し、**「55% の確率でクラッシュする」**と判明したようなものです。

以下に、専門用語を排し、日常の例えを使ってこの研究の内容を解説します。


1. 何をしたのか?(実験の概要)

研究者たちは、世界中で最も進んだ AI 7 社(GPT-4o や Gemini など)に、**「セキュリティが重要なプログラム(銀行のシステムやパスワード管理など)」**を 500 種類書かせました。

  • 対象: AI 7 社 × 500 問 = 3,500 個のコード
  • 方法: 単に「バグがありそうか?」と目視でチェックするのではなく、「Z3(ザ・スリー)」という超高度な数学的な証明ツールを使って、そのコードが実際にハッキングされるかどうかを「数学的に証明」しました。

2. 驚きの結果:「55% は壊れている」

結果は悲惨でした。

  • 平均して、生成されたコードの 55.8% に重大な欠陥がありました。
  • 一番優秀な AI でも「48.4%」の欠陥率(評価 D)。
  • 一番多い AI(GPT-4o)は「62.4%」の欠陥率(評価 F=不合格)。
  • どの AI も「C(合格)」以上の評価を取れませんでした。

つまり、AI に「安全なコードを書いて」と頼んでも、半分近くのコードは「爆弾」を仕込んだまま完成してしまうのです。

3. なぜそんなに危険なのか?(具体的な例え)

AI が最も失敗したのは、**「整数オーバーフロー(数字の桁あふれ)」**という問題です。

例え話:スーパーの袋詰め

客が「100 個のりんごを袋に入れて」と頼んだとします。

  • 正しい人間: 「袋の容量は 100 個までだから、100 個入るか確認してから入れる」と考えます。
  • AI の失敗: 「100 個」という数字を聞いて、袋のサイズを計算する際、**「100 × 100 = 10,000」と計算したつもりが、計算機が「10,000」を処理しきれず、「0」「マイナス」**になってしまいます。

その結果、AI は**「袋のサイズが 0 だ!」**と判断し、空っぽの袋を渡そうとします。しかし、実際には 10,000 個のりんごが押し込まれ、袋が破裂して中身(データ)が溢れ出します。

この「袋の破裂(メモリ破損)」が、ハッカーに悪用されると、**「あなたのパスワードを盗む」「サーバーを乗っ取る」**といった攻撃が可能になります。AI はこの「袋の破裂」を 87% の確率で起こしてしまいました。

4. 「安全に書いて」と頼んでもダメだった

研究者は、「AI に『安全に書いてね!バグを作らないで!』と念押し(プロンプト)をしたら、マシになるかな?」と試しました。

  • 実験規模の注意点: この「安全なプロンプト」の効果を検証した実験は、**500 問の全データではなく、その中から選抜された 50 問のサブセット(v1)**で行われました。
  • 結果: この小規模な実験において、欠陥率はわずかに 4% 下がるだけ(64% → 60%)でした。
  • 意味: 「安全に書いて」という言葉は、AI の脳内にある「危険な書き方の癖」を消し去るには無力でした。
    • AI は、インターネット上の「バグだらけの古いコード」を大量に学習しているため、「袋を破裂させる書き方」が「正しい書き方」だと勘違いしてしまっているのです。

5. 既存のセキュリティツールは「目が見えない」

「じゃあ、普通のセキュリティソフト(Semgrep や CodeQL など)がバグを見つけてくれるのでは?」と期待しましたが、それは大失敗でした。

  • 結果: 6 つの有名ツールを全部合わせても、AI が作ったバグの 97.8% を見逃しました。
  • 理由: これらのツールは「パターン(型)」で探します。例えば「malloc という関数を使っているから危ないかも?」と探します。
    • しかし、今回のバグは「数学的な計算ミス」なので、「型」には見えないのです。
    • 例え話: 泥棒が「鍵を壊して入る」のではなく、「壁の構造を計算して、一番弱い場所を突き破って入る」場合、普通の防犯カメラ(パターン検知)は「壁が崩れた」としか捉えられず、「泥棒が入った」とは判断できません。
    • Z3(今回の研究ツール)だけが、その「壁の構造計算」を数学的に証明し、「ここが崩れる!」と突き止めることができました。

6. 最も皮肉な事実:「AI は自分のバグに気づける」

実験の最後で、AI に**「自分が書いたこのコード、バグがある?」**と聞いてみました。

  • 結果: AI は78.7% の確率で「バグがあります!」と正解しました。
  • 矛盾: なのに、コードを書くときは 55% の確率でバグを作ります。
  • 意味: AI は「バグが何であるか」を知っています。しかし、「書く瞬間」にその知識を適用する能力が欠落しています。
    • これは、**「料理のレシピ(知識)は完璧に知っているのに、実際に包丁を使う(生成する)ときは、なぜか指を切ってしまう」**ような状態です。

結論:私たちがどうすべきか

この研究は、私たちに以下の厳しい現実を突きつけています。

  1. AI が書いたコードは「未熟練の新人」が書いたものと同じ、あるいはそれ以上に危険だと考えてください。
  2. 「安全に書いて」と頼むだけでは解決しません。
  3. 既存のセキュリティツールは、AI の作る「計算ミス系バグ」には無力です。
  4. AI が生成した重要なコード(特にメモリ操作や計算系)を使う場合は、人間が厳しくチェックするか、数学的な証明(Z3 など)を行う必要があります。

**「AI は万能の魔法使いではなく、まだ修行中の見習い職人」であり、その作品をそのまま使うのは、「デフォルトで壊れている」**状態をそのまま受け入れることと同じだ、というのがこの論文のメッセージです。

自分の分野の論文に埋もれていませんか?

研究キーワードに一致する最新の論文のダイジェストを毎日受け取りましょう——技術要約付き、あなたの言語で。

Digest を試す →