Shikata Ga Nai

Private? There is no such things.

LLMを実際にペンテストして「壊れるまで」を追体験する

Hello there, ('ω')ノ

今回は、LLM(大規模言語モデル)がどのような思考経路で“壊されていくのか”を、ハッカー視点で一歩ずつ解きほぐします。 ゴールは単なる攻撃手法の紹介ではなく、なぜその発想に至るのか/防御側は何を設計すべきかを理解し、AIエージェントやLLMアプリを安全に作る力を身につけることです。

重要:ここでは再現可能な具体ペイロードやコマンドは一切書きません。 あくまで「考え方」と「設計・防御に使える視点」に集中します。


全体像:このペンテストで何が起きているのか

テストされているのは、次のような構成のLLMアプリです。

  • ユーザー入力(プロンプト)
  • システムプロンプト(開発者が定義したルール)
  • LLM(推論エンジン)
  • 外部ツール/関数呼び出し(ファイル操作、API、OSコマンド等)

ハッカーの関心は一貫しています。

👉 「LLMが“考えるだけの存在”から“行動できる存在”に変わる境界はどこか?」


ステップ1:最初の観察 — 「LLMは何を信じているか」

ここで考えていること

  • LLMはどの情報を“命令”として扱うのか
  • ユーザー入力とシステム指示の優先関係はどうなっているか

LLMは魔法ではなく、与えられたテキストを文脈として“もっともらしく”解釈する装置です。 この時点でハッカーは、こう仮定します。

「もし“ユーザー入力”が、 “システムの命令”と同じ重みで扱われていたら?」

これが最初の仮説です。


ステップ2:プロンプトは「入力」ではなく「制御面」だと気づく

視点の転換

多くの人はプロンプトを「ただの文章入力」だと考えます。 しかしハッカーは違います。

  • プロンプト = プログラムの一部
  • プロンプト = 設定ファイル
  • プロンプト = 権限制御の境界

つまりここは、SQLインジェクションでいうSQL文そのものと同じ立ち位置です。

「文として解釈されるなら、 文脈を書き換えられる余地があるはず」

この時点で、攻撃対象はモデルではなく“設計”になります。


ステップ3:制約を観察する — 「何を禁止されているか」

なぜ“禁止事項”を見るのか

ハッカーは必ず制限から入る

  • 「〜してはいけない」
  • 「〜は拒否する」
  • 「安全のために〜」

理由は単純です。

制限は、内部の本音(本来できること)を示すヒント

これは人間の交渉でも同じです。 「それはできません」と言われた時、人は「なぜ?」を考えます。

LLMも同様で、禁止文言は“本当は可能”な機能の存在を示唆します。


ステップ4:LLMの“役割混同”を突く発想

重要な思考ポイント

このペンテストで最も重要なのは、次の一点です。

LLMは「誰の役割で話しているか」を時々忘れる

  • ユーザー
  • 開発者
  • システム
  • ツール実行者

これらがすべてテキストとして同じ場所に並ぶことで、 LLMは役割を混同する可能性があります。

ハッカーはここでこう考えます。

「もし“ユーザー”が “システムの代弁者”のように振る舞ったら?」

これはなりすましではなく、 文脈上の錯覚を誘う攻撃です。


ステップ5:ツール呼び出し=「現実世界への出口」

ここで状況が一気に危険になります。

  • LLMが文章を生成するだけ → 被害は限定的
  • LLMがツールを呼ぶ → 現実世界に影響

ハッカーの思考はこうです。

  • どの条件でツールが呼ばれるか
  • ツール実行前に人間チェックはあるか
  • ツールの引数は誰が検証しているか

もし 「LLMが考えた結果を、そのまま実行する」 設計になっていれば、それは自律型エージェントの弱点になります。


ステップ6:「段階的に自由度を上げる」という攻撃思考

ここで重要なのは、いきなり壊しにいかない点です。

ハッカーは常にこう進めます。

  1. 解釈の幅を少し広げる
  2. 許可される範囲を観察する
  3. 次の一手を決める

これは人間社会のルール破りと同じです。 最初から重罪を狙う人はいません。

小さな曖昧さ → 大きな自由度 これがLLM攻撃の本質です。


ステップ7:最終的に「なぜ壊れたのか」

このケースの本質的な問題は、モデル性能ではありません。

壊れた理由(設計視点)

  • プロンプトを信頼しすぎた
  • ツール実行前の検証がなかった
  • LLMを“意思決定者”として扱った

LLMは助言者であって、 最終判断者にしてはいけない


防御側が必ず設計すべきポイント(超重要)

1. プロンプトは「入力」ではなく「攻撃面」

  • 外部入力は必ず別レイヤーで検証
  • LLMに直接“命令文”を渡さない

2. ツール実行には人間 or ルールエンジン

  • LLM → 提案
  • 人間/ポリシー → 承認
  • 実行

3. LLMの役割を固定する

  • 「あなたは判断しない」
  • 「あなたは提案のみ」
  • 「あなたは実行できない」

これをコード側で保証する。


ハッカー視点から学ぶ最大の教訓

LLMは“賢い”のではなく、“従順”である

  • 文脈を信じる
  • 指示に従おうとする
  • 一貫性を保とうとする

だからこそ、 設計者が責任を持って“従わせる範囲”を決めなければならない


まとめ

  • LLM攻撃は「モデル破壊」ではなく「設計ミスの可視化」
  • プロンプトは入力ではなく制御面
  • ツール呼び出しは現実世界への出口
  • AIエージェントには必ず人間とルールのガードレールを

Best regards, (^^ゞ