news 2026/9/19 1:49:35

Linux挖矿病毒应急响应:从CPU飙满到彻底清除的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux挖矿病毒应急响应:从CPU飙满到彻底清除的实战指南

1. 一次真实的应急响应:从CPU飙满到挖矿病毒落网

凌晨两点,监控告警突然炸了——一台对外提供服务的Linux业务机CPU使用率从日常的15%直接飙到380%(多核累加),负载均值冲到20以上,SSH登录卡得像拨号上网。这种场景我遇到过不止一次,十有八九是中了挖矿木马。等你登上机器,top一看,一个名字伪装成kworker或者dbus-daemon的进程正疯狂吃CPU,kill掉之后过几分钟又自己活过来,就像打不死的小强。

这篇文章要聊的,就是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的开放性也是双刃剑。crontabsystemdinit.dld.so.preload、PAM模块、内核模块,这些机制本意是方便管理和扩展,但一旦被恶意利用,就变成病毒藏身的绝佳位置。攻击者对这些机制的理解往往比普通运维还深,这就导致排查时容易漏掉关键点。

2.3 常见入侵入口与病毒行为链

根据我处理过的案例,入侵入口排前三的是:SSH弱口令爆破Redis未授权访问Web应用RCE漏洞。病毒进入后的典型行为链是这样的:

  1. 下载挖矿程序到/tmp/dev/shm/var/tmp等目录
  2. 赋予执行权限并运行
  3. 写入/etc/ld.so.preload劫持动态链接库,隐藏自身进程和文件
  4. chattr +i给关键文件加不可变属性
  5. 写入crontab或创建systemd服务实现自启动
  6. 替换或新增PAM模块(如pamdicks)实现后门登录
  7. 尝试SSH横向感染其他机器
  8. 清除系统日志和命令历史

理解这条行为链,排查时就可以按图索骥,逐个环节检查。下面进入实操部分。

3. 第一阶段:确认异常与初步止损

3.1 快速判断是否中招的几个信号

发现机器异常,先别急着乱删文件。按下面几个信号快速判断:

  • CPU/负载异常topuptime看到负载远高于正常水平,且没有明显业务增长
  • 陌生进程:进程名像系统进程但路径不对,比如/tmp/kworker/dev/shm/dbus
  • 网络连接异常netstat -antp看到大量对外连接,尤其是连向矿池常用端口(3333、4444、5555、7777、8888等)
  • 定时任务异常crontab -l出现不认识的条目
  • 文件被加锁rm删不掉,提示Operation not permitted
  • SSH登录异常:密码正确但登不上,或者登录后行为怪异

我一般会先跑一组命令快速摸底:

# 查看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),防止病毒继续横向传播,也防止攻击者发现你在排查后销毁证据。

