阿里云服务器CPU爆满?手把手教你排查并清除Linux挖矿病毒(附pamdicks专杀方案)
阿里云服务器CPU异常飙升:从现象到根除的深度安全实战
最近在线上巡检时,发现几台部署在阿里云上的应用服务器,CPU使用率毫无征兆地冲到了95%以上,但通过top命令查看,用户进程列表却“风平浪静”,没有哪个进程表现出异常的消耗。这种“看不见的敌人”往往比明面上的故障更棘手,它通常意味着系统内核层面或进程被巧妙地隐藏了。对于运维工程师和开发者而言,这不仅是性能问题,更是一次严峻的安全警报。本文将从一个真实的应急响应案例出发,为你拆解Linux服务器CPU被恶意程序(如挖矿病毒)占用的完整排查、分析与根除流程,不仅提供操作命令,更深入背后的原理,让你不仅能解决问题,更能理解问题,构建起主动防御的思维。
1. 初步诊断:当top命令“失灵”时
CPU使用率异常高,但top或htop显示不出具体是哪个进程在“作祟”,这是此类安全事件最典型的特征。新手可能会怀疑是监控工具出了问题,但经验告诉我们,这恰恰是恶意软件为了持久化生存而采取的常见隐匿手段。
1.1 超越top:多维度系统负载观察
首先,我们需要从多个角度确认CPU负载的真实来源,排除系统级或硬件层面的误判。
-
使用
mpstat查看每个CPU核心的详细情况:mpstat -P ALL 1 5这条命令会每隔1秒采样一次,共采样5次,并显示所有CPU核心(
ALL)的使用率细分(用户态%usr、系统态%sys、空闲%idle等)。如果发现%sys(系统内核态)占用异常高,而用户进程却很低,这强烈暗示有内核模块或通过rootkit隐藏的进程在活动。 -
检查系统负载平均值:
uptime查看
load average的三个数值(1分钟、5分钟、15分钟平均负载)。如果它们持续远高于CPU核心数(例如,4核CPU负载长期在10以上),且top中无对应高CPU进程,基本可以断定存在隐藏进程。 -
利用
dstat进行综合性能监控:dstat -c --top-cpudstat是一个强大的多功能统计工具。-c显示CPU状态,--top-cpu则会动态显示当前占用CPU最高的进程。有时它能捕获到被简单隐藏的进程。
注意:在怀疑系统被入侵时,一个重要的原则是尽量使用静态编译的、可信的工具,或者从其他干净机器拷贝
busybox等工具来使用。因为系统自带的top、ps等命令可能已被恶意软件替换或通过环境变量劫持。
1.2 探查进程隐藏的常见手法
恶意软件隐藏进程的技术多种多样,了解其原理有助于我们找到排查的突破口。
手法一:动态链接库预加载(LD_PRELOAD)
这是非常经典的一种用户态rootkit技术。通过篡改/etc/ld.so.preload文件或设置LD_PRELOAD环境变量,恶意软件可以强制系统在加载任何程序之前,先加载其恶意的共享库(.so文件)。这个库可以挂钩(Hook)像readdir这样的系统库函数,当top、ps、ls等命令读取/proc目录查询进程列表时,恶意库会过滤掉病毒进程的信息,从而实现“隐身”。
检查方法非常简单:
cat /etc/ld.so.preload
如果这个文件存在且内容包含非标准的.so库路径(如/usr/local/lib/libprocesshider.so或一些随机字符串名称的文件),那几乎就是铁证。
手法二:直接篡改/proc文件系统
/proc是一个虚拟文件系统,提供了访问内核内部数据结构的接口。进程信息就存放在这里。更底层的rootkit可能会直接以内核模块的形式,劫持对/proc文件系统的读操作,在返回结果中动态删除自身进程的信息。对付这种手法,需要更底层的检查方式。
2. 深入排查与病毒定位
一旦确认存在隐藏进程,接下来的目标就是把它揪出来,并找到其所有相关文件。
2.1 清除LD_PRELOAD干扰
如果发现/etc/ld.so.preload文件被篡改,第一步就是清除它,让我们常用的工具“重见光明”。
-
备份并清空预加载文件:
# 备份原文件(用于后续分析) cp /etc/ld.so.preload /tmp/ld.so.preload.backup # 清空该文件 > /etc/ld.so.preload # 或者直接删除 rm -f /etc/ld.so.preload -
检查并删除恶意的.so文件: 根据
cat /etc/ld.so.preload输出的路径,找到那些恶意的共享库文件并删除。它们通常有伪装名,如libselinux.so、libaudit.so等,但存放在非标准路径下。# 例如,发现文件在 /usr/local/lib/libkg.so rm -f /usr/local/lib/libkg.so # 使用 find 命令搜索近期变化的可疑.so文件 find /usr/lib /usr/local/lib /lib -name "*.so" -mtime -5 2>/dev/null | head -20 -
恢复工具视野: 清空
ld.so.preload后,立即开启一个新的SSH会话,或者在当前会话中执行unset LD_PRELOAD,然后再次运行top或ps auxf。此时,之前隐藏的高CPU进程很可能会立刻现身。记下它的PID(进程ID)。
2.2 定位病毒进程与源文件
找到PID后,我们需要顺藤摸瓜,找到病毒的执行文件路径,以便彻底清除。
-
查看进程的可执行文件路径:
ls -l /proc/<PID>/exe例如,
ls -l /proc/12345/exe通常会显示一个符号链接,指向磁盘上的实际可执行文件。这就是病毒的“本体”。 -
查看进程的工作目录和打开的文件:
# 查看进程当前工作目录 ls -l /proc/<PID>/cwd # 查看进程打开的所有文件描述符 lsof -p <PID>这些信息能帮助你发现病毒下载的配置文件、日志文件或其他组件。
-
终止病毒进程: 在记录下所有必要信息后,使用
kill -9 <PID>终止该进程。如果病毒有守护进程或子进程,可能需要一并杀死。可以使用pstree -p <PID>查看进程树。
3. 应对顽固病毒:以pamdicks为例的专项清理
在某些更复杂的感染案例中,清除ld.so.preload并杀死进程后,病毒可能会通过定时任务、系统服务或其他守护进程快速复活。pamdicks就是一类这样的顽固挖矿病毒变种。
3.1 pamdicks病毒的行为与残留
pamdicks不仅仅是一个进程,它往往是一个包含下列组件的“套装”:
- 主二进制程序:通常位于
/usr/bin/pamdicks、/tmp/或/var/tmp/下的随机名称文件。 - 守护脚本:通过
cron定时任务或systemd服务确保病毒被杀死后能重新启动。 - 配置文件与下载脚本:用于从远程C&C服务器获取更新或新的挖矿程序。
- 内核级隐藏:更高级的变种可能加载内核模块。
3.2 完整的清除步骤
假设我们通过whereis或find命令找到了名为pamdicks的可疑文件。
步骤一:清理病毒二进制文件与相关进程
# 1. 定位病毒文件
whereis pamdicks
# 或使用更全面的查找
find / -name "*pamdicks*" 2>/dev/null
find /tmp /var/tmp -type f -executable -mtime -2 2>/dev/null
# 2. 停止相关进程
pkill -f pamdicks
# 检查是否还有残留进程
ps aux | grep -i pamdicks
# 3. 删除病毒文件(如果可以直接删除)
rm -f /usr/bin/pamdicks /tmp/.X11-unix/pamdicks # 根据实际找到的路径删除
步骤二:检查并清理持久化机制 这是防止病毒“死灰复燃”的关键。
-
检查定时任务:
crontab -l # 查看当前用户的cron cat /etc/crontab # 查看系统cron ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ # 查看cron目录寻找包含
curl、wget下载命令或执行pamdicks、/tmp/下可疑文件的条目,并删除。 -
检查系统服务:
systemctl list-unit-files --type=service | grep -i enabled # 查看是否有可疑服务 ls -la /etc/systemd/system/ | grep -v \.wants # 重点查看multi-user.target.wants等目录下的链接如果发现可疑服务(名称可能伪装成
nginx、redis等),使用systemctl stop <service-name>停止,systemctl disable <service-name>禁用,然后删除其服务文件。 -
检查用户启动项:
cat ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null | grep -E "(curl|wget|pamdicks|/tmp/)" ls -la /etc/profile.d/
步骤三:处理无法删除的文件与chattr锁
有时,病毒会使用chattr +i命令给自身文件加上“不可修改”的锁定属性,导致rm命令失败。
# 尝试删除时提示"Operation not permitted"
rm -f /usr/bin/pamdicks
# 1. 检查文件属性
lsattr /usr/bin/pamdicks
# 如果输出包含'i'(immutable)或'a'(append-only),说明文件被锁定。
# 2. 移除锁定属性
chattr -i /usr/bin/pamdicks
# 如果chattr命令本身也被删除或破坏,需要从干净系统恢复或使用备用方案。
# 3. 再次删除文件
rm -f /usr/bin/pamdicks
步骤四:chattr命令被破坏的恢复方案
在极端情况下,病毒可能删除了/usr/bin/chattr,或者将其替换为恶意版本。
-
从包管理器重新安装:
# 对于CentOS/RHEL/Alibaba Cloud Linux yum reinstall -y e2fsprogs # 对于Ubuntu/Debian apt-get install --reinstall -y e2fsprogs -
从其他干净机器拷贝: 如果网络或仓库不可用,可以从同一发行版版本的干净服务器上,将
chattr静态二进制文件(使用which chattr找到路径)通过scp拷贝过来。# 在干净机器上 scp /usr/bin/chattr root@被感染服务器IP:/tmp/ # 在被感染机器上 mv /tmp/chattr /usr/bin/chattr && chmod 755 /usr/bin/chattr -
使用
debugfs工具(高级):debugfs是文件系统调试工具,可以直接在磁盘上操作inode,绕过文件属性限制。此操作风险极高,需谨慎。# 找到文件的inode号 ls -i /usr/bin/pamdicks # 假设inode是123456 debugfs -w /dev/your_disk_partition # 例如/dev/vda1 debugfs: clri <123456> debugfs: quit完成后,文件在磁盘上的数据块标记为未使用,但目录项还在,可以用
rm强制删除。
步骤五:创建“诱饵”文件并锁定(可选) 为了防止病毒脚本尝试重新创建同名文件,可以在删除后创建一个空的同名文件并加锁。
touch /usr/bin/pamdicks
chattr +i /usr/bin/pamdicks
这样,任何尝试写入或修改此文件的操作都会失败。但这只是一种辅助手段,核心还是清理掉所有的执行入口和持久化配置。
4. 事后加固与安全建议
清除病毒后,服务器仍然处于脆弱状态,必须进行加固,防止再次被入侵。
4.1 漏洞溯源与修复
绝大多数入侵都是通过漏洞实现的。你需要检查:
- SSH弱密码:检查
/var/log/secure或/var/log/auth.log,看是否有大量的暴力破解尝试。立即禁用密码登录,改用SSH密钥认证。 - 未授权访问的服务:检查Redis、Docker API、Elasticsearch、MongoDB等是否暴露在公网且无认证。
- 有漏洞的应用:检查Web应用(如WordPress、Confluence、Jenkins)是否使用了存在已知漏洞的旧版本插件或框架。
- 云服务器安全组规则:检查阿里云安全组,确保只开放必要的端口(如80, 443, 22),并且对SSH端口(22)尽量限制来源IP。
4.2 系统级安全加固措施
| 加固项 | 具体操作与命令示例 | 目的与说明 |
|---|---|---|
| 定期更新 | yum update -y 或 apt update && apt upgrade -y | 及时修补系统与软件安全漏洞。 |
| 最小化安装 | 安装系统时选择“Minimal Install”,仅安装必需软件包。 | 减少攻击面。 |
| 配置防火墙 | 使用firewalld或iptables,仅允许必要的入站流量。 | 阻止对非公开服务的扫描与访问。 |
| 安装入侵检测 | 安装配置fail2ban,自动封禁暴力破解IP。 | 提升对自动化攻击的防御能力。 |
| 文件完整性监控 | 使用AIDE或Tripwire建立关键文件(如/bin、/usr/bin、/etc)的哈希数据库,定期检查。 | 及时发现文件篡改。 |
| 限制权限 | 遵循最小权限原则,为非root用户分配必要权限,使用sudo。 | 即使某个服务被攻破,也能限制影响范围。 |
| 监控与告警 | 配置阿里云云监控,对CPU、内存、网络流量设置异常告警阈值。 | 实现异常情况的早期发现。 |
4.3 建立应急响应清单
经历一次安全事件后,最好能总结形成自己的应急响应清单(Checklist),下次可以更高效地处理。
- 确认现象:监控告警 -> 登录服务器,用
top,mpstat,dstat多工具验证。 - 初步分析:检查
/etc/ld.so.preload,LD_PRELOAD环境变量,使用静态编译的busybox top/ps。 - 清除干扰:删除恶意
.so文件,清空ld.so.preload。 - 定位进程:使用
top找到高CPU进程PID,通过/proc/<PID>/exe和lsof定位文件。 - 清理进程与文件:
kill进程,rm文件。 - 清除持久化:全面检查
cron,systemd service, 用户启动脚本。 - 处理顽固文件:使用
lsattr/chattr或恢复chattr命令。 - 漏洞修复:检查日志,修复弱密码、未授权访问等入口点。
- 系统加固:更新系统,配置防火墙,考虑安装HIDS(主机入侵检测系统)。
- 复盘记录:记录时间线、攻击路径、采取的措施,更新安全策略。
那次处理完阿里云上的挖矿病毒后,我花了半天时间梳理了所有被修改和访问过的文件,最终发现入侵源头是一个内部测试用的Redis实例,因为疏忽被配置为0.0.0.0绑定且没有设置密码,在公网被扫描器秒破。自那以后,所有新上线的服务器,第一件事就是检查安全组和默认密码,这份清单也成了团队内部必须通过的检查项。安全运维没有一劳永逸,真正的平静来自于对潜在风险持续不断的审视和加固。
更多推荐


所有评论(0)