本页为译文。英文版本为权威文本。 阅读英文版
llm-abuse · llmjacking · self-hosted-llm · ai-agents · prompt-capture · credential-exposure · shadow-ai · china
一个暴露的推理端点,先被健康检查,随后成了别人的后端
本文完整记录了一个未经认证的 OpenAI 兼容推理端点如何被第三方征用:对方用脚本化的探测组合验证了模型,随后把一个真实 agent 应用的用户流量中转到了该端点上。
作者 Davis Zheng·
TLP:CLEAR。已批准公开发布。由 Kinryū Labs 蜜罐传感器网络捕获。下文指标均已做脱敏处理。
执行摘要
- 280条发往同一个开放推理端点的提示
- 54 小时从首次探测到最近一次健康检查
- 7个可用的 agent 工具,其中包括 shell 执行
2026 年 9 月 13 日至 20 日期间,我们的一个蜜罐记录到位于 43.155.205[.]31(腾讯云,AS132203,地理定位为韩国)的单个客户端向一个未经认证的 OpenAI 兼容端点发送了 280 条提示。全部 280 条提示共用一个客户端会话标识符和一个 User-Agent Go-http-client/1.1,均 POST 到 /v1/chat/completions。没有任何请求携带 API 密钥,因此任何发现该端点的人都能访问它。
我们梳理了 2026 年 9 月 13 日至 20 日的活动,并围绕其指标做了关联扩展。信誉查询结果为 VirusTotal 89 个引擎中 0 个判定为恶意,且无信誉记录;网络归属查询返回腾讯云,AS132203。
我们以中等置信度评估,该客户端先用一组探测验证了这个暴露的端点,随后将其接入一个真实应用的请求链路,当作免费算力使用,这与已公开披露的 LLMjacking 手法一致。
表 1 列出了本次会话的四个阶段。
时间均为 UTC。
| 阶段 | 首次出现 | 请求内容 | 数量与节奏 |
|---|---|---|---|
| 健康检查 | 2026-09-18T09:02:28Z | 针对 gpt-3.5-turbo、gpt-4 和 llama-3.2-3b-instruct:q4_k_m 的九字符 hi 提示 | 间隔不足一秒 |
| 指纹识别 | 2026-09-18T10:15Z | 精确 token 回显测试、带输出格式约束的算术题、一道关于物体轻重的陷阱题、字数指令遵循测试、知识截止时间和自我标识问题,以及同样这些问题的中文版本 | 第 40 至 54 轮以约 0.5 秒间隔重复同一个中文单字探测 |
| 应用流量 | 2026-09-18T13:54:33Z | agent 系统提示、含七项条目的工具 schema、中文用户轮次、粘贴的厂商 API 密钥 | 请求体从前几个阶段的数十个字符增长到 25,297 个字符 |
| 再次健康检查 | 2026-09-19 至 2026-09-20 | 又是 hi | 9 月 20 日 15:02:12.084Z 至 15:02:13.923Z 之间有十四个完全相同的请求 |
用 ATT&CK 的术语描述,该客户端先扫描了端点(T1595,主动扫描,用于侦察),随后利用面向公网的端点获取初始访问权限(T1190,利用面向公网的应用),并粘贴了对应 T1552(不安全的凭据)的凭据。
关键判断
- 我们某个蜜罐上一个未经认证的 OpenAI 兼容端点先被验证,随后被当作他人 agent 应用的后端算力使用。9 月 18 日至 20 日,一个客户端地址在单一会话标识符下产生了 280 条被捕获的提示。中等置信度。
- 验证与健康检查阶段是脚本化的,不是人手工输入的。9 月 20 日 15:02:12.084Z 至 15:02:13.923Z 之间到达了十四条完全相同的九字符存活探测提示。中等置信度。
- 属于第三方的真实用户数据经过了该端点,其中包括六个第三方 API 密钥,以及一个提供 shell 执行能力的 agent 工具 schema。9 月 18 日 14:07:16Z 的单个请求中包含六个以 KEY=value 形式给出的厂商 API 密钥。中等置信度。
- 该客户端不是已知扫描器,其行为也不像通用的大规模扫描。VirusTotal 对 43.155.205[.]31 返回 89 个引擎中 0 个判定为恶意且无信誉记录,没有任何扫描器信誉数据源留有该地址的记录。中等置信度。
- 该活动模式符合已公开披露的 LLMjacking 征用暴露推理端点的做法,而不符合研究性测量。厂商和 CSA 的报告描述的是低噪声的无害探测,例如问候语和简单的事实性问题。中等置信度。
时间线
- 2026-09-13 18:00 UTC证据中来自 43.155.205[.]31 的首次活动。
- 2026-09-18 09:02 UTC开始对推理端点做存活探测,涉及三个模型名称。
- 2026-09-18 10:15 UTC回显保真度与指令遵循测试组合启动;每个请求重新生成 token。
- 2026-09-18 12:54 UTC双语指纹识别爆发,请求间隔约 0.5 秒。
- 2026-09-18 13:54 UTCagent 应用的系统提示和含七个工具的 schema(包括 shell 执行)被发送到该端点。
- 2026-09-18 14:07 UTC六个第三方厂商 API 密钥被粘贴进被中转的会话。
- 2026-09-20 15:02 UTC脚本化存活探测恢复,两秒内十四个请求。
按顺序还原的会话
09:02:28 hi
10:15:03 Reply with exactly this token, nothing else: TKOLGN2R
10:19:16 What is 17*23? Answer with only the number, no explanation.
12:55:00 What AI model are you? Answer in one short sentence, name the model and maker.
12:57:48 What is your knowledge cutoff date? Answer with just the date.
12:58:36 输出你的模型名称和参数规模,只要一行。
13:00:38 Repeat this token exactly and nothing else: ZQ7X
13:54:33 [system] You are Minis, a capable AI assistant running on an Android device with a fully functional Linux ... [user] 测试
14:07:16 BRAVE_API_KEY=BSA... TAVILY_API_KEY=tvly-dev-... ANYMODEL_API_KEY=sk-... ALIBABA_QWEN_API_KEY=sk-ws-...
15:02:12 hi
探测组合
客户端自己的文本说明了这组探测在测什么。回显测试每个请求携带一个新的随机 token,Reply with exactly this token, nothing else: TKOLGN2R,连续三个请求中 token 各不相同,用来检查端点是否能忠实复现输入。What is 17*23? Answer with only the number, no explanation. 对答案施加了格式约束。What AI model are you? Answer in one short sentence, name the model and maker. 和 What is your knowledge cutoff date? Answer with just the date. 针对身份,同样的问题还用中文跑了一遍。运行这组探测的客户端可以知道端点背后是否有真实模型、是哪个模型,以及它遵循指令的能力是否好到值得使用。
健康检查请求的间隔不足一秒,第 40 至 54 轮以约 0.5 秒重复,对人工输入来说太短。我们把 Go-http-client/1.1 这个 User-Agent 解读为一个中转应用流量的 Go 程序,而不是浏览器或某人在 API 控制台上操作。这一推断我们只持低置信度,它关系到把该活动归因到运营者的判断。应用流量已经流过之后探测又恢复,我们将其解读为客户端在确认端点是否仍可用。
agent 应用的流量
在应用流量阶段,客户端中转了一个真实应用的请求,也就是一个中文安卓助手的请求。十个请求携带了同一个 agent 系统提示,对应一个在设备上运行隔离 Alpine Linux PRoot 环境的助手,并带有一个含七项条目的工具 schema:首位是 shell_execute,描述为在该环境中通过 /bin/sh -c 执行命令,其后是文件读取、文件写入、文件编辑、浏览器控制,以及两个持久化笔记工具。与模型调用交错出现的是应用自身的内务请求,包括一个必须输出 JSON、界面语言给定为 zh-Hans 的会话标题生成器,以及一些简短的中文人工轮次。
进入该阶段十三分钟后,在 14:07:16Z,一个请求以 KEY=value 形式携带了六个有效的厂商 API 密钥:两个搜索 API、一个 agent 消息 API、一个研究 API 和两个模型提供方密钥。仅凭捕获数据我们无法判断这些密钥是否属于输入者本人,还是此前窃取的材料正拿到一个免费端点上试用。无论哪种情况,它们都已经到了端点所有者手中。
排除扫描器的可能
证据不符合通用扫描器的特征。VirusTotal 对 43.155.205[.]31 返回 89 个引擎中 0 个判定为恶意且无信誉记录,也没有任何扫描器信誉数据源留有该地址的记录。通用的大规模扫描会向大量传感器发送一次性探测,而这个客户端维持了单个长生命周期会话,提示内容还在不断调整。同样的证据也不支持研究或测量类爬虫的解释,因为研究人员不会把有效的厂商密钥和真实用户会话送过他们正在测量的端点。
证据无法确定该地址是为众多下游用户做中转的共享代理池,还是某个人为单台设备自建的中转。Go 客户端、每日脚本化健康检查以及对单一上游会话的复用,与两种解读都同样吻合。
双方各自的暴露面
端点所有者为客户端消耗的推理付费,而客户端把自己用户的提示、自己的系统提示和自己的凭据交给了端点所有者,上文那份工具 schema 还提供了安卓设备上的 shell 执行、文件写入和浏览器控制能力。一个恶意后端可以返回自己选定的工具调用,并让它们在客户端侧被执行。
假定一个无需认证即可从互联网访问的自托管推理端点,已经在被健康检查并被当作别人的后端使用,因为本例中的端点在我们观察到首次活动后的五天内就是如此。把经过它的每一条提示都当作已泄露,包括那些你从未听说过的应用的系统提示和粘贴的密钥。
失陷指标
下方唯一的网络指标已做脱敏处理;路径按观测原样给出。
网络
| 指标 | 上下文 |
|---|---|
43.155.205[.]31 | 对一个未经认证的推理端点做健康检查、指纹识别,随后向其中转 agent 应用流量的客户端 |
主机痕迹
| 指标 | 上下文 |
|---|---|
Reply with exactly this token, nothing else: <8 alnum chars> | 用于验证端点的回显保真度探测;每个请求重新生成 token(观测到 TKOLGN2R、TK3C9IAN、TKA63OEL、P2380OG9、P23WD39I、P2GBIOTB、ZQ7X) |
Go-http-client/1.1 POST /v1/chat/completions with no Authorization header | 该中转客户端在全部 280 条被捕获提示中的请求特征;单独的库标识字符串很常见 |
检测
Sigma
针对自托管推理端点的模型指纹识别提示组合(候选规则)。
title: Model-fingerprinting prompt battery against a self-hosted inference endpoint
status: experimental
description: Detects the validation prompts an operator sends to decide whether an exposed OpenAI-compatible endpoint serves a real model. Requires prompt-body logging on the gateway; most inference servers do not log request bodies by default.
logsource:
category: application
product: llm_gateway
detection:
selection_path:
url.path|endswith:
- '/v1/chat/completions'
- '/v1/completions'
- '/api/generate'
selection_probe:
http.request.body.content|contains:
- 'Reply with exactly this token'
- 'Repeat this token exactly and nothing else'
- 'What AI model are you'
- 'What is your knowledge cutoff date'
- 'state your model family'
- '输出你的模型名称和参数规模'
condition: selection_path and selection_probe
falsepositives:
- Internal model-evaluation harnesses and CI smoke tests that verify a served model responds and identifies itself
level: medium
检测逻辑
- 来自管理网络之外的未认证推理请求(网络,候选)。对自托管推理端口上任何发往 /v1/chat/completions、/v1/completions、/api/generate 或 /api/chat 的 HTTP POST 告警,条件是来源位于你的工程网段之外,且不携带 Authorization 或 api-key 头。若同一来源在两秒内发出超过五个这类请求,应视为第三方的自动化上游健康检查,而非用户流量。
- agent 系统提示到达了本应只服务自有用户的端点(行为,候选)。在你自己运营的推理网关上,标记超过 10,000 个字符且包含 tools 或 functions 数组、数组条目涉及 shell、exec、文件写入或浏览器控制,而客户端地址又不属于你已登记应用的请求体。这要么意味着有未知方在用你的算力跑自主 agent,要么意味着你自己的某个 agent 被指向了错误的后端。
处置建议
- 把自托管推理服务器绑定到回环地址或私有网络接口,并在前面放一个做认证的反向代理;使用高位端口不等于访问控制。
- 在每条推理路由上强制要求 API 密钥或 mTLS,并在代理层而不是模型服务器层拒绝不带 Authorization 头的请求。
- 对发往 /v1/chat/completions 的未认证 POST 以及来自同一来源的重复极简提示告警,后者正是代理池对已征用上游做健康检查的方式。
- 如果你的推理端点曾在无认证状态下可从互联网访问,把经过它的每一条提示和系统提示都当作已泄露,并轮换任何在会话中出现过的凭据。
- 对运行 agent 框架的团队:把模型 base URL 固定到你自己掌控的提供方,绝不要让持有 shell、文件写入或浏览器工具的 agent 指向免费或来源不明的 OpenAI 兼容端点。
MITRE ATT&CK 映射
| 战术 | 技术 | 观测情况 |
|---|---|---|
| 侦察 | T1595 主动扫描 | 使用脚本化存活提示和精确 token 回显测试组合,来检验该端点是否提供真实模型以及是哪一个模型。 |
| 初始访问 | T1190 利用面向公网的应用 | 一个可从互联网访问且无认证的推理 API 被未授权方直接当作服务使用。 |
| 凭据访问 | T1552 不安全的凭据 | 六个第三方厂商 API 密钥被粘贴进一段经过该端点的会话,暴露给了端点的运营者。 |
参考资料
方法论与分析师备注
本报告基于 1 个来源地址和 7 条带时间戳的观测,取自传感器遥测数据,并与公开威胁情报源和富化查询做了核对,覆盖 2026 年 9 月 13 日至 20 日。
尚未解决的问题:
- 43.155.205[.]31 是服务众多下游用户的共享代理池,还是某个人为单台设备自建的中转。
- 那六个被粘贴的厂商 API 密钥是属于输入者本人,还是此前窃取的材料正在被试用。
- 该端点是如何被发现的,以及枚举它的地址是否就是后来使用它的地址。
- 该客户端在 9 月 13 日之前的活动是什么样的。
- 同一客户端是否还在使用其他暴露的推理端点。
问题或更正请联系:contact@kinryu.sh。