CPU异常排查
2026-02-25
故障实例
00
请注意,本文编写于 38 天前,最后修改于 5 天前,其中某些信息可能已经过时。

目录

问题现象
排查过程
步骤1. 常规排查
步骤2. 深挖定时任务
步骤3:技术分析
解决方案
阶段1: 立即停止
阶段2: 彻底清除
阶段3:安全加固(可选)

​ 起因是内部自用的一台低配置 ansible 发布机器在使用时,发现CPU使用率异常,同时htop命令并没有发现异常进程

img

问题现象

  1. 服务器重启后CPU立即占满
  2. htop显示负载极高(Load average:8+)
  3. 实际进程列表所有进程CPU占用极少

关键在于

展开代码
load average: 8.04 7.82 5.40 <- 系统繁忙 %CPU(s):100.0 us <- CPU 100%用户态 但是所有进程的 %CPU 几乎均是 0.0 <- 无进程认领

排查过程

步骤1. 常规排查
展开代码
# 查看CPU占用进程 ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head

img

没有发现高占用CPU的进程,所以这里可以再增加一点发现:ps命令看不到高CPU消耗进程

这里想到了既然这个服务是开机自启的同时ps命令也看不到高消耗进程,那么会不会是封装成了services服务?

展开代码
# 查看系统服务 systemctl list-units --type=service --state=running

刚好还真是

img

展开代码
该服务存在的疑点是: mem-tracker 伪装成内存跟踪工具 描述为"Example systemd service." 这个是未修改的模板描述 这个不是系统自带的服务(机器未增加过自启服务)

验证是否该服务问题

展开代码
top -p $(systemctl show mem-tracker.service --property=MainPID --value)

img

展开代码
# 进程号为8165,尝试kill该进程,观察CPU是否会被释放、 sudo kill 8165

img

杀死该进程后,CPU确实被释放了,不过很快就重新被占满,同时更换了进程号,这里就可以确定是该服务的问题。CPU重新被占满和开机CPU自动被占满的情况相同,应该是通过配置定时任务进行的

img

步骤2. 深挖定时任务
展开代码
crontab -l

img

现在被攻击的路径很清晰

层级持久化机制执行文件
用户 crontab每周五23:00/home/user/dealer
用户 crontab每周五23:00/home/user/.cfg/dealer
root crontab每月执行/home/user/.cfg/dealer
systemd开机自启mem-tracker.service
步骤3:技术分析

为什么top看不到高CPU进程?

  1. 进程快速退出重启:挖矿程序可能设计成间歇运行,躲避监控
  2. 多进程分散消耗:启动多个子进程,每个占用少量CPU
  3. 内核模块隐藏:可能使用rootkit技术隐藏进程
  4. 容器/命名空间隔离:在独立namespace中运行

负载与CPU显示分离的原因:

  • Load average统计的是运行队列长度(包括等待CPU的进程)
  • 恶意程序可能创建大量线程处于R(运行)或D(不可中断睡眠)状态
  • 这些进程在采样间隙退出,导致top看不到

解决方案

阶段1: 立即停止
展开代码
# 1. 停止所有恶意进程 sudo pkill -9 -f "dealer|mem-track|miner" # 2. 停止可疑服务 sudo systemctl stop mem-tracker.service # 3. 验证停止 ps aux | grep -E "dealer|mem-track" | grep -v grep

这里可以看到CPU已经完全被释放

img

阶段2: 彻底清除
展开代码
#!/bin/bash # cleanup_malware.sh - 完整清理脚本 echo "=== 恶意软件清理脚本 ===" # 1. 删除恶意文件 echo "[1/5] 删除恶意文件..." sudo rm -f /home/user/dealer sudo rm -rf /home/user/.cfg/ sudo find /tmp -name "*miner*" -o -name "*dealer*" -exec rm -f {} \; 2>/dev/null # 2. 清理定时任务 echo "[2/5] 清理定时任务..." crontab -r # 清理用户任务 sudo crontab -r # 清理root任务 sudo rm -f /etc/cron.d/*backdoor* 2>/dev/null # 3. 清理systemd服务 echo "[3/5] 清理系统服务..." sudo systemctl stop mem-tracker.service 2>/dev/null sudo systemctl disable mem-tracker.service 2>/dev/null sudo rm -f /etc/systemd/system/mem-tracker.service sudo systemctl daemon-reload # 4. 检查其他隐藏项 echo "[4/5] 检查启动项..." sudo rm -f /etc/rc.local ls -la /etc/init.d/ | grep -E "dealer|miner|track" # 5. 验证清理 echo "[5/5] 验证..." echo "剩余可疑进程:" ps aux | grep -E "dealer|mem-track|miner" | grep -v grep || echo "✓ 无恶意进程" echo "定时任务:" crontab -l 2>/dev/null || echo "✓ 用户任务已清空" sudo crontab -l 2>/dev/null || echo "✓ root任务已清空"

img

执行脚本后,可以根据前面步骤检查是否完整清除

阶段3:安全加固(可选)
展开代码
# 1. 修改所有密码 sudo passwd user sudo passwd root # 2. 审查SSH安全 cat ~/.ssh/authorized_keys # 删除未知密钥 last | head -20 # 查看最近登录 sudo cat /var/log/auth.log | grep "Accepted" | tail -20 # 3. 禁用root远程登录 sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config sudo systemctl restart sshd # 4. 安装防护工具 sudo apt install fail2ban -y sudo systemctl enable fail2ban --now # 5. 设置监控告警 # 创建CPU监控脚本 cat << 'EOF' | sudo tee /usr/local/bin/cpu_monitor.sh #!/bin/bash LOAD=$(cat /proc/loadavg | awk '{print $1}') if (( $(echo "$LOAD > 4" | bc -l) )); then echo "High load alert: $LOAD at $(date)" | logger # 可添加邮件/钉钉告警 fi EOF sudo chmod +x /usr/local/bin/cpu_monitor.sh echo "*/5 * * * * root /usr/local/bin/cpu_monitor.sh" | sudo tee /etc/cron.d/cpu-monitor

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!