省流:由于不合理的配置,导致 FastCGI(9000)端口向互联网暴露,从而使容器内 PHP 环境感染了 kdevtmpfsi 挖矿病毒。
某个风和日丽的下午,某只羊驼在某节水课上熟练地打开 Termius,连接上熟悉的 DMIT 洛杉矶服务器,打开测试环境准备实验一些新玩意;命令行在屏幕上飞速滚动时,他顺便打开beszel
(性能监控面板),顿时被吓了一跳——原本占用率很少超过10%的CPU,此时直接飙升至100%
是被DDOS/CC攻击了?点进去看一眼,宽带占用一直小于10Mbps;打开htop
一看,好家伙,名为 kdevtmpfsi
的进程直接吃了100%的CPU,尝试使用kill
命令结束进程,不一会儿又“死灰复燃”;简单的 Google 了一下,果然是一个挖矿病毒。
简单找一下病毒文件在哪:
sudo find / -name kdevtmpfsi 2>/dev/null
返回:
/var/lib/docker/overlay2/85b795587.../merged/tmp/kdevtmpfsi
/var/lib/docker/overlay2/85b795587.../diff/tmp/kdevtmpfsi
文件路径包含overlay2
,在这台机器上多半是 Docker 用来存储容器文件系统的分层文件系统,现在只需要找到其与哪个容器相关。
查看正在运行的 Docker 容器:
docker ps -a
这台服务器没什么正经用途,仅仅运行了beszel-agent
(面板探针)、dockge
(图形化 Docker Compose 管理器)和typecho:1.2.1-php7.4-fpm-alpine
用于测试:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8faa9ffa4b61 henrygd/beszel-agent "/agent" 5 days ago Up 9 hours beszel-agent
b36061c88911 joyqi/typecho:1.2.1-php7.4-fpm-alpine "docker-php-entrypoi…" 5 days ago Up About an hour 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp typecho-fpm
54c20a7f2271 louislam/dockge:1 "/usr/bin/dumb-init …" 5 weeks ago Up 9 hours (healthy) 0.0.0.0:5001->5001/tcp, :::5001->5001/tcp dockge-dockge-1
相比于其他两个维护较为频繁的开源项目,还是更新较为缓慢同时依赖 php7.4 的 typecho 更容易遭受攻击,看看这个容器相关信息:
docker inspect -f '{{.GraphDriver.Data}}' b36061c88911
得到一大串用哈希值命名的文件夹,之前找到的病毒目录赫然在列。至此,基本上可以确定病毒是从 typecho 容器渗透进宿主机的;不过它是怎么进来的?
通过查阅资料,发现有的站长有类似的案例,并确认是通过暴露在互联网的 FastCGI 端口感染了容器内的 PHP,我猛然想起刚刚出现在PORTS
一栏的0.0.0.0:9000->9000/tcp, :::9000->9000/tcp
,出于懒惰,我甚至没有在这台服务器上配置 UFW 防火墙……
具体来说,我使用的这个镜像为了轻量化,没有内置 Nginx\Apache, 而是提供了 PHP-FPM 的 FastCGI 端口,我为了能够在 Caddy 中使用如下配置:
www.alpacabro.com {
import common_tls
import common_headers
root * /var/www/www.alpacabro.com
php_fastcgi 127.0.0.1:9000 {
root /app
}
file_server
encode gzip zstd
}
使用了如下 Docker Compose:
version: "3.3"
services:
typecho:
container_name: typecho-fpm
restart: unless-stopped
ports:
- 9000:9000
volumes:
- /var/www/www.alpacabro.com:/app
environment:
- TYPECHO_SITE_URL=https://www.alpacabro.com
image: joyqi/typecho:1.2.1-php7.4-fpm-alpine
networks: {}
乍一看似乎毫无问题,但是9000:9000
和没有任何防备的防火墙形成了非常致命的漏洞,攻击者虽然无法获取到宿主机的权限,但是依然可以利用容器来挖矿,耗尽你的系统资源;而且万一之后 Docker 爆出容器逃逸漏洞,宿主机也危在旦夕。
P.S. 由于没有信心彻底清除此病毒,我选择了重装服务器系统;同时在此站点的生产环境中,我使用了云服务商提供的防火墙(如果你的服务商没有提供,建议检查 Docker 是否遵守防火墙设置),同时使用了最新的PHP 8.3和php_fastcgi unix//run/php/php8.3-fpm.sock
来用UNIX套接字协议(相比于TCP这种网络协议,延迟更低,安全性更佳),并且尽可能少的暴露端口。
同时,就像是 Go 日的挖矿病毒,好好的周末被毁了 - V2EX 中 laminux29 老哥所表达的,安全威胁惩处补全,我们需要保持警觉,随机应变;但是无论我们如何努力修复漏洞,总会有意想不到“惊喜”。因此,保持定期备份、制定应急计划并放平心态,为保护数据和系统尽力即可。
参考资料: