服务器异常负载排查手册 · 隐蔽进程篇

适用范围

适用于 Linux 3.10+ 生产环境,发现 load 高但用户态 CPU 接近 0 % 的场景。


1. 现场冻结

目标:在 rootkit 干预前保存易失数据。

bash 复制代码
#!/bin/bash
# freeze.sh
TS=$(date +%s)
mkdir -p /srv/ir/${TS}
cd /srv/ir/${TS}

# 1.1 进程树(busybox 静态单文件,绕过 LD_PRELOAD)
curl -sLo bb https://busybox.net/downloads/binaries/1.36.1-x86_64-linux-musl/busybox
chmod +x bb
./bb ps -eo pid,ppid,cmd,pcpu,stat --sort=-pcpu > ps.txt

# 1.2 内核调度器原始视图
cat /proc/sched_debug > sched.txt

# 1.3 打开文件表(含 deleted)
lsof +L1 > lsof_deleted.txt

运行:

bash 复制代码
sudo bash freeze.sh

输出目录 /srv/ir/<timestamp>/ 打包后拉走离线分析。


2. 隐形进程定位

2.1 比对法

python 复制代码
#!/usr/bin/env python3
# hidden_pid.py
import os, re, glob

proc_pids   = {int(p) for p in glob.glob('/proc/[0-9]*')}
sched_pids  = set()
with open('/proc/sched_debug') as f:
    sched_pids = {int(m.group(1)) for m in re.finditer(r'pid\s+:\s+(\d+)', f.read())}

hidden = sched_pids - proc_pids
print("Hidden PIDs:", hidden)

执行:

bash 复制代码
python3 hidden_pid.py

若有输出,则继续 2.2。

2.2 提取样本

bash 复制代码
PID=<hidden_pid>
cp /proc/$PID/exe /srv/ir/${TS}/pid_${PID}.elf
strings /srv/ir/${TS}/pid_${PID}.elf | grep -i 'stratum\|xmrig'

若命中关键字,可定性为挖矿木马。


3. 网络侧交叉验证

使用 eBPF 无需抓完整 PCAP,仅统计外联端口与字节数。

c 复制代码
// conn_count.c  (clang + libbpf)
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __type(key, __u32);   // daddr
    __type(value, __u64); // bytes
    __uint(max_entries, 1024);
} ipv4_tx SEC(".maps");

SEC("tracepoint/syscalls/sys_enter_write")
int trace_write(struct trace_event_raw_sys_enter *ctx) {
    __u32 fd = ctx->args[0];
    struct sock *sk = ...; // 省略 sk 获取逻辑
    if (!sk || sk->__sk_common.skc_family != AF_INET) return 0;

    __u32 daddr = sk->__sk_common.skc_daddr;
    __u64 *bytes = bpf_map_lookup_elem(&ipv4_tx, &daddr);
    __u64 len = ctx->args[2];
    if (bytes) *bytes += len;
    else bpf_map_update_elem(&ipv4_tx, &daddr, &len, BPF_ANY);
    return 0;
}
char LICENSE[] SEC("license") = "GPL";

编译 & 运行:

bash 复制代码
clang -O2 -target bpf -c conn_count.c -o conn_count.o
sudo bpftool prog load conn_count.o /sys/fs/bpf/conn_count
sudo bpftool prog attach tracepoint /sys/kernel/debug/tracing/events/syscalls/sys_enter_write conn_count
sleep 30
sudo bpftool map dump name ipv4_tx

若出现大量流量涌向已知矿池网段,证据链完整。


4. 止血与恢复

步骤 动作 备注
4.1 从旁路接入清洗中心 将 0.0.0.0/0 → TCP/443 流量牵引至第三方高防 Anycast 清洗;源站仅接受清洗中心回源网段
4.2 本地进程 kill kill -9 <hidden_pid> 后立即 echo f > /proc/sysrq-trigger 强制释放已删除文件句柄
4.3 内核完整性校验 apt install debsums && debsums -cs 失败包重新安装
4.4 重启 确认 /var/log/syslogima: error 后单用户模式重启

5. 参考架构

  • 边缘接入层:Anycast + 七层 WAF + Bot 管理
  • 源站侧:仅开放 22/443 回源白名单,SSH 端口改为 922 并通过隧道访问
  • 日志:清洗中心提供 JSON 格式原始日志,直接对接 SIEM,减少自建 ELK 节点数量
相关推荐
梦帮科技26 分钟前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
liuyicenysabel42 分钟前
大模型学习笔记 · 第八篇 · 进阶:偏好对齐与多卡训练
人工智能·笔记·学习
爱勇宝1 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
zt1985q1 小时前
本地部署开源智能家居集成平台 ioBroker 并实现外部访问( Windows 版本)
运维·服务器·智能家居
云和恩墨1 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr
大卡片1 小时前
linux内核驱动开发
linux·运维·驱动开发
微信开发api-视频号协议2 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
甲维斯2 小时前
Fable5:20美金的顶级设计师!
前端·人工智能
kyriewen2 小时前
我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
前端·ai编程·claude
数据库小学妹2 小时前
KES是什么?国产数据库技术架构、核心能力与选型实战解析
数据库·经验分享·架构·国产数据库·数据库选型·信创数据库