PoeLLM 这个恶意程序,最妙的地方在于:它的"指挥部"藏在一首诗里。

Lumen 旗下 Black Lotus Labs 10 月 7 日的报告写得很清楚。这东西启动后不查硬编码 IP,而是跑去 GitHub 拉一首英文诗——诗存在一个 fork 自 Node.js 的仓库里,文件后缀还伪装成 .css。程序按固定位置从诗里挑出四个词,查内置字典翻成四个数字,拼成 IPv4,就是它的 C2(指挥控制)服务器。报告给的样本里,"driver / diode / decryption / string" 对应 92、119、165、74,拼出来是 92.119.165.74。

这意味着什么?黑客想换 C2,改诗就行,木马本体一个字都不用重编译。报告说那首诗前后被改过 11 次,识别出 12 个关联 C2,报告发布时还有 3 个活着。用研究员 Ryan English 的话说,C2 用的 IP 在受害者 netflow 之外完全不可见——这次行动的很多 C2,从来没被众包安全工具扫到过。

规模不算小:至少从今年 4 月起,累计入侵 3400 多台服务器,受害者集中在美欧,峰值单日活跃感染机超过 800 台。被打的都是些什么东西?大量是 LiteLLM、Ollama——就是这两个月被各种教程吹的、让你"自己在本地搭一个"的 AI 服务;此外还有 PDF 转换的 Gotenberg、代码托管的 Gitea。它们的共同点特别朴素:公网可达,且没有鉴权。

中招之后干嘛?装挖矿木马(XMRig、Iron),然后拿被控服务器当跳板接着扫别的目标,最近还开始尝试爆破 SSH 端口。归因方面,报告倾向一个讲意大利语的操盘者,中等置信度,还没坐实。

根因一点都不新鲜,就是那句老话:默认配置扔公网,等于把门拆了还挂个"欢迎光临"。Ollama 默认监听 11434,LiteLLM 这类网关默认也没开认证——自己图省事装了玩,第二天你的机器就成了别人的肉鸡池。

给几个能马上做的:

  1. AI 服务一律别对公网裸奔——要么绑 127.0.0.1,要么走内网 / VPN,要么前面套一层带鉴权的反代。
  2. 真要开出去,先过一遍 ss -lntp,看清楚哪些端口在 0.0.0.0 上听着。
  3. 生产环境用最小权限跑、收紧出站;挖矿这东西一旦起来,CPU 占用就是最直白的告警。
  4. 定期核一遍"这台机器上到底在跑什么"——陌生进程、陌生定时任务,比什么杀软都直观。

顺带说一句,我越来越觉得"暴露面"得当成硬指标来核:判断一台机器安不安全,不能看它"应该"开了什么,要看 firewall-cmd --list-all 和监听地址实际放通了什么。之前写堡垒机越权那篇(那篇在这)是一条线上的病——边界上的东西,默认都不该信。手边一堆机器要批量核对远程端口和凭据,可以看看七亿批量远程管理工具那套"控制台不落地凭据"的思路(教程页)。

(顺嘴提一句,AI 服务一多,最容易被忽略的其实是"钥匙"本身——token、密钥一开始就给太多、放太显眼,是我在 AI 删库那篇里吐槽过的老毛病:《AI 删库不是它手滑,是那个 token 一开始就给多了》。)