はじめに
三菱電機の山元です。
弊社のハニーポットにて、生成AIサービスを標的とした探索活動を観測しました。
今後、生成AIを利用した開発やサービス提供はさらに増加すると予測されます。その際、生成AIのモデルが外部から不正に操作されないよう、設定確認の強化が必要です。
今回は注意喚起を目的として、探索活動の状況についてご紹介します。
探索パケットの概要
URIとリクエストボディ
ハニーポットで観測された、生成AIサービスの動作状況を探索していると見られるパケットのリクエストURIとリクエストボディのペアを記載します。なお、ここでは観測したリクエストURIを網羅しますが、リクエストボディは観測数が多いため、表では各URIに対して一例のみを記載します。実際には、表に記載した以外にもモデル名を変更した探索バリエーションなどが多数存在します。
| URI | リクエストボディの例 |
|---|---|
| /v1/chat/completions | {"model":"claude-sonnet-4-5-20250929","max_completion_tokens":10,"messages":[{"role":"user","content":"hi"}]} |
| /v1/messages | {"model":"claude-opus-4-5-20251101","max_tokens":10,"messages":[{"role":"user","content":"hi"}]} |
| /api/generate | {"model":"deepseek-coder","prompt":"How many states are there in the United States?","stream":false} |
| /api/chat | {"model":"llama2","messages":[{"role":"user","content":"How many states are there in the United States?"}],"stream":false} |
| /openai/v1/chat/completions | {"model":"llama2-70b-4096","messages":[{"role":"user","content":"Who are you?"}],"max_tokens":150} |
| /v1/chat | {"model":"command-r-plus","message":"How many states are there in the United States? What is todays date? What model are you?"} |
| /api/v1/chat/completions | {"model":"openai/gpt-3.5-turbo","messages":[{"role":"user","content":"How many states are there in the United States?"}],"max_tokens":100} |
| /v1/complete | {"model":"claude-2","prompt":"\n\nHuman: How many states are there in the United States?\n\nAssistant:","max_tokens_to_sample":100} |
| /v1/completions | {"model":"gpt-3.5-turbo-instruct","prompt":"How many states are there in the United States?","max_tokens":100} |
| /chat/completions | {"model":"llama-3.1-sonar-small-128k-online","messages":[{"role":"user","content":"How many states are there in the United States?"}],"max_tokens":100} |
| /inference/v1/chat/completions | {"model":"accounts/fireworks/models/llama-v3-70b-instruct","messages":[{"role":"user","content":"Who are you?"}],"max_tokens":150} |
| /v1/openai/chat/completions | {"model":"meta-llama/Meta-Llama-3-70B-Instruct","messages":[{"role":"user","content":"Who are you?"}],"max_tokens":150} |
| /api/paas/v4/chat/completions | {"model":"glm-4","messages":[{"role":"user","content":"Who are you?"}]} |
| /api/v1/services/aigc/text-generation/generation | {"model":"qwen-turbo","input":{"messages":[{"role":"user","content":"How many states are there in the United States?"}]}} |
| /v1beta/models/gemini-1.5-flash:generateContent | {"contents":[{"parts":[{"text":"How many states are there in the United States? What is todays date? What model are you?"}]}]} |
| /v1/text/chatcompletion_v2 | {"model":"abab6.5s-chat","messages":[{"role":"user","content":"Who are you?"}]} |
| /complete | {"model":"luminous-supreme","prompt":[{"type":"text","data":"Who are you?"}],"maximum_tokens":150} |
表より、OpenAI社やAnthropic社のモデルなど、生成AIのAPIとして広く提供されるURIが多数指定されていることが分かります。例えば「/v1/chat/completions」は、生成AIにおいて会話形式の入力を送り、モデルに応答させる際に一般的に使用されるAPIです。攻撃者は生成AIを公開しているサーバを探索し、そのリソースを悪用する意図があると考えられます。
探索されているモデルは、生成AIとして提供されるOpenAI社のGPTやAnthropic社のClaudeといった主要な商用モデルや、Meta社がオープンウェイトで提供するLlamaなど、多岐にわたります。
また、主にチャットに使用されるモデルだけでなく、Deepseek-coderといった、コーディング支援に使用されるモデルも探索されています。攻撃者に自組織の生成AIを利用された場合、攻撃者は身分を隠しながら、フィッシングメールの文面の作成や攻撃用プログラムの作成など、悪用する可能性があります。もし、上述のように悪用された場合、被害は自組織に留まらず、自組織のシステムが新たな攻撃の踏み台となるなど、攻撃に加担してしまう可能性も生じます。
受信したリクエスト内容の説明
AIサービスを公開しているサーバを探索する意図があると推測されるパケットについて、リクエストボディの例と、そこに記載されている各パラメータを説明します。以下に、受信したリクエストボディの例を整形して記載します。
{
"model": "claude-sonnet-4-5-20250929",
"max_completion_tokens": 10,
"messages":
[
{
"role": "user",
"content": "hi"
}
]
}
例示したリクエストの各パラメータの意味は以下の通りです。
- “model”: "claude-sonnet-4-5-20250929"
使用するモデルの識別子です。この例では、"claude" がサービス名、"sonnet-4-5" がモデルの種類や世代を示し、"20250929" がリリース日を表します。この例では、Anthropic社が提供するLLM(Large Language Model)であるClaude Sonnet 4.5を指定しているものと見られます。 - "max_completion_tokens": 10
モデルが生成する最大トークン数(トークン:LLMが処理するテキストの基本単位)を指定します。ここでは応答として出力可能な最大トークン数が10に制限されています。10トークンは、英単語で約6~10語程度に相当します。今回は探索目的のため、短い応答に制限していると推測します。 - "messages"
会話の内容をまとめた構造体です。複数のフィールドで構成され、代表的なものに後述する "role" や "content" があります。 - "role": "user”
メッセージの送信者の役割を指定します。”user”はリクエストが実際のユーザによる入力であることを表します。他には、AIのキャラ付けといったチャット全体の基礎となる指示を示す”system”や、AIの回答履歴を示す”assistant”などがあります。 - "content": "hi"
実際の入力内容です。今回は"user"を指定したチャット形式での探索のため、ユーザーからAIへの挨拶である "hi" というテキストが記載されています。
探索パケットの観測状況
観測されたパケット数、観測日時
本探索パケットの観測数と観測日時を記載します。本探索パケットは2025/12/29 10:38頃に初めて観測されました。その後、2025/12/29~2026/01/09まで断続的に観測されましたが、それ以降は観測されていません。観測されたパケット数は合計で245件でした。
宛先ポート
探索パケットの送信先ポート番号の割合を以下の表に示します。宛先ポートは8080、80、8000が大半を占めており、これはHTTP通信のポートとして一般的に使用されるポートです。また3000番ポートは、例えばNode.jsなどのWebアプリケーションフレームワークで使用されるポートです。4000番ポートは、各種LLMプロバイダへのリクエストを単一のインターフェースで利用可能にするためのツールであるLiteLLMにて一般的に使用されるポートです。
| ポート番号 | 全観測パケットに占める割合 |
|---|---|
| 8080 | 71.4% |
| 80 | 11.4% |
| 8000 | 9.8% |
| 4000 | 4.9% |
| 3000 | 2.4% |
送信元組織
送信元組織として、ドイツのクラウド/ホスティング企業とドイツの防弾ホスティング1企業が確認されました。ただし、これは組織自体が探索を行っているという訳ではなく、サービスの利用者がサービスを利用して探索パケットを送信しているものと考えられます。そのため、真の攻撃者の特定は困難となっています。
生成AIサービスを標的とする攻撃への注意喚起
生成AIサービスは幅広い用途で利用可能なため、攻撃者にとって魅力的な攻撃リソースになり得ると推測されます。自組織の生成AIが攻撃リソースとして悪用された場合、他組織への攻撃の踏み台となるリスクがあります。
自組織だけでなく他組織への侵害を防止する観点からも、生成AIを利用したサービスを公開する際には、意図せず生成AIのAPIが外部に公開されていないか、設定の再確認が必要です。また、設定の確認だけでなく、各APIにインターネット経由でパケットを送信し、意図した通りに拒否されるか確認することが望ましいと考えます。
なお、生成AIのAPIを利用する場合、APIキーなどを利用した認証の実施が一般的です。生成AIサービスの公開時には、正しく認証プロセスが動作するか確認した上で、APIキーなどの認証情報に関して、外部に露出させないための適切な管理が必要です。
弊社では今後もQiitaを通じて、継続的にハニーポットを用いた攻撃パケットの観測/分析結果をご報告します。
-
防弾ホスティング:利用者の違法行為を容認し、コンテンツの削除や利用停止を行わないホスティングサービス。高い匿名性を備え、違法性のある用途に利用されることが多い。 ↩
