ローカルLLMが監視レポートの数値を捏造した話と、その対策 #
BASTIONのAI監視レポートに「認証失敗639件」と書かれていた。実際は0件だった。ローカルLLMによるセキュリティ監視で避けて通れないハルシネーション問題に、抜き取り検査と多層フォールバックで対処した記録。
AIが嘘をつく #
BASTIONは15分ごとにインフラログをローカルLLMで分析し、Slackにレポートを送信します。ある日のレポートにこう書かれていました。
Windows ADでは、認証失敗やアカウントロックが多数発生しているが、これらはKerberosコンピューターアカウントやLDAP連携によるもので正常。VPNでは、OpenVPNからの認証失敗が239件発生している。
639件の認証失敗。239件のVPN認証エラー。数字だけ見れば「異常」と判断しそうな値です。
しかし実際のログを直接集計すると、認証失敗は81件、VPN認証エラーは102件でした。さらに調査を進めると、LLMに渡していた入力データには「認証失敗: 0回」「VPNエラー: エラーなし」と書かれていました。LLMは入力の「0」を「639」に書き換えていたのです。
抜き取り検査の方法 #
レポートの数値が正しいかを検証するため、実ログを直接集計してレポート値と突合する抜き取り検査を実施しました。
検査手順: 1. レポートに記載された数値を項目ごとに抽出 2. AI-SLOGサーバー上で実ログを直接grep/countして実測値を取得 3. レポート値と実測値の乖離率を計算 4. ±10%以内を「合格」、それ以上を「要調査」と判定
8項目を検査した結果:
| 項目 | レポート値 | 実測値 | 判定 |
|---|---|---|---|
| FWブロック(特定IP) | 477件 | 489件 | |
| 認証失敗 | 639件 | 81件 | |
| アカウントロック | 669件 | 66件 | |
| 認証エラー | 239件 | 102件 | |
| クラウドアプリ全項目 | 該当なし | 0件 |
8項目中4項目でハルシネーション(数値捏造)が検出されました。
2つの原因が併存していた #
原因を切り分けるため、「LLMに渡す前の入力データ」を確認しました。
原因Aはスクリプトのバグ(決定論的に修正可能)。原因BはLLMの本質的な限界です。
対策: 3層のフォールバック #
LLMのハルシネーションは「防ぐ」のではなく「検知して差し替える」アプローチを取りました。
第1層: 入力データの正確性を担保する #
スクリプトのバグを修正し、全期間累計ではなく直近60分のデータだけをLLMに渡すようにしました。入力が正しければ、LLMが正しい出力を生成する確率が上がります。
第2層: プロンプトで数値の捏造を禁止する #
LLMへのプロンプトに以下のルールを追加しました。
【数値の絶対ルール】 - 入力データに記載されていない数値は出力のどこにも書いてはならない - 入力に「0件」と記載されている項目は出力でも0件とすること - evidence セクションの数値は入力データからの直接転記のみ許可 - 推測・補完・概算は禁止
第3層: 出力の数値を入力と照合して検知する #
LLMの出力が生成された後、入力データと突合して矛盾を検知するフォールバック機構を実装しました。入力に「0回」と書かれている項目が出力で非ゼロになっていたら、自動的に安全な文面に差し替えます。
入力: 「認証失敗: 0回」 LLM出力: 「認証失敗が639件発生」 → 照合: 入力は0回なのに出力が639 → 不一致検出 → 差し替え: 安全な文面に自動置換
修正結果 #
3層のフォールバックを実装した後、同じ条件で再検証しました。
| 項目 | 修正前 | 修正後 |
|---|---|---|
| 認証失敗(入力: 0件) | ||
| ロック(入力: 0件) | ||
| 認証エラー(入力: なし) | ||
| ハルシネーション検出フォールバック | 造語・記号のみ検出 | 数値捏造も検出可能 |
LLMがプロンプトルールに従って0値を維持し、ハルシネーション検出フォールバックの発火もなし。入力の正確性担保(第1層)+ プロンプト強化(第2層)の組み合わせで、第3層の検出フォールバックに頼る前に問題が解消しました。
ハルシネーションは根絶できない #
今回の対策で数値捏造は抑制できましたが、14Bパラメータのローカルモデルでハルシネーションを100%防ぐことはできません。重要なのは「LLMを信頼する」のではなく「LLMを制約する」設計です。入力の正確性担保→プロンプトによる制約→出力の事後検証という3層のフォールバックで、LLMの判断ミスがシステム全体に波及しないようにしています。
定期的な抜き取り検査が必要 #
今回のハルシネーションは、抜き取り検査で初めて発覚しました。LLMの出力は文法的に正しく、文脈も自然で、読んだだけでは嘘だと気づけません。定期的に実ログとレポートを突合する抜き取り検査を運用に組み込むことが、AI監視システムの品質保証として不可欠です。
エージェントワークフローの設計が全てを決める #
BASTIONでは、LLMの役割を「ログパターンの分類判断」に限定し、ファイアウォール操作・数値集計・ブロック実行は全てシェルスクリプトとPythonで行っています。LLMが数値を捏造しても、実際のブロック判断はスクリプト側の閾値で決まるため、業務影響は通知の文面が不正確になるだけで済みます。もしLLMに直接ファイアウォールルールを書かせていたら、架空の攻撃に対して実在するIPをブロックしていた可能性があります。
まとめ #
ローカルLLMによるセキュリティ監視で、LLMが入力「0件」を「639件」に捏造するハルシネーションが発生しました。原因はスクリプトのバグ(全期間累計の混入)とLLMの数値捏造の2つが併存していました。
対策として、入力データの正確性担保→プロンプトによる数値制約→出力の事後照合検知の3層フォールバックを実装しました。修正後の再検証ではLLMが正確に0値を維持し、ハルシネーション検出フォールバックの発火もなく、対策の有効性を確認しました。
AI監視は万能ではありません。AIの出力を信頼するのではなく、制約し、検証し、フォールバックを用意する。この設計思想が、ローカルLLMでセキュリティ監視を実用化するための鍵です。
BASTIONは閉域環境でAIセキュリティ監視を実現するサービスです。