关键在于验证进程真实归属而非仅看名称:通过/proc/pid/exe链接、cmdline启动命令、ppid父进程id核对是否匹配官方服务定义,结合systemctl cat检查execstart路径、ss -tunlp比对端口与命令行、lsof分析加载模块,多维度交叉验证伪装行为。

排查伪装成系统服务的恶意进程,关键不是只看进程名是否“像”systemd或sshd,而是验证它是否真的属于该服务——名字可以伪造,行为和归属很难完全掩盖。
核对进程真实身份:从/proc入手
每个运行中的进程在/proc/[PID]下都有唯一目录。即使进程名被改成[kthreadd]或[irq/0],它的/proc/PID/exe链接、/proc/PID/cmdline和/proc/PID/status仍保留真实线索:
- 执行ls -l /proc/[PID]/exe,若显示(deleted)或指向/tmp、/dev/shm等非常规路径,高度可疑
- 用cat /proc/[PID]/cmdline | tr '\0' ' '查看原始启动命令,对比ps输出——若ps显示/usr/bin/sshd但cmdline里是/tmp/.X11-unix/ssh -D 0.0.0.0:1080,就是伪装
- 检查PPid(父进程ID):真正的sshd子进程PPid应为sshd主进程PID;若PPid是1(systemd)或一个不相关的PID(如bash),说明不是由服务管理器正常拉起的
比对服务单元与实际进程
systemd服务有明确的定义来源,不能只信ps aux | grep sshd:
- 查服务定义:systemctl cat sshd,确认ExecStart=路径(如/usr/sbin/sshd -D $SSHD_OPTS)
- 查实际运行进程:pgrep -f "/usr/sbin/sshd",再逐个验证其/proc/PID/exe是否真指向该路径
- 若发现多个“sshd”进程,但只有一个是/usr/sbin/sshd,其余指向/var/tmp/.logd或/lib64/ld-linux-x86-64.so.2加载的动态库,后者极可能为注入或独立恶意进程
检查服务持久化入口是否被篡改
恶意进程常借系统服务之名注册为“合法”服务,绕过常规审查:
- 运行systemctl list-unit-files --type=service | grep enabled,重点关注名称模糊的服务(如update-manager.service、sysmonitor.service、netcheck.service)
- 对可疑服务执行systemctl cat servicename,检查ExecStart=是否调用未知二进制、curl/wget下载执行、或使用LD_PRELOAD加载可疑so文件
- 检查/etc/systemd/system/和/usr/lib/systemd/system/下是否有非官方服务文件,尤其注意修改时间接近入侵时间点的文件
关联网络与文件行为交叉验证
伪装成服务的进程,仍需通信和落盘,这些行为难以隐藏:
- 用ss -tunlp列出所有监听端口及对应PID,再反查该PID的/proc/PID/cmdline——若端口是22但cmdline不含sshd关键字,或PID为空(显示-),大概率被隐藏或劫持
- 检查/proc/PID/root是否被chroot到异常路径(如/tmp/.cache),或/proc/PID/cwd指向临时目录
- 扫描该PID打开的文件:lsof -p [PID] | grep -E "\.(so|bin|sh|py)$",发现加载了/usr/lib/libiacpkmn.so.3这类命名异常的模块,基本可判定为后门











