ld.so.preload 是什么
glibc 动态链接器会读取 /etc/ld.so.preload,把其中列出的库预加载到所有新启动的进程。木马借这个机制实现全局隐藏与凭据收集:被劫持的目录读取与文件打开调用,会让 ls、ps、netstat 看不到指定文件、进程与端口。
排查三步
先确认文件是否存在、内容是什么;再检查被引用 .so 的来源、权限与哈希;最后验证是否与观察到的隐藏行为吻合。清理时先复制留档,再移除并复验。
基本信息
| 文件 | /etc/ld.so.preload |
|---|---|
| 作用 | 把指定 .so 预加载到每个新进程 |
| 正常状态 | 文件不存在或内容为空 |
| 关联检查 | 被引用 .so 的来源、权限、创建时间与哈希 |
| 同类机制 | LD_PRELOAD 环境变量、glibc 审计模块 |
| 权限要求 | 读写该文件需 root |
典型使用场景
- 排查全局隐藏型 rootkit(工具输出与实际不一致)
- 确认凭据收割类劫持的注入来源
- 清理后验证隐藏行为是否消失
- 与进程 maps 联动定位被注入的库
- 事件报告中说明根因与影响范围
检查预加载配置
检查预加载配置
ls -l /etc/ld.so.preload 2>/dev/null; cat /etc/ld.so.preload 2>/dev/null
for so in $(cat /etc/ld.so.preload 2>/dev/null); do ls -l "$so"; md5sum "$so"; done
grep -c '' /etc/ld.so.preload 2>/dev/null # 行数:非 0 即需解释每一行
ls -la /usr/lib64/libselinux* /lib64/libselinux* 2>/dev/null | head逐项读法
| 检查项 | 含义 | 正常/异常 |
|---|---|---|
| 文件是否存在 | 该机制是否被启用 | 多数发行版默认没有这个文件 |
| 文件内容行 | 每行一个库路径 | 出现非系统路径即为高可疑 |
| 库文件时间 | .so 的创建与修改时间 | 与入侵时间窗重合需重点核查 |
| 库文件哈希 | 内容摘要 | 用于与已知样本比对并作为留档依据 |
LD_PRELOAD 环境变量只影响被设置了该变量的进程,/etc/ld.so.preload 影响所有新进程:两者是不同机制,排查必须分别做,不要只查其中一个。
删除前先把文件与被引用的 .so 复制到证据目录:它们是根因的核心证据,直接 rm 会让验证与溯源都失去材料。
留档并验证隐藏效果
留档并验证隐藏效果
cp -a /etc/ld.so.preload /evidence/ 2>/dev/null
for so in $(cat /etc/ld.so.preload 2>/dev/null); do cp -a "$so" /evidence/; sha256sum /evidence/$(basename "$so"); done
ls -la / | head -n 20 # 与被劫持时的输出对比
ls /proc | grep -c '^[0-9]' && ps -ef | wc -l # 两个数字对不上即存在隐藏进程一并核对的注入入口
- /etc/ld.so.conf.d 下的自定义路径与 ldconfig 缓存
- 各进程 environ 中的 LD_PRELOAD 与 LD_LIBRARY_PATH
- 被替换的系统库(核对包管理器校验和)
- 异常内核模块与系统调用 hook