Hey, guy, how are you?

记一次 Docker 容器内 PHP 感染 kdevtmpfsi 挖矿病毒

省流:由于不合理的配置,导致 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 老哥所表达的,安全威胁惩处补全,我们需要保持警觉,随机应变;但是无论我们如何努力修复漏洞,总会有意想不到“惊喜”。因此,保持定期备份、制定应急计划并放平心态,为保护数据和系统尽力即可。

参考资料:

记一次 Docker 容器内 PHP 感染 kdevtmpfsi 挖矿病毒

https://www.alpacabro.com/archives/docker-php-kdevtmpfsi-mining-virus-infection.html

作者

alpacabro

发布时间

2024-10-16

许可协议

CC BY 4.0

添加新评论