今天发现一个VPS的CPU长时间占用100%,使用 top 命令发现两个进程异常,
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3206661 www 39 19 311584 264472 0 S 93.0 13.6 25,46 kworker/0:0
2847594 www 39 19 311592 264400 0 S 91.4 13.6 50,10 kworker/0:0
然后
root@s11193:~# ls -l /proc/3206661/exe
lrwxrwxrwx 1 www 65533 0 Dec 8 09:55 /proc/3206661/exe -> /home/nextjs/.config/autostart/.systemd-update
root@s11193:~# lsof -p 3206661
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kworker/0 3206661 www cwd DIR 0,59 4096 1484409 /app
kworker/0 3206661 www rtd DIR 0,59 4096 1464249 /
kworker/0 3206661 www txt REG 0,59 10466776 1450496 /home/nextjs/.config/autostart/.systemd-update
kworker/0 3206661 www mem REG 254,1 1450496 /home/nextjs/.config/autostart/.systemd-update (stat: No such file or directory)
kworker/0 3206661 www 0r CHR 1,3 0t0 5 /dev/null
kworker/0 3206661 www 1w CHR 1,3 0t0 5 /dev/null
kworker/0 3206661 www 2w CHR 1,3 0t0 5 /dev/null
kworker/0 3206661 www 3u a_inode 0,14 0 4012 [eventpoll:6,8,9,10,12]
kworker/0 3206661 www 4r FIFO 0,13 0t0 698430859 pipe
kworker/0 3206661 www 5w FIFO 0,13 0t0 698430859 pipe
kworker/0 3206661 www 6r FIFO 0,13 0t0 698430860 pipe
kworker/0 3206661 www 7w FIFO 0,13 0t0 698430860 pipe
kworker/0 3206661 www 8u a_inode 0,14 0 4012 [eventfd:37]
kworker/0 3206661 www 9u a_inode 0,14 0 4012 [eventfd:43]
kworker/0 3206661 www 10u a_inode 0,14 0 4012 [eventfd:49]
kworker/0 3206661 www 11r CHR 1,3 0t0 5 /dev/null
kworker/0 3206661 www 12u sock 0,8 0t0 720082792 protocol: TCP
root@s11193:~# ls -l /proc/2847594/exe
lrwxrwxrwx 1 www 65533 0 Dec 8 09:56 /proc/2847594/exe -> /tmp/nginx3
root@s11193:~# lsof -p 2847594
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kworker/0 2847594 www cwd DIR 0,59 4096 1484409 /app
kworker/0 2847594 www rtd DIR 0,59 4096 1464249 /
kworker/0 2847594 www txt REG 0,59 10466776 1450492 /tmp/nginx3
kworker/0 2847594 www mem REG 254,1 1450492 /tmp/nginx3 (stat: No such file or directory)
kworker/0 2847594 www 0r CHR 1,3 0t0 5 /dev/null
kworker/0 2847594 www 1u sock 0,8 0t0 692950241 protocol: UNIX-STREAM
kworker/0 2847594 www 2u sock 0,8 0t0 692950243 protocol: UNIX-STREAM
kworker/0 2847594 www 3u a_inode 0,14 0 4012 [eventpoll:6,8,10,11,12]
kworker/0 2847594 www 4r FIFO 0,13 0t0 692950251 pipe
kworker/0 2847594 www 5w FIFO 0,13 0t0 692950251 pipe
kworker/0 2847594 www 6r FIFO 0,13 0t0 692950252 pipe
kworker/0 2847594 www 7w FIFO 0,13 0t0 692950252 pipe
kworker/0 2847594 www 8u a_inode 0,14 0 4012 [eventfd:51]
kworker/0 2847594 www 9r CHR 1,3 0t0 5 /dev/null
kworker/0 2847594 www 10u a_inode 0,14 0 4012 [eventfd:54]
kworker/0 2847594 www 11u a_inode 0,14 0 4012 [eventfd:55]
kworker/0 2847594 www 12u sock 0,8 0t0 723270201 protocol: TCP
使用Gemini分析了一下,结果如下:
分析结论:
- 伪装成 Nginx: PID
2847594指向/tmp/nginx3。正规的 Nginx 绝对不会安装在/tmp临时目录下。这是典型的恶意文件。- 伪装成系统服务: PID
3206661指向/home/nextjs/.config/autostart/.systemd-update。这是一个隐藏文件,放在了nextjs用户的自动启动目录里,目的是为了保证你重启服务器后它还能自动运行。- 用户权限: 它们都以
www用户运行,这再次确认了黑客是通过你的 Web 应用漏洞(看起来是一个 Next.js 项目或者与该用户关联的项目)进来的。请立即 按顺序执行以下清理操作:
第一步:终止进程
立刻杀掉这两个进程,防止它们继续消耗 CPU 或自我复制。
Bashkill -9 3206661 2847594第二步:删除恶意文件
根据你刚才查到的路径,彻底删除这些文件。
`Bash# 删除伪装的 nginx3
rm -rf /tmp/nginx3删除伪装的 update 程序
rm -rf /home/nextjs/.config/autostart/.systemd-update`
第三步:清理自启动项(非常重要)
既然发现了
/home/nextjs/.config/autostart/这个目录,黑客很可能在这里放了.desktop文件来启动病毒。
- 检查并清理 autostart 目录:
Bashls -la /home/nextjs/.config/autostart/如果你看到任何.desktop文件(或者其他奇怪的文件),请把它们都删掉。通常这个目录下应该是空的(对于无头服务器)。直接清空该目录的命令(慎用,确认里面没你自己的东西):Bashrm -rf /home/nextjs/.config/autostart/*- 检查定时任务(再次确认): 黑客利用了
www用户,必须再次检查:Bashcrontab -u www -l如果有内容,使用crontab -u www -r直接清空。第四步:封堵漏洞(亡羊补牢)
既然病毒出现在
/home/nextjs/目录下:
- 检查 Next.js 项目: 你的 Next.js 应用可能存在 RCE(远程代码执行)漏洞 ,或者使用了带有恶意代码的 npm 包。
- 更改密码: 你的服务器上有一个
nextjs用户。如果该用户可以 SSH 登录,请立即修改它的密码 ,或者禁用该用户的 SSH 登录权限。Bashpasswd nextjs- 检查 SSH 密钥: 查看是否被写入了黑客的公钥。
Bashcat /home/nextjs/.ssh/authorized_keys如果发现陌生的公钥,立即删除。最终建议
虽然你现在清理了文件,但系统可能已经被植入了更深层的 Rootkit。强烈建议:备份你的代码和数据库(不要备份二进制文件),然后重装系统。 这是唯一能保证 100% 安全的方法。
看到一个问题出在next.js,就联想到最近的 CVE-2025-55182漏洞,看起来就是因为这个漏洞被人黑了,用我的VPS挖矿了,因为这个VPS上的网站基本都是PHP的,最后排查发现是Umami造成的,升级并删除被植入的病毒文件,问题解决。