11 月 2 日,星期一,凌晨。
比利时、荷兰、瑞典、卢森堡、爱尔兰、爱沙尼亚,至少 115 家超市的冷柜和冻柜,温度被人从后台调到了 50 度以上。
瑞典 ICA Nära 的店长 Mats Olsson 早上开门,先看到地上一摊水,冻柜停在 55 度。
几个小时后,一个叫 Coldframe 的开源项目在 Hacker News 上被顶到 193 分,40 条评论。
它假扮的就是被端掉的那台设备:丹麦 Danfoss 的 AK-SM 800A,一间门店里所有冷柜的总控。

总控台上那个除霜键,被人远程按下了
除霜本身是个正常功能,定时把蒸发器上的冰化掉。
攻击者做的事很简单:夜里把这个动作在每家店都触发一遍,货就全废了。
比利时制冷商 Sabcobel 的负责人 Stephan Moelans 说,这轮用的还是上个月法国那边同一个漏洞。
软件打个补丁只能算兜底,冰箱还得做物理改造。最省事的办法,是让这些设备只走一条安全的连接。

法国那一轮在 10 月中旬,几百家门店中招。
Carrefour、Coopérative U、Intermarché、Monoprix 都在名单上,CERT-FR 在 10 月 12 日发了预警。
漏洞不是新的。
Claroty 的 Team82 在 8 月 9 日就公开了 AK-SM 800A 的一串问题,「当日口令」能直接绕过登录,还有一个命令注入能拿到 shell。
Danfoss 已经在新固件里修掉。当时用 Censys 一扫,2765 台控制台就这么挂在公网上。
修完三个月,10 月照样被端。至少有一部分门店跑的还是旧固件。
第一波之后,论坛里还有人怀疑是某家厂商大范围推固件推岔了,不是被黑。第二波一来,这种说法就站不住了。
这些事的根子在门店这一头。一台冷柜要打补丁、要防火墙、要 VPN,这些活是厂商和安装商的老本行,超市经理不会碰。
Coldframe 假扮的是 Danfoss 那台 800A
整个项目是一个 Python 文件,标准库之外零依赖,MIT 协议。
作者是个匿名账号 hedgerow-dev,11 月 5 日把仓库放上 GitHub,三天挂到 33 星。
它准备了两个身份。
一个是 danfoss,冒充 AK-SM 800A,端出 StoreView 登录页、XML 接口和 HTTPS。
至于 dixell,冒充的是 Copeland 旗下的 XWEB 500,专门接公开利用脚本常打的那几个 CGI 路径。
像不像,拼的是指纹。nginx 的 server 头连同头的顺序照着真机抄,页面标题写 Danfoss StoreView,只开 TLS 1.2。
证书主题 CN=DanfossSM800A,由同名自签机构签发,每次构建重新生成一对密钥。

真机的 favicon 和固件里的 index.html 是厂商的东西,作者没往仓库里放,但留了两个环境变量。
私人部署时用 FAVICON_FILE 和 INDEX_FILE 指过去,页面就能按字节吐出来,连 Last-Modified 和 ETag 都对得上。
弱口令放人进去,进去只有一排假按钮
超市那台设备的出厂口令 Supervisor / 12345,在这套假货里照样能登。
XWEB 那边是 Admin / Admin,连失败次数都照着做:五分钟内五次,账号锁住。
登进去是一间假店,几排标着货名的冷柜,每个上面一个除霜键。
按下去,日志里多一条 control 事件。温度不会动,背后什么都没有。
认路这件事更能说明问题。
公开利用脚本打到跟前,请求会被打上 exploit 标记,README 里列了七个。
Danfoss 那边四个:路径穿越(CVE-2023-25914)、命令注入(CVE-2023-25915)、nginx 头覆写(CVE-2025-41452)、当日口令绕过(CVE-2025-41450)。
Dixell 那边三个:XWEB 500 的上传与命令路径(CVE-2021-45420),XWEB Pro 的 auth_mode 绕过(CVE-2026-25085)。
每个连接落一行 JSON,来源 IP、端口、协议、试过的口令、有没有对上 exploit。
附带一个 summary.py,把一天的日志搓成简报,顺手洗掉攻击者塞进来的终端转义字符。
谁是真冲着除霜键来的,谁只是顺手扫一遍,日志里见真章。
Modbus 那个口默认是关的。真机的 Modbus 只跟自己柜子上的控制器讲话,开着反而露怯。
想钓工业扫描器再单独打开,里面放了假的柜温、设定值和除霜寄存器。
这套逻辑挪到家里也成立:出厂口令没改、管理页直接挂在公网的路由器和 NAS,跟超市这台冷柜是一回事。
挂上去:一行命令,或者一个容器
本地最省事,一行命令就起来。
PERSONA=danfoss HTTP_PORT=8080 python3 -I honeypot.py
想让它真被扫到,就得放到公网。作者给的是一条加满限制的 podman 命令。
只读根文件系统、丢掉全部 capability、no-new-privileges、userns=auto。
内存压到 128m,进程上限 512,日志 10m 滚动,宿主 80 和 443 映射进容器的 8080 和 8443。
这里的关键在 rootful。rootless 的端口转发会把来源地址改写成同一个内网 IP,一晚上几十个攻击者,日志里就成了一个人。

再省事的办法是 cloud-init.yaml,开机器时直接贴进 User data,四美元的机器两分钟起一个。
作者提了两句。云厂商防火墙里只放行这台假设备真会开的端口,SSH 只对自己的地址开。
出站全掐掉,它不用往外连。
代价:骗得过扫描器,骗不过读代码的人
README 里自己招了四条。
交互浅,登进去只有一个仪表盘和几条 XML 命令,不是完整的 StoreView。
代码公开,谁都能对着源码认出来,部署时最好改掉页面文案、布局和证书主题。
真机的静态路径和部分 XML 返回在公开资料里查不到,缺的地方用了看着像的值。
还有一条更要命,机房 IP 本身就是破绽,真控制器蹲在门店的宽带后面。
Hacker News 上也有人说,与其搭蜜罐,不如先把冷柜从公网上摘下来。
作者回得不硬:同意,那才是真解,蜜罐只是趁人还在外头转的时候,看清来的是谁。
评论区里还有一段不太上台面的插曲。有人当场指出 Show HN 的文案是 AI 写的,「读起来像呕吐物」。
作者认了,说自己写急了。

项目地址:https://github.com/hedgerow-dev/coldframe
评论区