服务器突然多了陌生进程?先别急着删除,这套排查方法更稳妥

服务器运行一段时间后,管理员可能会在任务管理器、top 或 ps 列表里发现一些从未见过的进程。它可能占用较高的 CPU,也可能名称奇怪、运行目录异常,甚至不断向外建立网络连接。
遇到这种情况,很多人的第一反应是立即结束进程或删除文件。但在没有确认进程来源之前,直接处理可能导致网站中断、数据库异常,也可能破坏入侵痕迹。
陌生进程不一定是病毒。系统服务、监控程序、网站组件、自动更新任务,都可能产生不熟悉的进程。正确做法是先判断它“从哪里来、正在做什么、是否会再次启动”,再决定如何处理。
先看服务器出现了什么异常
以一台 A5IDC 香港三网服务器为例,配置为 E3-1245 V3、16GB 内存、240GB SSD,接入30M CN2+CMIN2+CU三网优化线路,主要运行企业网站、PHP 后台和 MySQL 数据库。
日常监控中发现服务器负载突然升高,CPU 使用率长期接近100%,但网站访问量并没有明显增加。通过 top 查看后,发现一个不熟悉的进程持续占用多个CPU线程。
这时不要只根据进程名称判断。恶意程序可能伪装成 systemd、kworker、mysql 等正常名称,而部分正常程序的名称本身也可能比较陌生。
排查重点应放在以下几个方面:
-
进程由哪个用户启动
-
可执行文件保存在哪里
-
父进程是谁
-
启动了多长时间
-
正在访问哪些文件
-
是否存在异常网络连接
-
结束后是否会自动恢复
Linux服务器如何查看陌生进程
首先可以通过 top 或 htop 找出CPU、内存占用异常的进程,并记录对应的PID。
top
假设发现异常进程PID为 2684,可以继续查看完整启动命令:
ps -fp 2684
或者查看更详细的信息:
ps -p 2684 -o pid,ppid,user,lstart,etime,cmd
这里需要重点关注 PPID,也就是父进程编号。如果陌生进程由 Nginx、PHP-FPM、Java 或某个业务脚本启动,可能与网站程序有关;如果它的父进程异常、启动链路混乱,或者直接由临时目录中的脚本启动,就需要提高警惕。
接着查看进程对应的可执行文件:
readlink -f /proc/2684/exe
正常系统程序通常位于:
/usr/bin/
/usr/sbin/
/bin/
/sbin/
如果进程文件位于以下目录,则需要重点排查:
/tmp/
/var/tmp/
/dev/shm/
/home/某个网站目录/uploads/
这些目录并不是一定有问题,但经常被攻击者用于保存临时脚本、挖矿程序或下载器。
还可以查看进程当前打开的文件:
lsof -p 2684
如果程序不断读取网站配置、SSH密钥、数据库文件,或者操作与其业务无关的目录,风险会明显增加。
检查进程是否存在异常网络连接
部分恶意进程本身CPU占用并不高,但会持续连接外部服务器、接收命令或上传数据。因此,网络连接也是判断进程性质的重要依据。
可以执行:
ss -antp
只查看指定进程的连接:
lsof -Pan -p 2684 -i
需要关注的情况包括:
-
持续连接多个陌生海外IP
-
连接非常规高位端口
-
短时间建立大量外连
-
向外发送大量数据
-
监听业务中未使用的端口
不过,连接外部IP并不等于恶意行为。CDN、对象存储、邮件接口、支付接口、软件更新和监控平台都可能产生外连。判断时要结合业务用途、目标IP和程序来源综合分析。
检查进程是否会自动启动
结束一个进程并不代表问题已经解决。如果它由计划任务、系统服务或网站后门自动拉起,几秒钟后就可能重新运行。
Linux服务器可以检查系统服务:
systemctl list-units --type=service --state=running
systemctl status 服务名称
检查当前用户和系统计划任务:
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
还需要查看常见启动位置:
/etc/systemd/system/
/usr/lib/systemd/system/
/etc/rc.local
/root/.bashrc
/root/.profile
如果发现计划任务每分钟执行一次陌生脚本,或者 systemd 服务指向 /tmp、/dev/shm 等目录中的文件,通常具有较高风险。
Windows服务器如何排查
Windows服务器可以先在任务管理器中查看进程名称、CPU占用、内存占用和运行用户,然后右键选择“打开文件所在的位置”。
正常系统进程通常位于:
C:\Windows\System32\
C:\Windows\SysWOW64\
C:\Program Files\
如果一个伪装成系统服务的程序运行在用户临时目录、下载目录或网站上传目录,需要进一步确认其来源。
还可以使用 PowerShell 查看进程路径:
Get-CimInstance Win32_Process |
Select-Object ProcessId, ParentProcessId, Name, ExecutablePath, CommandLine
查看网络连接及关联进程:
Get-NetTCPConnection |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
Windows还应重点检查:
-
任务计划程序
-
系统服务
-
注册表启动项
-
用户启动目录
-
IIS网站目录中的异常脚本
-
最近新增的管理员账户
不要只依赖杀毒软件的扫描结果。未报毒只能说明当前特征库没有识别出来,并不能完全证明文件安全。
如何判断进程是否可信
判断陌生进程时,可以按照“来源、行为、权限、持久化”四个方向进行分析。
1. 来源是否清楚
检查程序是否由系统软件包、运维面板、监控工具或业务程序安装。Linux可以查询文件属于哪个软件包:
Debian、Ubuntu系统:
dpkg -S /usr/bin/程序名称
CentOS、Rocky Linux系统:
rpm -qf /usr/bin/程序名称
如果程序不属于任何已安装软件包,也没有明确的业务来源,就要继续调查。
2. 行为是否符合业务
数据库进程占用内存较高可能是正常现象,但一个图片处理程序长时间占满全部CPU,就不太合理。
判断时应结合服务器用途。例如企业网站服务器通常会运行 Nginx、PHP-FPM、MySQL、Redis、监控Agent等服务。突然出现持续高负载的陌生二进制文件,显然不符合正常业务特征。
3. 权限是否过高
查看进程是否以 root、SYSTEM 或管理员权限运行。权限越高,潜在影响越大。
但需要注意,很多正常系统服务也必须使用高权限。因此,高权限只能说明风险较高,不能单独作为恶意判断依据。
4. 是否存在持久化行为
如果结束进程后立即重新出现,说明背后可能存在守护进程、计划任务、系统服务或网站后门。
此时应先找到重新启动它的源头,而不是反复执行 kill -9。
不要急着直接删除文件
发现可疑进程后,建议先记录以下信息:
ps -fp 2684
readlink -f /proc/2684/exe
lsof -p 2684
ss -antp
sha256sum /可疑文件路径
同时保存相关系统日志、登录日志、网站访问日志和计划任务内容。
如果业务允许,可以先通过防火墙限制可疑外连,或者暂时将服务器隔离,避免数据继续外泄。然后再停止进程:
kill 2684
如果普通停止无效,再考虑:
kill -9 2684
直接使用 kill -9 不会给程序清理资源和写入状态的机会,因此不建议作为第一步操作。
对于已经确认的恶意文件,还需要同时清理其启动项、计划任务、下载脚本、关联账户和网站后门,否则文件很可能再次出现。
发现恶意进程后还要检查什么
恶意进程往往只是表面现象。即使将它删除,也要继续查找攻击入口。
建议重点检查:
-
SSH或远程桌面是否存在陌生登录
-
是否新增了系统用户或管理员账户
-
网站程序是否存在文件上传漏洞
-
CMS、插件和运行环境是否长期未更新
-
SSH密码是否过于简单
-
数据库或管理面板是否暴露公网
-
网站目录是否出现近期新增或被修改的文件
-
防火墙是否开放了不必要的端口
-
密钥、数据库密码和API凭据是否可能泄露
Linux可以查看近期登录:
last
lastb
查看近期修改的文件:
find /网站目录 -type f -mtime -3
这里的 -mtime -3 表示查找最近三天内修改过的文件。实际排查时应根据异常发生时间调整范围。
什么情况下建议重装系统
如果只是某个业务脚本配置错误,找到来源并修复即可,不需要重装服务器。
但出现以下情况时,应认真考虑备份必要业务数据后重装系统:
-
root或管理员权限已经被获取
-
核心系统命令被替换
-
存在多个无法确认来源的后门
-
日志被大量删除或篡改
-
无法确定攻击者修改了哪些文件
-
清理后恶意进程反复出现
重装时不要直接将整个旧系统目录复制回来。应只备份经过检查的数据库、配置文件和业务数据,并重新安装运行环境、修改所有密码和密钥。
总结
服务器出现陌生进程时,最重要的不是马上结束它,而是先确认进程的启动用户、执行路径、父进程、网络连接和自动启动方式。
一个相对完整的排查顺序是:
发现资源异常,记录PID;查看启动命令和文件路径;检查父进程与网络连接;排查计划任务和系统服务;保存日志与文件哈希;限制风险后再停止进程;最后追查攻击入口并修复。
服务器安全排查不能只看进程名称,也不能只依赖一次病毒扫描。将进程行为、系统日志、网络连接和业务用途结合起来,才能更准确地区分正常服务、配置异常和真正的恶意程序。