但隔离不等于关机。不要直接关机或重启,因为很多病毒的内存信息、网络连接、临时文件在重启后就没了,这些恰恰是排查的关键线索。正确的做法是:

  1. iptables限制出入站流量,只保留管理通道
  2. 对关键目录做快照或打包备份(如/tmp/dev/shm/etc/var/spool/cron
  3. 记录当前所有进程、网络连接、定时任务、用户列表
# 备份现场信息 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里写入这个路径。这个库会hookreaddirread等系统调用,当pstopls等命令读取/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模块被替换的识别与清除

PAM(Pluggable 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-style=full-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服务:自启动的常见藏身处

病毒实现自启动的方式主要有三种:crontabsystemd服务、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 --type=service | grep -v "systemd" ls -la /etc/systemd/system/ ls -la /usr/lib/systemd/system/ # 检查init.d ls -la /etc/init.d/

病毒常用的伪装名有:kworkerdbussystemd-helpernetwork-checklogrotate等。看到不认识的条目,先查内容再决定是否删除。

# 查看可疑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-reload

5. 第三阶段:全面清除与系统加固

5.1 清除病毒文件的正确顺序

清除病毒要按从外到内、从启动项到主体的顺序,否则容易触发病毒的重启机制。我总结的顺序是:

  1. 断网隔离:防止清除过程中病毒下载新版本或横向传播
  2. 清除定时任务和自启动项:先切断病毒的复活路径
  3. 解锁并删除ld.so.preload和恶意.so:解除进程隐藏
  4. 解锁并删除病毒主体文件/tmp/dev/shm/var/tmp下的可执行文件
  5. 清除PAM后门:恢复正常的PAM模块
  6. 清除恶意用户和SSH密钥:检查/etc/passwd/etc/shadow~/.ssh/authorized_keys
  7. 重启机器:确保所有内存中的病毒进程被清除
  8. 再次全面检查:确认没有残留
# 示例:清除一个典型的挖矿病毒 # 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

注意:重启前一定要确认所有自启动项都已清除,否则重启后病毒又活了。重启后第一时间检查topcrontabld.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:启用认证,绑定内网IP
  • Web应用:及时打补丁,关闭不必要的功能

监控告警

  • 部署auditd监控关键文件变化
  • 配置CPU/负载告警
  • 定期检查crontabld.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 -lsystemctl list-units清除自启动项
ps看不到异常进程但CPU高ld.so.preload劫持cat /etc/ld.so.preload清空文件,删除恶意so
rm删不掉文件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 独家避坑技巧

技巧一:不要相信pstop。如果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 trace=file,network

这能帮你找到它读写了哪些文件、连接了哪些IP。

技巧四:检查/etc/passwd/etc/shadow。病毒可能添加了隐藏用户,或者修改了root密码。检查是否有UID为0的非root用户:

awk -F: '$3==0 {print $1}' /etc/passwd

技巧五:检查SSH密钥。病毒可能在~/.ssh/authorized_keys里添加了自己的公钥,实现免密登录:

cat ~/.ssh/authorized_keys cat /root/.ssh/authorized_keys

技巧六:用rpm -Vadebsums校验系统文件。如果病毒替换了系统命令(如psnetstatls),可以用包管理器校验:

# CentOS rpm -Va | grep '^..5' # Debian/Ubuntu debsums -c

6.3 什么时候该重装系统

如果病毒已经深入系统内核模块,或者PAM、SSH、核心命令都被替换,清理成本可能高于重装。我的判断标准是:

  • 病毒加载了内核模块(lsmod看到不认识的模块)
  • 多个核心系统命令被替换
  • PAM模块被大面积篡改
  • 清理后反复复发

这种情况下,备份数据,重装系统是最稳妥的选择。重装后记得打补丁、加固配置、恢复数据时先扫描一遍。

7. 写在最后:我的几点真实体会

处理过几十次挖矿病毒后,我最大的体会是:预防远比清理重要。一台暴露在公网、SSH允许密码登录、Redis没有密码的机器,被入侵只是时间问题。与其等中招后熬夜排查,不如提前花半小时做好加固。

另外,不要迷信杀毒软件。Linux下的杀毒软件(如ClamAV)对挖矿病毒的检出率有限,尤其是经过混淆和加壳的样本。真正靠得住的是:严格的访问控制、及时的补丁更新、完善的监控告警,以及一套清晰的应急响应流程。

最后分享一个小习惯:我会在每台服务器上放一个/root/check.sh脚本,定期检查ld.so.preloadcrontab/tmp目录、异常进程和网络连接。脚本很简单,但能在病毒刚落地时就发现苗头,把损失降到最低。这个脚本后续还可以扩展成定时任务,每天跑一次,结果发到邮箱,相当于给自己加了一层保险。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 1:49:09

PyWxDump 微信数据导出:从解密到聊天记录备份

PyWxDump 微信数据导出&#xff1a;从解密到聊天记录备份 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump PyWxDump 是一个微信数据解密与导出工具&#xff0c;把微信本地加密数据库解密&#xff0c;再导出成你能直接浏览的…

作者头像 李华
网站建设 2026/9/19 1:48:33

智慧校园三维可视化平台:数据集成与三维场景的实战解析

简介&#xff1a;这份项目实施建议文档以天华学院为建设场景&#xff0c;针对高校人、财、物及环境信息动态变化带来的管理复杂问题&#xff0c;系统阐述智慧校园三维可视化管理平台从规划到落地的完整路径。文档覆盖三维虚拟场景制作、重要建筑内部精细建模、二维三维一体化管…

作者头像 李华
网站建设 2026/9/19 1:47:57

YOLOv11轨迹跟踪与热力图:零售客流统计实战

简介&#xff1a;这份PDF文档面向零售行业数据分析人员、计算机视觉初学者及目标检测工程实践者&#xff0c;系统讲解如何用YOLOv11完成客流量统计中的轨迹跟踪与热力图生成。文档共43页&#xff0c;支持目录章节跳转与阅读器左侧大纲快速定位&#xff0c;内容完整、图表清晰&a…

作者头像 李华
网站建设 2026/9/19 1:47:12

DeepSeek-RAG与pgvector:从0到1构建供应链动态优化系统

简介&#xff1a;面对物流供应链的复杂性与不确定性&#xff0c;34页PDF系统讲解DeepSeek-RAG模型如何用于全球供应链动态优化&#xff0c;面向物流从业者、AI算法工程师及希望将大模型落地到业务场景的学习者。内容先梳理物流行业背景与挑战&#xff0c;再介绍RAG原理、DeepSe…

作者头像 李华
网站建设 2026/9/19 1:46:48

模型调用失败?TaoToken 这样改 OpenClaw 的 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华