Linux 服务器 CPU 占用 50% 排查:sysdig 与 unhide 定位隐藏进程实战 Linux 服务器 CPU 占用 50% 排查sysdig 与 unhide 定位隐藏进程实战当服务器 CPU 占用率异常飙升而top或htop却显示不出对应的高负载进程时这往往意味着系统可能已被入侵或存在恶意进程通过技术手段隐藏了自己的活动。本文将深入探讨如何利用sysdig和unhide这类高级工具层层剥开伪装精准定位那些看不见的进程。1. 常规监控工具的局限性在 Linux 系统中top和htop是最常用的进程监控工具它们通过读取/proc文件系统来收集进程信息。然而这种设计也成为了它们的阿喀琉斯之踵——任何能够操纵/proc显示的恶意程序都能轻易躲过这些工具的监控。典型隐藏手段包括修改进程的/proc/[pid]/exe软链接指向已删除文件利用内核模块劫持系统调用通过LD_PRELOAD注入动态库来劫持readdir等函数伪装成合法的系统服务如 systemd 单元# 使用常规工具可能无法发现异常 top - 14:30:01 up 45 days, 3:22, 2 users, load average: 16.33, 15.82, 14.76 Tasks: 187 total, 1 running, 186 sleeping, 0 stopped, 0 zombie %Cpu(s): 50.0 us, 5.0 sy, 0.0 ni, 45.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 32000.0 total, 1024.0 free, 28000.0 used, 3000.0 buff/cache MiB Swap: 2000.0 total, 500.0 free, 1500.0 used. 3500.0 avail Mem上例显示 CPU 用户态占用达 50%但任务列表中却没有对应的高 CPU 进程这种矛盾正是隐藏进程的典型特征。2. sysdig系统调用层面的深度洞察sysdig是一个开源的系统级诊断工具它通过捕获系统调用和内核事件来提供前所未有的可见性。与基于/proc的传统工具不同sysdig在内核层面运作能绕过大多数用户态的隐藏手段。2.1 安装与基础使用# Ubuntu/Debian sudo apt-get update sudo apt-get install -y sysdig # CentOS/RHEL sudo yum install -y epel-release sudo yum install -y sysdig # 内核模块加载首次运行需要 sudo sysdig-probe-loader核心功能参数参数作用示例-c使用预定义的分析器sysdig -c topprocs_cpu-p自定义输出格式-p%proc.name %proc.pid %thread.cpu-w捕获数据到文件-w trace.scap-r读取捕获文件-r trace.scap2.2 实战排查步骤步骤一识别异常 CPU 消费者sudo sysdig -c topprocs_cpu该命令会按 CPU 使用率排序显示所有进程。如果发现某个进程占用异常高如 3143.28% 表示在 32 核服务器上几乎占满所有核心但其 PID 在top中不可见则可确认是隐藏进程。步骤二追踪进程行为# 查看指定进程的系统调用 sudo sysdig proc.pid异常PID # 监控文件操作 sudo sysdig -A -c echo_fds proc.pid异常PID # 检查网络连接 sudo sysdig -c fdcount_by proc.name tcp and proc.pid异常PID步骤三分析进程关系树sudo sysdig -p%proc.pname %proc.name %proc.pid %proc.ppid | grep 异常PID这能揭示恶意进程的父进程和子进程帮助发现完整的攻击链。3. unhide专业级的进程反隐藏工具unhide是一个专门设计用来检测通过 rootkit 或其它技术隐藏的进程的工具。它通过多种技术交叉验证进程是否存在包括比较/proc与ps输出检查进程调度信息分析内核任务列表3.1 安装与基本扫描# 安装 sudo apt-get install unhide # Debian/Ubuntu sudo yum install unhide # RHEL/CentOS # 快速扫描 sudo unhide proc如果发现隐藏进程输出会显示类似Found HIDDEN PID: 3157 Found HIDDEN PID: 31583.2 高级检测技术# 全面检测包括TCP/UDP端口 sudo unhide-tcp # 强制使用特定检测方法 sudo unhide brute [PID] # 检查系统调用劫持 sudo unhide sys关键参数说明参数功能proc检查进程隐藏sys检测系统调用劫持brute暴力枚举所有可能的PIDreverse反向检查从PID找进程quick快速模式可能漏检4. 恶意进程的常见伪装模式通过分析数百个案例我们发现恶意进程最常使用以下伪装技术1. systemd 服务伪装# 检查异常服务特征 systemctl list-units --typeservice --all | grep -E [0-9]{8} # 典型异常特征 # - 服务名含随机数字如yayaya91556176.service # - 设置为自动重启auto-restart # - 二进制路径异常2. 内核模块注入# 检查加载的模块 lsmod # 验证模块签名 for module in $(lsmod | awk NR1 {print $1}); do modinfo $module | grep -E signer|sig_key done3. 文件系统层隐藏# 检查/proc下异常项 ls -la /proc/[异常PID]/exe # 典型异常 lrwxrwxrwx 1 root root 0 Jul 1 12:00 /proc/2036/exe - /1783629e (deleted)5. 根治措施彻底清除隐藏进程单纯杀死进程往往治标不治本高级恶意软件通常具备持久化机制。建议按照以下流程操作步骤一取证分析# 保存进程内存映像 sudo gcore -o malcore [异常PID] # 转储进程映射 sudo cat /proc/[异常PID]/maps proc_maps.txt # 收集所有打开的文件描述符 sudo ls -la /proc/[异常PID]/fd fd_list.txt步骤二清除恶意实体# 停止并禁用服务 sudo systemctl stop [恶意服务名] sudo systemctl disable [恶意服务名] # 删除服务文件 sudo rm /lib/systemd/system/[恶意服务名] # 杀死进程树 sudo pkill -9 -P [异常PID] sudo kill -9 [异常PID] # 删除关联文件 sudo find / -name *[恶意模式]* -exec rm -fv {} \;步骤三系统加固# 检查关键配置文件 sudo grep -r fs.file-max /etc/ # 更新所有软件包 sudo apt update sudo apt upgrade -y # Debian/Ubuntu sudo yum update -y # RHEL/CentOS # 安装入侵检测系统 sudo apt install aide -y sudo aideinit sudo aide.wrapper --check6. 防御体系建设预防胜于治疗建议建立以下防御机制1. 实时监控方案# 使用sysdig持续监控 sudo sysdig -w monitor.scap -s 4096 proc.name!sysdig # 告警规则示例 sudo sysdig -r monitor.scap \ -c topscores \ evt.typeexecve and proc.name!apt and proc.name!yum2. 基线检查脚本#!/bin/bash # 检查异常CPU使用 ABNORMAL$(sysdig -c topprocs_cpu --reverse | awk $130 {print $2}) for PID in $ABNORMAL; do if ! ps -p $PID /dev/null; then echo [ALERT] Hidden process detected: PID $PID unhide proc $PID fi done # 检查异常内核模块 lsmod | awk NR1 {print $1} /tmp/current_modules diff /tmp/known_good_modules /tmp/current_modules3. 关键文件完整性监控# 监控/proc变化 sudo auditctl -w /proc -p wa -k proc_monitor # 检查审计日志 sudo ausearch -k proc_monitor | aureport -f -i在实际运维中我们曾遇到一个巧妙伪装的挖矿病毒它通过修改sysctl.conf仅保留fs.file-max 2097152这样的异常配置注意双等号并伪装成kworker进程。通过sysdig的容器感知功能最终发现其实际运行在非常规的容器环境中。这提醒我们在高级威胁面前需要多工具协同分析才能揭开层层伪装。