Linux挖矿病毒应急响应:从CPU飙满到彻底清除的实战指南 1. 一次真实的应急响应从CPU飙满到挖矿病毒落网凌晨两点监控告警突然炸了——一台对外提供服务的Linux业务机CPU使用率从日常的15%直接飙到380%多核累加负载均值冲到20以上SSH登录卡得像拨号上网。这种场景我遇到过不止一次十有八九是中了挖矿木马。等你登上机器top一看一个名字伪装成kworker或者dbus-daemon的进程正疯狂吃CPUkill掉之后过几分钟又自己活过来就像打不死的小强。这篇文章要聊的就是Linux系统遭遇挖矿病毒后的深度排查与根治。我会把整个处置流程拆成“发现异常—定位进程—揪出持久化机制—清除病毒—加固系统”五个阶段重点讲清楚ld.so.preload动态库劫持、chattr文件锁、pamdicks这类PAM后门模块的识别与清除方法。这些是挖矿病毒最常用的藏身手段也是普通运维最容易忽略的地方。适合谁看如果你手里管着几台Linux服务器或者正在学运维、准备面试这篇文章里的排查思路和命令可以直接抄作业。哪怕你是刚接触Linux的新手我也会把每一步为什么这么做讲清楚保证你能跟着操作。下面所有内容都来自我实际处置过的案例命令和路径都经过验证但每台机器环境不同操作前务必先做快照或备份。2. 挖矿病毒为什么难缠先搞懂它的生存逻辑2.1 挖矿木马的本质与盈利模式挖矿木马说白了就是别人偷偷在你机器上跑程序用你的CPU和电费帮他挖加密货币。它不加密你的文件那是勒索病毒干的事也不偷你的数据它的目标只有一个尽可能长时间、隐蔽地占用你的计算资源。所以它的核心诉求是“持久化”和“隐蔽性”而不是破坏性。这就决定了它的行为特征进程名伪装成系统进程、文件藏在/tmp或/dev/shm这类临时目录、通过定时任务或系统服务实现自启动、用chattr给自身文件加锁防止被删。你kill掉进程它就能重启你删掉文件它可能还有备份这就是为什么很多人反复清理反复中招。从盈利角度看攻击者通常批量扫描暴露在公网的Linux主机通过SSH弱口令、Redis未授权访问、Web应用漏洞等方式入侵植入挖矿程序后加入矿池。一台机器挖不了多少但一千台、一万台就是可观的收益。所以这类病毒往往带有横向传播功能会尝试感染同网段其他机器。2.2 为什么Linux成为重灾区很多人有个误区觉得Linux比Windows安全不会中病毒。这个观念得改改了。Linux在服务器市场占比极高而服务器恰恰是算力最值钱的地方。加上很多运维人员对Linux安全防护投入不足——防火墙规则粗放、SSH允许密码登录、Redis/MongoDB直接暴露公网、系统补丁几个月不打——这些都给攻击者留了门。另外Linux的开放性也是双刃剑。crontab、systemd、init.d、ld.so.preload、PAM模块、内核模块这些机制本意是方便管理和扩展但一旦被恶意利用就变成病毒藏身的绝佳位置。攻击者对这些机制的理解往往比普通运维还深这就导致排查时容易漏掉关键点。2.3 常见入侵入口与病毒行为链根据我处理过的案例入侵入口排前三的是SSH弱口令爆破、Redis未授权访问、Web应用RCE漏洞。病毒进入后的典型行为链是这样的下载挖矿程序到/tmp、/dev/shm、/var/tmp等目录赋予执行权限并运行写入/etc/ld.so.preload劫持动态链接库隐藏自身进程和文件用chattr i给关键文件加不可变属性写入crontab或创建systemd服务实现自启动替换或新增PAM模块如pamdicks实现后门登录尝试SSH横向感染其他机器清除系统日志和命令历史理解这条行为链排查时就可以按图索骥逐个环节检查。下面进入实操部分。3. 第一阶段确认异常与初步止损3.1 快速判断是否中招的几个信号发现机器异常先别急着乱删文件。按下面几个信号快速判断CPU/负载异常top或uptime看到负载远高于正常水平且没有明显业务增长陌生进程进程名像系统进程但路径不对比如/tmp/kworker、/dev/shm/dbus网络连接异常netstat -antp看到大量对外连接尤其是连向矿池常用端口3333、4444、5555、7777、8888等定时任务异常crontab -l出现不认识的条目文件被加锁rm删不掉提示Operation not permittedSSH登录异常密码正确但登不上或者登录后行为怪异我一般会先跑一组命令快速摸底# 查看CPU占用最高的进程 top -c -b -n 1 | head -30 # 查看网络连接 netstat -antp | grep ESTABLISHED # 查看定时任务 crontab -l cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ # 查看异常文件 ls -la /tmp /dev/shm /var/tmp注意如果怀疑机器已被控制先不要用SSH直接登录操作最好通过带外管理如云控制台的VNC进入避免登录密码被记录。同时把机器从负载均衡摘除防止影响其他节点。3.2 隔离机器与保留现场确认中招后第一件事是隔离不是清理。把机器从网络中断开或者用防火墙只放行你的管理IP防止病毒继续横向传播也防止攻击者发现你在排查后销毁证据。但隔离不等于关机。不要直接关机或重启因为很多病毒的内存信息、网络连接、临时文件在重启后就没了这些恰恰是排查的关键线索。正确的做法是用iptables限制出入站流量只保留管理通道对关键目录做快照或打包备份如/tmp、/dev/shm、/etc、/var/spool/cron记录当前所有进程、网络连接、定时任务、用户列表# 备份现场信息 mkdir /root/incident_backup ps auxf /root/incident_backup/ps.txt netstat -antp /root/incident_backup/netstat.txt crontab -l /root/incident_backup/crontab_root.txt cat /etc/passwd /root/incident_backup/passwd.txt ls -la /etc/cron* /root/incident_backup/cron_ls.txt这些备份在后续分析和溯源时非常有用也能防止清理过程中误删重要文件。3.3 别急着kill先定位病毒主体很多人一看到高CPU进程就kill -9结果病毒立刻重启还打草惊蛇。正确的做法是先定位病毒主体找到进程的可执行文件路径、父进程、启动方式。# 找到可疑进程PID top -c # 查看进程详细信息 ls -la /proc/PID/exe cat /proc/PID/cmdline ls -la /proc/PID/cwd # 查看进程树找父进程 ps -ef --forest | grep PID # 查看进程打开的文件 lsof -p PID如果/proc/PID/exe指向的路径是/tmp、/dev/shm这类目录基本可以确定是病毒。但先别删记下路径继续往下查它的持久化机制。4. 第二阶段深挖持久化机制揪出隐藏后门4.1 ld.so.preload劫持最隐蔽的进程隐藏术/etc/ld.so.preload是Linux动态链接器的一个配置文件里面列出的共享库会在所有程序启动前被优先加载。这个机制本意是给系统管理员做全局库注入用的但被病毒利用后就成了隐藏进程和文件的利器。病毒会写一个恶意.so文件比如/usr/local/lib/libprocesshider.so然后在/etc/ld.so.preload里写入这个路径。这个库会hookreaddir、read等系统调用当ps、top、ls等命令读取/proc目录时恶意库会过滤掉病毒进程和文件让你看不到它们。检查方法很简单cat /etc/ld.so.preload如果这个文件存在且内容指向一个你不认识的.so文件基本可以确定中招。正常情况下这个文件应该是空的或者不存在。# 查看文件内容 cat /etc/ld.so.preload # 查看该so文件的详细信息 ls -la /usr/local/lib/libprocesshider.so file /usr/local/lib/libprocesshider.so strings /usr/local/lib/libprocesshider.so | head -50清除时要注意不能直接rm这个文件因为病毒可能给它加了chattr i锁。先看属性lsattr /etc/ld.so.preload如果显示----i--------e--说明有不可变属性需要先解锁chattr -i /etc/ld.so.preload解锁后再清空文件内容不要直接删文件有些系统依赖这个文件存在echo /etc/ld.so.preload然后删除恶意.so文件。但删除前先确认没有其他进程依赖它可以用lsof检查。实操心得有些病毒会把ld.so.preload的内容写成多个路径或者用空格、换行混淆。清除时一定要把整个文件清空而不是只删其中一行。另外清除后要重启相关服务或重启机器让动态链接器重新加载配置。4.2 chattr文件锁为什么你的rm删不掉病毒文件chattr是Linux下修改文件属性的命令其中i属性表示文件不可变——不能删除、不能重命名、不能修改内容、不能创建链接。病毒用这招保护自己的核心文件让你rm时报Operation not permitted。排查时用lsattr查看文件属性lsattr /tmp/ lsattr /dev/shm/ lsattr /usr/local/lib/看到带i属性的文件就要警惕。清除步骤# 先解锁 chattr -i /path/to/virus_file # 再删除 rm -f /path/to/virus_file但要注意病毒可能同时给多个文件加锁包括它的备份、配置文件、定时任务脚本。所以要全盘扫描带i属性的文件# 扫描常见目录 find /tmp /dev/shm /var/tmp /usr/local /etc -type f -exec lsattr {} \; 2/dev/null | grep -- ----i注意有些系统文件本身就有i属性比如某些发行版的/etc/resolv.conf不要误删。判断标准是文件路径和内容是否可疑而不是只看属性。4.3 pamdicks后门PAM模块被替换的识别与清除PAMPluggable Authentication Modules是Linux的认证框架负责处理登录、su、sudo等认证。病毒如果替换或新增PAM模块就能实现万能密码登录——不管你密码怎么改攻击者都能用一个特定密码登进来。pamdicks是近年来出现的一种恶意PAM模块它会记录所有登录密码并允许攻击者用预设密码登录。检查方法# 查看PAM配置 cat /etc/pam.d/sshd cat /etc/pam.d/login cat /etc/pam.d/su # 查看PAM模块目录 ls -la /lib/security/ /lib64/security/ /usr/lib/security/ /usr/lib64/security/如果发现不认识的.so文件比如pam_unix.so被替换对比文件大小和修改时间或者多了一个pam_dicks.so之类的模块就要警惕。# 对比PAM模块的修改时间 ls -la --time-stylefull-iso /lib64/security/ # 查看模块是否被引用 grep -r pam_ /etc/pam.d/清除时如果确认某个PAM模块被替换需要从同版本系统的正常机器上拷贝一份回来或者重装对应的PAM包。不要直接删除PAM模块否则可能导致所有用户无法登录。# 重装PAM包以CentOS为例 yum reinstall pam # 或者从备份恢复 cp /root/incident_backup/pam_unix.so /lib64/security/实操心得PAM后门是最危险的因为它直接威胁认证安全。清除后一定要修改所有用户密码包括root和普通用户并且检查/etc/shadow是否有异常条目。另外检查/etc/pam.d/下所有配置文件看是否有被添加的恶意行。4.4 定时任务与systemd服务自启动的常见藏身处病毒实现自启动的方式主要有三种crontab、systemd服务、init.d脚本。排查时要逐个检查# 检查所有用户的crontab for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2/dev/null; done # 检查系统级cron cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ # 检查systemd服务 systemctl list-units --typeservice | grep -v systemd ls -la /etc/systemd/system/ ls -la /usr/lib/systemd/system/ # 检查init.d ls -la /etc/init.d/病毒常用的伪装名有kworker、dbus、systemd-helper、network-check、logrotate等。看到不认识的条目先查内容再决定是否删除。# 查看可疑cron内容 cat /etc/cron.d/suspicious_file # 查看可疑systemd服务 cat /etc/systemd/system/suspicious.service清除时先停止服务再删除文件最后重载配置systemctl stop suspicious.service systemctl disable suspicious.service rm -f /etc/systemd/system/suspicious.service systemctl daemon-reload5. 第三阶段全面清除与系统加固5.1 清除病毒文件的正确顺序清除病毒要按从外到内、从启动项到主体的顺序否则容易触发病毒的重启机制。我总结的顺序是断网隔离防止清除过程中病毒下载新版本或横向传播清除定时任务和自启动项先切断病毒的复活路径解锁并删除ld.so.preload和恶意.so解除进程隐藏解锁并删除病毒主体文件/tmp、/dev/shm、/var/tmp下的可执行文件清除PAM后门恢复正常的PAM模块清除恶意用户和SSH密钥检查/etc/passwd、/etc/shadow、~/.ssh/authorized_keys重启机器确保所有内存中的病毒进程被清除再次全面检查确认没有残留# 示例清除一个典型的挖矿病毒 # 1. 清除cron crontab -r rm -f /etc/cron.d/suspicious # 2. 清除ld.so.preload chattr -i /etc/ld.so.preload echo /etc/ld.so.preload chattr -i /usr/local/lib/libprocesshider.so rm -f /usr/local/lib/libprocesshider.so # 3. 清除病毒主体 chattr -i /tmp/kworker rm -f /tmp/kworker chattr -i /dev/shm/dbus rm -f /dev/shm/dbus # 4. 清除systemd服务 systemctl stop suspicious.service systemctl disable suspicious.service rm -f /etc/systemd/system/suspicious.service systemctl daemon-reload # 5. 重启 reboot注意重启前一定要确认所有自启动项都已清除否则重启后病毒又活了。重启后第一时间检查top、crontab、ld.so.preload是否正常。5.2 系统加固防止再次中招清除病毒只是治标加固系统才是治本。我一般会做以下几件事SSH加固# 禁用密码登录改用密钥 sed -i s/^#PasswordAuthentication yes/PasswordAuthentication no/ /etc/ssh/sshd_config sed -i s/^PasswordAuthentication yes/PasswordAuthentication no/ /etc/ssh/sshd_config # 禁止root直接登录 sed -i s/^#PermitRootLogin yes/PermitRootLogin no/ /etc/ssh/sshd_config sed -i s/^PermitRootLogin yes/PermitRootLogin no/ /etc/ssh/sshd_config # 修改默认端口可选 sed -i s/^#Port 22/Port 22222/ /etc/ssh/sshd_config # 重启SSH systemctl restart sshd防火墙加固# 只放行必要端口 iptables -A INPUT -p tcp --dport 22222 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -j DROP # 保存规则 iptables-save /etc/iptables/rules.v4服务加固Redis设置密码绑定内网IP禁用危险命令MongoDB启用认证绑定内网IPWeb应用及时打补丁关闭不必要的功能监控告警部署auditd监控关键文件变化配置CPU/负载告警定期检查crontab、ld.so.preload、PAM模块5.3 验证清除效果与复盘清除完成后用以下命令验证# 检查CPU是否恢复正常 top -b -n 1 | head -20 # 检查ld.so.preload是否为空 cat /etc/ld.so.preload # 检查crontab是否干净 crontab -l cat /etc/crontab # 检查异常进程 ps auxf | grep -v \[ | grep -v systemd # 检查网络连接 netstat -antp | grep ESTABLISHED # 检查PAM模块 ls -la /lib64/security/如果一切正常再观察24小时确认没有复发。最后做一次复盘病毒是怎么进来的是弱口令还是漏洞补丁打了吗监控加了吗把这些经验记录下来避免下次再踩坑。6. 常见问题与排查技巧实录6.1 排查速查表问题现象可能原因排查命令解决方法CPU飙高kill后重启定时任务或systemd自启动crontab -l、systemctl list-units清除自启动项ps看不到异常进程但CPU高ld.so.preload劫持cat /etc/ld.so.preload清空文件删除恶意sorm删不掉文件chattr i锁lsattr /path/to/filechattr -i后删除密码正确但登不上PAM后门或SSH配置被改cat /etc/pam.d/sshd恢复PAM模块检查sshd_config大量对外连接挖矿程序连接矿池netstat -antp清除病毒封禁矿池IP日志被清空病毒清除痕迹ls -la /var/log/从备份恢复部署远程日志6.2 独家避坑技巧技巧一不要相信ps和top。如果ld.so.preload被劫持这两个命令看到的进程列表是过滤过的。可以用busybox ps或者直接读/proc目录来绕过# 用busybox查看进程 busybox ps aux # 直接遍历/proc for pid in /proc/[0-9]*; do echo $pid: $(cat $pid/cmdline 2/dev/null | tr \0 ); done技巧二检查/etc/ld.so.preload的修改时间。如果这个文件的修改时间和你发现异常的时间接近基本可以确定是病毒写的。正常系统这个文件很少被修改。技巧三用strace跟踪可疑进程。如果病毒进程还在运行可以用strace看它在干什么strace -p PID -f -e tracefile,network这能帮你找到它读写了哪些文件、连接了哪些IP。技巧四检查/etc/passwd和/etc/shadow。病毒可能添加了隐藏用户或者修改了root密码。检查是否有UID为0的非root用户awk -F: $30 {print $1} /etc/passwd技巧五检查SSH密钥。病毒可能在~/.ssh/authorized_keys里添加了自己的公钥实现免密登录cat ~/.ssh/authorized_keys cat /root/.ssh/authorized_keys技巧六用rpm -Va或debsums校验系统文件。如果病毒替换了系统命令如ps、netstat、ls可以用包管理器校验# CentOS rpm -Va | grep ^..5 # Debian/Ubuntu debsums -c6.3 什么时候该重装系统如果病毒已经深入系统内核模块或者PAM、SSH、核心命令都被替换清理成本可能高于重装。我的判断标准是病毒加载了内核模块lsmod看到不认识的模块多个核心系统命令被替换PAM模块被大面积篡改清理后反复复发这种情况下备份数据重装系统是最稳妥的选择。重装后记得打补丁、加固配置、恢复数据时先扫描一遍。7. 写在最后我的几点真实体会处理过几十次挖矿病毒后我最大的体会是预防远比清理重要。一台暴露在公网、SSH允许密码登录、Redis没有密码的机器被入侵只是时间问题。与其等中招后熬夜排查不如提前花半小时做好加固。另外不要迷信杀毒软件。Linux下的杀毒软件如ClamAV对挖矿病毒的检出率有限尤其是经过混淆和加壳的样本。真正靠得住的是严格的访问控制、及时的补丁更新、完善的监控告警以及一套清晰的应急响应流程。最后分享一个小习惯我会在每台服务器上放一个/root/check.sh脚本定期检查ld.so.preload、crontab、/tmp目录、异常进程和网络连接。脚本很简单但能在病毒刚落地时就发现苗头把损失降到最低。这个脚本后续还可以扩展成定时任务每天跑一次结果发到邮箱相当于给自己加了一层保险。