那天我正在服务器上执行常规维护任务,突然发现不管运行什么命令,终端都会弹出一条奇怪的错误信息:ERROR: ld.so: object '/usr/local/lib/libs.so' from /etc/ld.so.preload cannot be preloaded: ignored。这个看似普通的动态链接库加载失败提示,实际上暗藏杀机。
我第一反应是检查/usr/local/lib/libs.so这个文件是否存在。执行ls -l /usr/local/lib/libs.so后,发现这个文件确实存在,但修改时间非常新。更可疑的是,当我尝试用rm命令删除它时,系统竟然返回了Permission denied——要知道我可是用root账户操作的!这种异常情况立刻触发了我的安全警报。
通过lsattr /usr/local/lib/libs.so查看文件属性,发现了更惊人的事实:这个文件被设置了ia属性(immutable和append-only)。这意味着即便是root用户也无法修改或删除它,这种防御性设置通常用于保护关键系统文件,现在却被用来保护恶意文件。此时我意识到,服务器很可能已经遭到入侵。
/etc/ld.so.preload是Linux动态链接器(ld.so)的一个特殊配置文件。与大家更熟悉的LD_PRELOAD环境变量类似,它能强制系统在加载任何其他共享库之前,先加载指定的库文件。但不同于环境变量,这个文件的影响是系统级的,而且优先级更高。
攻击者正是利用了这个特性。他们在我的系统中植入了/usr/local/lib/libs.so这个恶意库,然后通过修改/etc/ld.so.preload强制所有程序加载它。这个恶意库很可能通过函数钩子(hooking)技术,劫持了诸如system()、execve()等关键系统调用,从而监控和篡改所有程序的执行。
当我尝试清理/etc/ld.so.preload文件时,再次遇到了Permission denied。使用lsattr检查发现,这个文件也被设置了ia属性。这就是为什么常规的删除和修改操作都失败了。
要解除这个锁定,需要使用chattr命令的特殊参数:
bash复制chattr -ia /etc/ld.so.preload
这个命令移除了文件的不可变(immutable)和仅追加(append-only)属性。执行后,我就能用常规方法清空文件内容了:
bash复制echo "" > /etc/ld.so.preload
确认/etc/ld.so.preload已被清空后,接下来需要处理实际的恶意库文件。同样需要先解除其属性锁定:
bash复制chattr -ia /usr/local/lib/libs.so
rm -f /usr/local/lib/libs.so
为防万一,我还检查了其他常见恶意软件藏匿位置:
bash复制rm -f /var/tmp/kworkerds* /tmp/kworkerds* /var/tmp/1.so /tmp/1.so
攻击者通常会在系统中设置多个持久化后门。最常见的包括:
bash复制rm -rf /var/spool/cron/* /etc/cron.d/*
启动项:检查/etc/rc.local、/etc/init.d/等启动脚本
SSH后门:检查~/.ssh/authorized_keys是否有异常公钥
清理完成后,必须防止攻击者再次修改这些关键文件。使用chattr进行加固:
bash复制chattr +i /etc/ld.so.preload
chattr +i /usr/local/lib
chattr +i /var/spool/cron
这些命令将目标设置为不可修改(immutable),即使是root用户也无法更改。需要注意的是,这种保护虽然强大,但在需要合法更新时,必须先临时解除锁定。
除了静态防护,还需要建立动态监控:
auditd监控关键文件变动:bash复制auditctl -w /etc/ld.so.preload -p wa -k ld_preload_mod
bash复制ps auxf | grep -v '\['
bash复制netstat -antp | grep ESTABLISHED
通过分析这次事件,可以还原攻击者的完整攻击路径:
libs.so到/usr/local/lib//etc/ld.so.preload强制预加载恶意库chattr +ia锁定这两个关键文件防止被清理chattr操作的是文件系统中的inode标志位,这些标志位在内核层面强制执行,因此比常规权限更底层。主要防护标志包括:
i(immutable):禁止任何修改,包括删除、重命名、链接创建等a(append-only):只允许追加内容,不能修改现有内容A(no atime updates):禁用访问时间更新,提高性能这些属性在ext2/3/4文件系统中得到支持,是Linux系统最后一道文件防护线。
根据这次事件经验,我整理了一份应急响应检查清单:
异常错误检查:
/var/log/messages、/var/log/secure中的可疑记录文件系统检查:
lsattr检查关键文件属性bash复制find /etc /usr/local/lib -mtime -7
进程检查:
bash复制ps -ef | grep -v '\['
bash复制top -c -o %CPU
网络检查:
bash复制lsof -i -n -P
bash复制netstat -tulnp
在服务器安全维护过程中,我逐渐养成了定期检查这些指标的习惯。安全防护不是一劳永逸的工作,而是需要持续监控和更新的过程。特别是在处理ld.so.preload这类底层机制时,任何异常都可能是严重入侵的信号,必须立即彻底调查。