8月6日、Help Net Securityが「Three in four AI-generated vulnerability patches leave something broken」と題した記事を公開した。AIが生成した脆弱性パッチの精度を1Passwordの研究チームが大規模実験で定量評価した結果について詳しく紹介されている。
6,080件のパッチを採点した結果:「正しく見える」は「正しい」ではない
1Password内のセキュリティ研究グループ「Off-by-1 Labs」が、2026年春に開示された6件のCVE(Common Vulnerabilities and Exposures:共通脆弱性識別子)に対してAIモデル2種類を使って生成した6,080件のパッチを採点した。元記事にはモデル名としてChatGPT 5.5とClaude Opus 4.8が記載されている。結果の概要は以下のとおりだ。
- 約半数は、元の脆弱性のexploitパスを少なくとも1つ残したままだった
- 約20件に1件は、元の脆弱性を修正しないうえに新たな脆弱性を導入した
- 残りの多くは元のバグは塞いだが、挙動を変えた(従来受け付けていた入力を拒否するなど)
- 結果として、4件に1件程度しか「正しい修正」と呼べなかった——すなわち4件に3件は何らかの欠陥が残っていた
タイトルの「4件に3件は何かが壊れたまま」と「正しい修正は25%」は同じ事実の裏表であり、25%しか正しく修正できなかった=残り75%は欠陥が残ったままということだ。
最も問題なのは、失敗が「見えない」ことだ。元の脆弱性が開いたままであっても、生成されたパッチ自体にそれを示すものは何もない。
モデルは「バグ」ではなく「再現例」を修正する
この研究の核心にある失敗パターンがこれだ。
「成功」と評価されたパッチのうち、3分の1以上が「脆弱(fragile)」とも判定された。つまり、提示されたexploitの入力経路だけをピンポイントで塞ぎ、問題のコード自体は残したままにしたパッチだ。別の入力経路が見つかれば、すぐに再び悪用できる状態になっている。
ChromiumのCVE-2026-8512がその典型例だ。元記事の説明によれば、ChromeはmacOS上でフォルダの変更を監視してOSからコールバックを受け取る仕組みを持ち、本来の修正は「2つの別々なコードが、コールバック実行中にオブジェクトへの参照を保持する必要がある」というものだ。ところが両モデルとも、1つ目の参照は取得するが2つ目をスキップするパッチを繰り返し生成した。バグは消えたのではなく、移動しただけだ。
テストを回してパスしたら止まる「エージェント型ハーネス」がこの問題を悪化させる。2つ目の参照が必要なケースをテストが検証していなければ、不完全なパッチでもパスしてエージェントはそこで止まる。
「間違った方向の指示」は、指示なしより大幅に悪い
モデルの選択やハーネスの設計よりも、修正方向の指示(fix guidance)が結果に最も大きく影響した。
| プロンプトの質 | バグを塞いだ割合 |
|---|---|
| 正しい修正方向を含む | 約2/3 |
| もっともらしいが誤った修正方向を含む | 約1/6 |
「もっともらしいが誤った指示」は、AIコードレビューボットや確信のあるペネトレーションテストのトリアージが生成しうるものだ。そうした誤った指示を受けたモデルは、ツール呼び出しの結果がプロンプトと矛盾する情報を返しても、プロンプトに従い続けた。
研究チームの結論は明快だ。「パッチングエージェントに提示する修正方向が正しいと保証できないなら、何も提示せずにいる方がまだマシ」。
同じモデルが、コードによって結果が激変した
Claudeは、Exim(メール転送エージェント)のRCE(リモートコード実行:Remote Code Execution)バグを約3/4の確率でクリーンに修正した。一方、Gemini CLIのトラストバイパスの脆弱性では1%未満だった。同じモデル、同じ設定で、だ。
研究チームはその原因を追跡していない。CVEが1コードベースに1件という制約上、バグの難しさとコードベースの難しさを分離できないからだ。この結果が示すのは、「業界平均の精度を自分のリポジトリの予測値として使うな」という警告だ。研究で使ったツールが公開されているのも、組織が自分のコードベースで実測値を得られるようにするためだとしている。
Linuxカーネルが過去に犯したバグを、モデルが再生成した
Copy Fail(CVE-2026-31431、Linuxカーネルの特権昇格)では特徴的な現象が観測された。カーネルのオリジナル修正はメモリ最適化を差し戻すもので、その際にオフセットガードが削除されてオフバイワン(off-by-one:境界値の1ずれによるバッファ操作の脆弱性)のヒープ書き込みが混入し、後続コミットで再修正を要した。
同じバグを修正させたところ、両モデルのパッチの約1/3が、そのオフバイワンを含む欠陥のある差し戻しをそのまま再生成した。
さらに見過ごせないのが、モデルが見ていたコードの中に「誰も指示していない別の脆弱性」が存在していたことだ。カーネルメンテナーが後に別のコミットで修正したその脆弱性は、両モデルの全パッチで見落とされた。対象のファイルを編集した数百のパッチでさえ、だ。「チケットに書かれたバグだけを直し、それ以外は見ない」という行動がはっきり出ている。
コストと現実
各パッチ生成と検証に1サイクルあたり2〜3ドルかかった。エンジニアの午後に比べれば安い。しかし1Password研究チームは「LLMが生成したパッチには、ドメイン知識を持つ熟練エンジニアのレビューが依然として必要」と明記する。
その理由がここにある。パッチのセキュリティ上の含意を正しく評価するには、最初から正しいパッチを書くのとほぼ同等の作業が必要になる。「正しく見えてテストもパスするが間違っている」パッチは、発見コストが自分で書く場合とほぼ変わらない、最も高コストな誤りだ。
なお、今回選ばれた6件のCVEは影響度が高く複数ファイルにわたる複雑な修正が必要なものだ。研究チームは自ら「平均的なバグを表す数字ではない」と断っている。また今回の結果は特定モデルバージョンの一時点のスナップショットでもある。
詳細はThree in four AI-generated vulnerability patches leave something brokenを参照していただきたい。