资讯动态

Linux挖矿木马入侵排查与清除:ld.so.preload、chattr、pamdicks实战

发布时间:2026/9/19 1:59:35 来源:尧图企业网站定制
1. 从CPU飙红到进程消失一次典型的挖矿入侵现场凌晨两点收到告警一台对外提供测试服务的Linux机器CPU连续半小时跑满登录上去top一看一个叫kdevtmpfsi的进程占了400%的核kill -9干掉之后不到十秒又冒出来换个名字继续跑。这种杀不死的进程基本可以断定机器已经被挖矿木马拿下了而且对方做了持久化和守护机制。挖矿病毒在Linux上的入侵路径其实就那么几条SSH弱口令爆破、Redis未授权访问、Web应用漏洞比如某些中间件的反序列化、以及容器逃逸。攻击者进来之后干的事情也很套路化——下载挖矿程序、写入定时任务、植入动态链接库预加载、修改文件属性防止删除、清理系统日志。整套动作下来一台机器就变成了别人的免费矿机。这篇内容面向的是需要独立处理这类安全事件的运维和开发人员。我会把整个排查链路拆开讲从发现异常到定位入口从清除恶意文件到根治持久化机制最后给出加固方案。中间会涉及ld.so.preload、chattr、pamdicks这几个关键词对应的具体操作这些都是实战中绕不开的环节。如果你手上正好有一台疑似被挖矿的机器可以跟着这个思路一步步来。需要提前说明的是处理这类事件最忌讳的就是看到进程就杀。挖矿木马往往有多个守护进程互相拉起还有定时任务、动态库劫持、内核模块等多种持久化手段只杀主进程等于没处理。正确的做法是先做信息收集把所有的恶意痕迹都摸清楚再统一清除。2. 入侵痕迹的完整排查链路2.1 先看资源占用锁定可疑进程排查的第一步永远是看资源。挖矿程序最明显的特征就是CPU占用异常但有些老练的攻击者会限制挖矿进程的CPU使用率比如控制在60%左右避免触发告警。所以不能只看top还要结合其他维度。# 按CPU排序查看进程 top -c -o %CPU # 查看所有进程的完整命令行 ps auxf # 查看进程的启动时间和父进程 ps -eo pid,ppid,lstart,cmd --sortstart_time重点看几个东西进程的可执行文件路径是否在/tmp、/dev/shm、/var/tmp这些临时目录下进程名是否伪装成系统进程比如kworker、systemd后面带随机字符父进程是否已经不存在说明是被拉起后父进程退出了。我遇到过一种情况攻击者把挖矿程序命名为[kworker/0:1]前面加个方括号伪装成内核线程。但内核线程的PPID是2而它的PPID是1这就是破绽。用ps -eo pid,ppid,cmd | grep kworker对比一下就能看出来。2.2 检查网络连接找到外联地址挖矿程序必然要连接矿池所以网络连接是重要的排查点。# 查看所有网络连接 ss -antp # 查看ESTABLISHED状态的连接 netstat -antp | grep ESTABLISHED # 查看DNS解析记录 cat /etc/resolv.conf矿池地址通常是域名形式端口多为3333、4444、5555、7777、8888、9999这类。如果看到某个进程持续连接一个陌生IP的非常规端口基本可以确认。另外注意检查/etc/hosts是否被篡改有些挖矿木马会把矿池域名直接写进hosts文件做硬编码解析。2.3 排查定时任务和启动项持久化的第一层通常是定时任务。攻击者会在crontab里写入定时拉取脚本即使主进程被杀了也会重新下载。# 查看当前用户的定时任务 crontab -l # 查看所有用户的定时任务 for user in $(cut -f1 -d: /etc/passwd); do crontab -l -u $user 2/dev/null; done # 查看系统级定时任务 ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/ /etc/cron.monthly/ cat /etc/crontab # 查看systemd定时器 systemctl list-timers --all除了crontab还要检查/etc/rc.local、/etc/init.d/、~/.bashrc、~/.bash_profile、/etc/profile.d/这些启动脚本。有些木马会把自己的启动命令追加到这些文件末尾。2.4 检查SSH后门和用户账号攻击者通常会留一个后门账号或者修改SSH配置方便下次进来。# 查看所有可登录用户 cat /etc/passwd | grep -E bash|sh$ # 查看UID为0的用户除了root awk -F: $30 {print $1} /etc/passwd # 查看SSH授权密钥 cat /root/.ssh/authorized_keys cat /home/*/.ssh/authorized_keys # 查看SSH配置是否被修改 cat /etc/ssh/sshd_config | grep -v ^# | grep -v ^$ # 查看最近登录记录 last -n 50 lastb -n 50重点看authorized_keys里有没有陌生的公钥/etc/passwd里有没有UID为0的非root用户sshd_config里PermitRootLogin和PasswordAuthentication是否被改成了允许密码登录。2.5 检查文件系统异常挖矿木马会在文件系统里留下大量痕迹包括恶意二进制、脚本、配置文件等。# 查找最近修改的文件 find / -mtime -3 -type f 2/dev/null | grep -v -E ^/(proc|sys|dev|run) | head -50 # 查找临时目录下的可执行文件 find /tmp /var/tmp /dev/shm -type f -executable 2/dev/null # 查找隐藏文件 find / -name .* -type f -mtime -7 2/dev/null | grep -v -E ^/(proc|sys|dev|run|home|root/\.) # 检查SUID文件 find / -perm -4000 -type f 2/dev/null这里要特别注意/dev/shm目录这是共享内存目录很多挖矿木马喜欢把程序放在这里因为不容易被常规的磁盘检查发现。3. ld.so.preload劫持最隐蔽的持久化手段3.1 动态链接库预加载的工作原理/etc/ld.so.preload这个文件是Linux动态链接器的一个配置里面列出的共享库会在所有程序启动时被优先加载。这个机制本来是给系统管理员做性能监控或者调试用的但被挖矿木马利用之后就成了最隐蔽的持久化手段之一。它的工作原理是这样的当任何程序启动时动态链接器ld.so会先读取/etc/ld.so.preload把里面指定的.so文件加载到进程空间。攻击者编译一个恶意的.so在里面hook掉readdir、open、read等系统调用就能实现文件隐藏、进程隐藏、网络连接隐藏。你ls看不到恶意文件ps看不到恶意进程netstat看不到矿池连接但挖矿程序在后台跑得好好的。3.2 如何确认是否被ld.so.preload劫持检查方法很简单直接看这个文件是否存在以及内容是什么# 检查ld.so.preload文件 cat /etc/ld.so.preload # 如果文件存在且指向某个.so查看该文件 ls -la /path/to/suspicious.so file /path/to/suspicious.so strings /path/to/suspicious.so | head -50正常情况下这个文件不应该存在或者内容为空。如果里面有指向/lib、/usr/lib之外的.so文件基本可以确认被劫持了。但要注意有些高级木马会hook掉open系统调用让你cat /etc/ld.so.preload的时候返回空内容。这时候可以用strace来验证# 用strace跟踪ls命令的系统调用 strace -e openat ls /etc/ 21 | grep preload # 或者用静态编译的工具查看 busybox cat /etc/ld.so.preload如果strace显示openat(/etc/ld.so.preload)返回了文件描述符但cat出来是空的那说明read被hook了。3.3 清除ld.so.preload劫持的正确姿势清除这个劫持不能直接rm /etc/ld.so.preload因为文件可能被加了不可变属性后面会讲chattr而且直接删除可能导致系统命令无法执行如果恶意.so被其他程序依赖的话。正确的步骤是# 第一步先清空文件内容而不是直接删除 echo /etc/ld.so.preload # 如果提示Operation not permitted说明文件被加了不可变属性 lsattr /etc/ld.so.preload # 第二步去掉不可变属性 chattr -i /etc/ld.so.preload # 第三步再次清空 echo /etc/ld.so.preload # 第四步删除恶意.so文件 rm -f /path/to/malicious.so # 第五步验证 cat /etc/ld.so.preload这里有个坑如果你先删了恶意.so文件但/etc/ld.so.preload还指向它那么所有新启动的程序都会因为找不到这个库而报错严重的话会导致系统无法登录。所以顺序一定是先清空preload文件再删.so。注意操作ld.so.preload的时候最好保持一个已经登录的SSH会话不要断开同时新开一个会话测试能否正常登录。如果新会话登录失败可以在旧会话里恢复。4. chattr文件属性为什么恶意文件删不掉4.1 chattr的i属性和a属性chattr是Linux下用来修改文件系统属性的命令其中两个属性最常被挖矿木马利用i属性immutable文件不能被修改、删除、重命名不能创建硬链接不能写入数据。a属性append only文件只能追加内容不能删除或覆盖。攻击者会对恶意二进制、配置文件、定时任务脚本加上i属性这样你用rm删除的时候会提示Operation not permitted用chmod改权限也会失败。# 查看文件属性 lsattr /path/to/file # 输出示例----i--------e-- /path/to/file # 其中i表示immutablee表示extent格式4.2 批量排查被加属性的文件被加i属性的文件通常集中在几个位置/etc/、/usr/bin/、/usr/local/bin/、/tmp/、/var/spool/cron/。可以用lsattr递归查看# 递归查看/etc目录下所有文件的属性 lsattr -R /etc/ 2/dev/null | grep -E ^----i # 查看常见恶意文件位置的属性 lsattr /etc/ld.so.preload /etc/crontab /etc/cron.d/* 2/dev/null # 查看定时任务目录 lsattr -R /var/spool/cron/ 2/dev/null4.3 去除属性并清除文件找到被加属性的文件后先去掉属性再删除# 去掉i属性 chattr -i /path/to/file # 去掉a属性 chattr -a /path/to/file # 同时去掉多个属性 chattr -ia /path/to/file # 然后删除 rm -f /path/to/file如果chattr -i也提示Operation not permitted那说明可能被ld.so.preload劫持了需要先处理劫持问题。还有一种可能是文件系统本身的问题比如文件系统以只读方式挂载可以用mount | grep ro检查。实操心得处理被加i属性的文件时建议先记录下文件的路径和属性全部处理完之后再统一验证一遍。有些木马会在多个位置放置互相守护的文件漏掉一个就可能死灰复燃。5. pamdicks后门账号认证层的隐蔽植入5.1 pamdicks是什么pamdicks是近年来出现的一种针对Linux PAMPluggable Authentication Modules的后门工具。PAM是Linux下负责认证的模块化框架pamdicks通过替换或修改PAM模块实现万能密码登录、记录所有登录密码等功能。它的典型特征是替换/usr/lib/x86_64-linux-gnu/security/pam_unix.so或者添加一个恶意的PAM模块然后在/etc/pam.d/下的配置文件中引用。这样攻击者可以用一个预设的万能密码登录任何账号而不需要知道真实密码。5.2 检测pamdicks后门检测方法主要是对比PAM模块的完整性# 查看PAM模块目录 ls -la /usr/lib/x86_64-linux-gnu/security/ 2/dev/null ls -la /lib/security/ 2/dev/null ls -la /usr/lib/security/ 2/dev/null # 查看PAM配置文件 cat /etc/pam.d/sshd cat /etc/pam.d/login cat /etc/pam.d/common-auth # 对比PAM模块的修改时间 find /usr/lib/x86_64-linux-gnu/security/ -name *.so -mtime -30 2/dev/null重点看pam_unix.so的修改时间是否异常以及/etc/pam.d/下是否有陌生的模块引用。如果系统有备份可以用md5sum对比PAM模块的哈希值。# 计算PAM模块的哈希 md5sum /usr/lib/x86_64-linux-gnu/security/pam_unix.so # 与正常系统的哈希对比如果有其他同版本机器5.3 清除PAM后门清除PAM后门需要从正常的系统或者软件包中恢复PAM模块# 方法一重新安装PAM包 # Debian/Ubuntu apt-get install --reinstall libpam-modules libpam-runtime # CentOS/RHEL yum reinstall pam # 方法二从备份恢复 cp /backup/pam_unix.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so # 恢复后验证PAM配置 cat /etc/pam.d/sshd恢复之后一定要测试登录确保认证功能正常。建议在操作之前保留一个已登录的会话防止恢复失败导致无法登录。6. 挖矿程序的清除与系统恢复6.1 清除顺序很重要前面几节分别讲了各种持久化手段的排查和清除但在实际操作中清除顺序直接影响处理效果。我总结的顺序是先处理ld.so.preload劫持让系统命令恢复正常再处理chattr属性让文件可以被删除然后清除定时任务和启动项接着杀掉挖矿进程并删除恶意文件最后处理PAM后门和SSH后门这个顺序的逻辑是先解除看不见的问题劫持再解除删不掉的问题属性然后切断自动拉起的机制定时任务最后清除主体和入口。6.2 批量清除脚本下面是一个实战中常用的清除脚本框架可以根据实际情况调整#!/bin/bash # 挖矿木马清除脚本框架 # 1. 清除ld.so.preload if [ -f /etc/ld.so.preload ]; then chattr -i /etc/ld.so.preload 2/dev/null echo /etc/ld.so.preload echo [] ld.so.preload cleared fi # 2. 清除恶意定时任务 crontab -l 2/dev/null | grep -v -E kdevtmpfsi|kinsing|/tmp/|/dev/shm/ | crontab - rm -f /etc/cron.d/kinsing /etc/cron.d/kdevtmpfsi 2/dev/null # 3. 杀掉恶意进程 for proc in kdevtmpfsi kinsing xmrig minerd; do pkill -9 -f $proc 2/dev/null done # 4. 删除恶意文件 rm -rf /tmp/kdevtmpfsi /tmp/kinsing /dev/shm/kdevtmpfsi /var/tmp/kinsing 2/dev/null # 5. 查找并删除其他可疑文件 find /tmp /var/tmp /dev/shm -type f -executable -mtime -7 -delete 2/dev/null echo [] Cleanup completed注意这个脚本只是框架实际使用前一定要先做信息收集确认恶意文件的具体路径和名称。直接跑通用脚本可能会漏掉变种也可能误删正常文件。6.3 清除后的验证清除完成之后需要从多个维度验证是否清理干净# 验证1CPU占用是否恢复正常 top -bn1 | head -20 # 验证2是否还有可疑进程 ps auxf | grep -E tmp|shm|kinsing|kdevtmpfsi # 验证3是否还有可疑网络连接 ss -antp | grep ESTABLISHED # 验证4定时任务是否干净 crontab -l ls -la /etc/cron.d/ # 验证5ld.so.preload是否为空 cat /etc/ld.so.preload # 验证6PAM模块是否正常 ls -la /usr/lib/x86_64-linux-gnu/security/pam_unix.so建议观察至少24小时确认没有反复。如果条件允许最好把机器重装因为挖矿木马往往伴随其他后门彻底清理的难度很大。7. 入侵入口的封堵与系统加固7.1 找到入侵入口清除完恶意文件只是治标找到入侵入口才是治本。常见的入口排查方法# 查看SSH登录日志 grep Accepted /var/log/auth.log | tail -50 grep Failed /var/log/auth.log | tail -50 # 查看Redis日志如果开了Redis cat /var/log/redis/redis-server.log | grep -i CONFIG SET # 查看Web访问日志中的异常请求 grep -E POST|GET /var/log/nginx/access.log | grep -E \.sh|\.py|/tmp/|wget|curl | tail -50 # 查看命令历史 cat /root/.bash_history cat /home/*/.bash_history如果auth.log里有大量来自同一IP的Failed password然后突然出现一条Accepted那基本就是SSH爆破成功了。如果Redis日志里有CONFIG SET dir和CONFIG SET dbfilename那是Redis未授权访问被利用的典型特征。7.2 SSH加固SSH是最常见的入口加固措施包括# /etc/ssh/sshd_config 关键配置 PermitRootLogin no # 禁止root直接登录 PasswordAuthentication no # 禁用密码登录只用密钥 PubkeyAuthentication yes # 启用密钥认证 MaxAuthTries 3 # 最大认证尝试次数 ClientAliveInterval 300 # 客户端存活检测 ClientAliveCountMax 2 # 最大检测次数 AllowUsers deploy # 只允许特定用户登录改完之后重启SSH服务systemctl restart sshd注意改SSH配置之前一定要确认密钥登录已经配置好并且保持一个已登录的会话不要断开。改完先新开一个会话测试确认能登录再关闭旧会话。7.3 其他服务的加固Redis# redis.conf 关键配置 bind 127.0.0.1 # 只监听本地 protected-mode yes # 开启保护模式 requirepass StrongPasswordHere # 设置强密码 rename-command CONFIG # 禁用CONFIG命令 rename-command FLUSHALL # 禁用FLUSHALL命令数据库和中间件同理核心原则是不对外暴露、设置强密码、禁用危险命令、最小权限运行。7.4 系统层面的加固# 1. 开启防火墙只放行必要端口 firewall-cmd --permanent --add-port22/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload # 2. 安装入侵检测工具 # 文件完整性检查 apt-get install aide aideinit # 3. 配置日志集中收集 # 将auth.log、secure等日志实时发送到日志服务器 # 4. 定期检查系统关键文件 # 可以用rpm -Va或debsums检查包完整性 rpm -Va debsums -c8. 几个容易踩坑的细节和实操建议8.1 不要直接删除ld.so.preload文件很多人看到/etc/ld.so.preload里有恶意路径第一反应是rm掉这个文件。但如果恶意.so还在而且被其他正常程序依赖有些木马会hook常用库删除preload文件后可能导致系统命令全部报错。正确的做法是先清空内容再删.so最后再决定是否删除preload文件本身。8.2 chattr -i也删不掉的情况如果chattr -i提示Operation not permitted除了ld.so.preload劫持之外还有一种可能是文件系统以只读方式挂载。用mount | grep / 看一下挂载参数如果是ro需要先mount -o remount,rw /。另外某些云环境的系统盘可能有额外的保护机制需要从控制台层面处理。8.3 挖矿进程杀不死的排查思路kill -9之后进程立刻复活说明有守护机制。排查顺序是先看定时任务crontab -l再看ld.so.preload然后看/etc/init.d/和systemd服务最后看是否有其他进程在监控并拉起。可以用ps -eo pid,ppid,cmd找到父进程如果父进程是1说明是被init拉起的需要检查systemd服务或者rc.local。8.4 处理完之后一定要改密码挖矿木马通常会记录系统上的密码包括SSH密码、数据库密码、其他服务密码。清除完恶意文件之后所有密码都要改一遍包括root密码、普通用户密码、数据库密码、Redis密码等。SSH密钥也要重新生成旧的authorized_keys全部清掉。8.5 重装是最彻底的方案如果机器上跑的业务不复杂重装系统是最省事也最彻底的方案。挖矿木马往往不止一种持久化手段手动清理很容易遗漏。重装之前记得备份重要数据但备份的数据也要检查避免把恶意文件一起备份了。8.6 日常监控比事后排查更重要与其等机器被挖矿了再排查不如提前做好监控。几个关键的监控点CPU使用率突增、异常外联连接、/etc/ld.so.preload文件变化、crontab变化、/tmp和/dev/shm下出现可执行文件。这些都可以通过简单的脚本或者开源工具如osquery、auditd来实现。我个人在实际处理这类事件的时候最大的体会是挖矿木马的技术含量其实不高但胜在持久化手段多、变种快。处理的时候一定要有耐心把每一个持久化点都排查到位不要看到CPU降下来就以为完事了。很多时候主进程被杀了但定时任务还在过几个小时又回来了。所以清除之后的观察期很重要至少盯24小时确认没有反复再算处理完成。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价