top 与挖矿定位
top 是 procps-ng 提供的实时进程监控工具,默认每 3 秒刷新一次屏幕。应急排查时用批处理模式 top -b -n 1 抓一份快照落盘,理由是现场常常不能长时间盯着交互界面,而且批处理输出可以直接写进证据文件。挖矿木马的特征非常集中:CPU 长期贴满、进程启动时间很短、进程名仿冒系统组件、命令行里带矿池地址或 -t 线程数参数。
基本信息
| 适用平台 | Linux(procps-ng);macOS 与 BSD 的 top 选项与之不同 |
|---|---|
| 批处理模式 | top -b -n 1:-b 适合重定向,-n 指定采样次数 |
| 排序与间隔 | top -o %CPU 按 CPU 排序;-d 5 改成 5 秒刷新 |
| 单进程查看 | top -p 1234 只盯一个 PID;-H 展开线程 |
| 采样精度 | 第一帧的 %CPU 是进程启动至今的平均值,第二帧起才是本间隔内的实时值 |
| 资源换算 | %CPU 可按多核累加超过 100%,八核机器上显示 800% 代表全部核心跑满 |
典型使用场景
- 云主机 CPU 告警后确认是哪个进程在吃资源,先定位再隔离
- 挖矿处置前抓取一份资源快照,作为处置前后对比的证据
- 判断是业务升级导致的负载上升,还是出现了外来进程
- 确认挖矿进程占用了多少核,评估是否做过线程限制以降低被发现的概率
- 与 ss 输出的矿池连接一起核对,形成完整的资源与网络证据链
抓快照与筛高占用
抓快照与筛高占用
top -b -n 1 -o %CPU | head -n 25 # 抓一份按 CPU 排序的快照
top -b -n 1 -o %CPU | awk 'NR>6 && $9+0>50 {print}' # 只打印 CPU 超过 50% 的行
top -b -n 2 -d 1 -o %CPU | tail -n 30 # 采两帧,看第二帧的实时占用
top -b -n 1 -H -p 1234 | head -n 20 # 展开可疑进程的线程,看是否多线程挖矿
top -b -n 1 -o %CPU > /evidence/top_$(date +%F_%H%M).txt # 落盘留证
uptime; nproc # 负载与核数一起记录,便于换算输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| PID / USER | 进程号与运行账号 | nobody、www 等低权限账号跑着 CPU 密集进程 |
| PR / NI | 优先级与 nice 值 | 被恶意调低优先级以躲避告警,NI 值明显为正 |
| VIRT / RES | 虚拟内存与常驻内存 | RES 只有几十兆却吃满多个核心,符合挖矿程序特征 |
| S | 进程状态 | 长期 R 说明一直在跑,很少进入睡眠 |
| %CPU | CPU 占用百分比 | 稳定贴近 100% 的整数倍,且长时间不波动 |
| TIME+ | 累计占用 CPU 时间 | 数值很大而进程启动时间很近,说明一直在算 |
| COMMAND | 命令名与参数 | 名字是 kworker、crond,但参数里带矿池地址或 -t 线程数 |
负载与核心数要一起看:uptime 的 load average 除以 nproc 才是真正的饱和度。有些挖矿样本会用 --cpu-max-threads-hint 之类参数只吃一半核心,目的是让监控曲线不至于爆表,所以不能只看负载是否打满。
挖矿进程常把名字改成 kworker、crond、java 这类系统名,也常带 watchdog 守护结构:杀掉主进程会被立刻拉起。定位时以资源占用与命令行参数为准,处置时把父子进程一起处理。
定位后的加固动作
定位后的加固动作
ps -p 1234 -o pid,ppid,lstart,cmd # 看启动时间与父进程,判断是谁拉起的
sudo ls -l /proc/1234/exe /proc/1234/cwd # 真实二进制路径与工作目录
sudo ss -antp | grep -w 1234 # 该进程的网络连接,矿池地址即 IOC
sudo cat /proc/1234/environ | tr '\0' '\n' # 环境变量里常见钱包地址与配置
sudo systemctl list-timers --all | head -n 10 # 时间维度上的拉起机制也要一并核对容器场景下 top 看到的是当前命名空间的进程:宿主机要确认容器内是否在挖矿,用 docker stats 看容器级资源,再进容器或用 nsenter 查进程。