AI
AIでコードの安全性を調べる方法 ― 公開モデルと解析基盤の選び方
2026/10/12
1. この記事の対象と前提
本稿は、自社のコード診断ツールや社内のレビュー工程にAIを組み込みたい開発者・アーキテクトを対象に、利用できる公開モデルと解析基盤を整理する。想定する検査対象はPHP・TypeScript・Go・Pythonといった業務アプリケーションの主要言語で、構造・依存関係・安全性をまとめて診断する構成を前提とする。
先に断っておくと、「コードを渡せば脆弱性を正確に指摘してくれるオープンモデル」は現時点で存在しない。公開されているのは、表現学習の基盤モデル、研究用の脆弱性判定モデル、汎用的なセキュリティLLMといった部品である。本稿では、それらをどう組み合わせるかに焦点を当てる。
2. モデルを3つの役割に分けて考える
「コード安全性のAI」と一括りにすると選定を誤りやすい。公開モデルは、役割によって次の3つに分けると整理しやすい。
| 役割 | 何をするか | 代表例 |
|---|---|---|
| コード表現学習モデル | コードの特徴をベクトル化し、類似検索や分類器の土台になる | CodeBERT、GraphCodeBERT |
| 脆弱性判定モデル | 関数や行単位で「脆弱かどうか」を判定する | LineVul、VulBERTa |
| レビューLLM | 診断候補を検討し、説明や修正案を文章で生成する | Foundation-Sec-8B |
前の2つは自分で追加学習して使う「素材」に近く、最後のLLMはそのまま推論に使える「道具」に近い。どの役割を自社のツールに担わせたいかで、調べるべきモデルが変わる。
3. 公開モデルの比較
| モデル | 公開内容 | 対象言語 | 診断ツールでの使い道 |
|---|---|---|---|
| CodeBERT | 学習済み重み・実験コード | Python、Java、JavaScript、PHP、Ruby、Go | 類似コード検索、分類器の基盤 |
| GraphCodeBERT | 学習済み重み・実験コード(データフロー考慮) | 同上 | 構造を踏まえた類似検索、独自分類器の研究 |
| LineVul | 脆弱性判定の学習済みモデル・再現コード | 主にC/C++ | 危険な関数・行の候補提示の参考 |
| VulBERTa | 事前学習・追加学習・評価コード | C/C++ | 脆弱性分類器を自前で育てる参考 |
| Foundation-Sec-8B(Instruct/Reasoning) | セキュリティ特化LLMの公開重み | 汎用 | 診断候補の検討、説明、修正案の生成 |
3-1. CodeBERT/GraphCodeBERT — 構造を理解する土台
Microsoftが公開しているコード表現学習モデル。事前学習の対象にはPython・Java・JavaScript・PHP・Ruby・Goが含まれ、業務アプリの主要言語とかなり重なる。ただしTypeScript専用には学習されていない点は押さえておきたい。
GraphCodeBERTは名前の通りデータフローを考慮するが、ソースコードを渡すだけでプロジェクト全体の依存グラフや危険な経路を自動生成してくれるわけではない。公式実装でも、データフローは別途コードから抽出し、モデルの入力を組み立てている。また、そのままでは脆弱性判定器にならず、用途に応じた追加学習が必要になる。
3-2. LineVul/VulBERTa — 脆弱性検出の研究実装
どちらも脆弱性検出の研究に近いモデルだ。LineVulは学習済みモデルのダウンロード手順まで公開しており、行単位で危険箇所を絞り込む方式を試せる。VulBERTaはC/C++を対象に、事前学習から脆弱性分類までの実装を公開している。
ただし、学習対象がC/C++中心であるため、PHP・TypeScript・Goの検査にそのまま流用するのは避けたい。製品への即時採用より、設計と評価手法を学ぶ教材として位置づけるのが妥当だ。
3-3. Foundation-Sec — ローカルで動くセキュリティLLM
Ciscoが公開している、セキュリティ分野に特化した8B規模のLLM。Instruct版に加え、推論に特化したReasoning版もある。8Bクラスなのでローカル運用が現実的で、ソースコードを外部APIに送りにくい案件では有力な候補になる。
一方、セキュリティ全般を対象としたモデルであり、特定言語のコードでどこまで正確に検出できるかは自分で評価する必要がある。
4. モデルより重要な「解析基盤」
グラフでコードを理解する方向を突き詰めるなら、モデル選びと同じくらい解析基盤の選定が効いてくる。
4-1. Joern — コードをグラフとして問い合わせる
Joernは機械学習モデルではなく、コードを**Code Property Graph(CPG)**に変換して調べる解析基盤だ。構文木・制御フロー・データフローを1つのグラフに統合し、「外部入力がSQL実行まで届く経路」のような危険な流れをクエリで探せる。GraphCodeBERTが入力として必要とするデータフローを、プロジェクト規模で用意する役割も担える。
4-2. Devign — グラフをニューラルネットに入れる研究
Devignは、コードの意味を表すグラフをグラフニューラルネットワークに入力し、脆弱性を分類する方式を示した研究だ。完成した多言語スキャナーではないが、グラフを機械学習に接続する設計の参考になる。
4-3. Cisco AI Deep SAST — 「静的解析+AI」の公開実装
最も直接的な参考になるのがAI Deep SASTだ。Semgrepによるルール検査、Tree-sitterによるコード索引、ローカルのFoundation-Secまたは外部LLMによる分析を組み合わせている。本稿で提案する構成をほぼそのまま体現した公開実装といえる。
5. 推奨する診断パイプライン
中心に置くのはAIではなく、根拠を集める解析だ。 LLMは解析とルールが拾った候補を検討・説明する後段に置き、最後に再解析で修正の効果を確かめる。
LLMはルールの候補を検討するだけでなく、設計上の問題を追加で提案する役割も担える。ただし、ルールによる指摘とLLMによる推測は根拠の性質が違うため、画面上でも区別して表示すると利用者の信頼を得やすい。
6. 評価と導入の注意点
研究のスコアだけで製品採用を判断しないこと。 PrimeVulの研究では、従来のデータセットで高い成績を出していたモデルが、より現実的な評価条件では性能を大きく落とすことが示された。採用前に、自社の対象言語・実際のコードベースで小さな評価セットを作り、検出率と誤検知率を確かめたい。
ライセンスにも注意が必要だ。「公開重み」は無条件に再配布・商用利用できることと同義ではない。 製品に組み込む前に、モデルごとのライセンス条項を必ず確認する。
7. まとめ:何から調べるべきか
- 設計の全体像をつかむなら: JoernとAI Deep SASTの構成を最初に読む
- ローカルでLLMレビューを試すなら: Foundation-Secを自社コードで評価する
- 独自の分類器を育てる段階なら: GraphCodeBERTを土台に追加学習する
- 脆弱性検出の評価手法を学ぶなら: LineVul・VulBERTa・PrimeVulの論文と実装
最初から独自モデルを学習するより、解析基盤と評価用コードを先に充実させる方が成果は出やすい。そして長期的に最も価値を持つのは、利用者が実際に採用した改善と、却下した誤検知の記録だ。このフィードバックの蓄積こそが、将来の独自モデルを育てる最良の学習データになる。