LLMでセキュリティ診断の精度を上げたい
誤検知の山を仕分ける診断から、確かな指摘だけが届く診断へ。
役割の異なるLLM呼び出しを多段に組み合わせた自作の脆弱性レビュー(secu-review)を、公開ベンチマークの OWASP Benchmark v1.2 で採点したところ、Youden スコア +0.930 を記録しました。商用SASTの平均(約0.33)を大きく上回る結果です。
お客さまの課題
- Case 01
商用SASTは誤検知が多く、アラートの仕分けに人手を取られる
大量の指摘の多くが誤検知。人が一件ずつ真偽を確かめることになり、診断より仕分けに時間がかかる。
- Case 02
生成AIに一発で投げると、見逃しや根拠のない指摘が混じる
「脆弱性を探して」と一度に頼むだけでは、取りこぼしと根拠のない指摘(幻覚)が避けられない。
- Case 03
ソースコードを外部サービスに丸ごと預けるのは避けたい
セキュリティ診断ほど、対象のコードや設定を社外に出すリスクを許容しづらい。
- Case 04
診断の質がレビュアー個人の練度に依存してしまう
観点が人によって揺れ、レビューの網羅性と再現性が担保されない。
ソリューション
網羅的に検知する → 一件ずつ検証する → CWEで確定する。
候補を漏れなく挙げる「検知」の段と、各候補が実際に悪用可能かを精査する「検証」の段を、役割の異なるLLM呼び出しとして直列に組みます。最後にCWEの等価集合と照合して確信度で振り分け、確実なものだけを「確定(CONFIRMED)」として提示します。判断の割れた灰色域は「要確認(NEEDS-REVIEW)」として残し、人のレビューに委ねます。
Step 01① コードを読み、脆弱性を検知して一覧化
リポジトリを解析し、SQLインジェクションやコマンドインジェクション、パストラバーサルなどを検知します。指摘にはCWEと深刻度、判定(確定/要確認/除外)を付けて並べるので、確実なものから対応できます。該当行と修正提案もセットで提示します。
Step 02② 2段階のLLMレビューで誤検知を落とす
1つのモデルに一度で判定させず、候補を検知する段と妥当性を検証する段に分けます。1次スキャンで候補を網羅的に検知し、2次チェックで緩和策やサニタイズの有無、攻撃経路の到達可能性を検証して誤検知を棄却します。「確定(CONFIRMED)」のみを採用する運用では、検出率 95.8% を維持したまま誤検知率を 2.7% に低減できます。
Step 03③ OWASP Benchmark でカテゴリ別に実証
精度は公開ベンチマークで裏付けています。OWASP Benchmark v1.2(2,740件)で採点すると、SQLiやXSS、パストラバーサルなど多くのカテゴリで Youden +0.99〜+1.00。加重平均の +0.930 は、商用SASTの平均(約0.33)を大きく上回ります。
主な構成要素
- 01オンプレ/閉域で動くLLM推論基盤(機密コードを外部に出さない)
- 021次スキャン(疑わしい箇所を漏れなく候補として検知)
- 032次チェック(各候補について、対策の有無と攻撃の到達可能性を検証)
- 04CWE(脆弱性の分類基準)との照合・確信度スコアリング
- 05診断結果を「確定(CONFIRMED)」「要確認(NEEDS-REVIEW)」「除外」の3段階に仕分け
- 06OWASP Benchmark 採点・スコアカード生成
Claude Code 組み込み診断との比較
Anthropic のAIコーディングエージェント Claude Code には、/security-review というセキュリティ診断機能が標準で搭載されています。当社はこれとは別に、脆弱性候補を網羅的に検知する1次スキャンと、各候補の妥当性を個別に検証する2次チェックを分離した、多段構成の診断スキル secu-review を自社開発しました。
両者の精度を比較するため、セキュリティ診断ツールの標準的な評価に用いられる OWASP Benchmark v1.2 を使用しました。脆弱性を含むコードと安全なコード、計2,740件のテストケースを双方の診断環境で同一条件のもと診断し、脆弱性をどれだけ漏れなく検知できたか(検出率)と、安全なコードをどれだけ誤って指摘したか(誤検知率)を採点しています。
結果、組み込みの /security-review 単体でも Youden +0.884 と、商用SASTツールの平均(約0.33)を大きく上回りました。自社開発の secu-review は、「確定(CONFIRMED)」判定のみを採用する運用で誤検知率を 8.3% から 2.7% に低減し、Youden +0.930 を記録しています。検知と検証を分離した多段構成の効果が、数値の差として表れています。
総括(方式別の実測値)
| 方式 | 検出率(TPR) | 誤検知率(FPR) | Youden |
|---|---|---|---|
| /security-review(Claude Code 組み込み・Opus) | 96.7% | 8.3% | +0.884 |
| secu-review skill(確定+要確認) | 98.0% | 9.5% | +0.885 |
| secu-review skill(確定のみ) | 95.8% | 2.7% | +0.930 |
| (参考)商用SASTツールの平均 | — | — | 約+0.33 |
カテゴリ別 Youden スコア
| カテゴリ | 組み込み /security-review | secu-review(確定+要確認) | secu-review(確定のみ) |
|---|---|---|---|
| cmdi(コマンドインジェクション) | +0.92 | +0.95 | +0.93 |
| crypto(弱い暗号アルゴリズム) | +0.76 | +0.75 | +0.77 |
| hash(弱いハッシュ) | +0.55 | +0.32 | +0.63 |
| ldapi(LDAPインジェクション) | +0.88 | +0.94 | +0.97 |
| pathtraver(パストラバーサル) | +0.96 | +0.99 | +0.99 |
| securecookie(Cookie属性の不備) | +0.97 | +1.00 | +1.00 |
| sqli(SQLインジェクション) | +0.89 | +0.96 | +0.99 |
| trustbound(トラストバウンダリ違反) | +0.91 | +1.00 | +1.00 |
| weakrand(弱い乱数) | +1.00 | +0.89 | +0.96 |
| xpathi(XPathインジェクション) | +1.00 | +1.00 | +1.00 |
| xss(クロスサイトスクリプティング) | +0.89 | +0.98 | +1.00 |
| 加重平均 | +0.884 | +0.885 | +0.930 |
- Youden スコアは検出率(TPR)から誤検知率(FPR)を引いた指標。+1.00 が満点で、高いほど「漏らさず、誤検知しない」診断を意味する。
- secu-review(確定+要確認)の集計では、CWE の分類が一致しないノイズ検出 327 件を採点対象外としている。



