可通过strace监控openat、open、stat、mmap等系统调用识别非法动态库加载,重点关注非常规路径(如/tmp、/home)、可疑文件名及权限异常;结合LD_DEBUG、grep过滤、-f/-s选项提升分析效率,并用ldd/readelf验证加载原因与依赖一致性。

可以通过 strace 监控程序运行时的系统调用,重点捕获与动态库加载相关的 openat、open、stat 和 mmap 等调用,从而识别非法或意外加载的共享库文件。
关注关键系统调用和路径匹配
动态链接器(如 ld-linux.so)在加载共享库时,会按 LD_LIBRARY_PATH、/etc/ld.so.cache、默认路径(如 /lib、/usr/lib)等顺序尝试打开 .so 文件。这些行为会触发:
openat(AT_FDCWD, ".../libxxx.so", O_RDONLY|O_CLOEXEC)-
stat(".../libxxx.so", {...})(用于判断是否存在或是否为合法 ELF) -
mmap(..., PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, ...)(真正映射库到内存)
重点关注那些路径非常规(如临时目录 /tmp、用户家目录、当前目录 .)、文件名可疑(如随机字符串、无版本号、非标准前缀)或权限异常(如 world-writable 目录下的 .so)的记录。
使用过滤选项减少干扰
直接运行 strace -e trace=openat,open,stat,mmap ./your_program 输出可能很冗长。建议组合以下技巧:
- 加
-E LD_DEBUG=libs同时启用 glibc 的库加载调试(输出更语义化,但仅限正常 dlopen/dlsym 路径) - 用
-o trace.log保存日志,再用grep -E '\.so|/tmp|/home/|\.\/' trace.log快速筛选 - 加
-f跟踪子进程(某些程序会 fork 后加载库) - 加
-s 256避免路径被截断
区分“合法”与“非法”加载行为
不是所有非常规路径都代表非法,需结合上下文判断:
-
LD_PRELOAD=/path/to/malicious.so ./app是显式预加载,若未授权即属风险 - 程序自身调用
dlopen("./plugin.so")属于设计行为,但若./plugin.so来自不可信输入则构成漏洞 - 发现
openat(..., "/var/tmp/XXXXXX.so")且该文件由网络下载生成,需立即检查来源与完整性 - 多个同名
.so出现在不同路径(如先stat/usr/lib/libfoo.so失败,再openat/home/user/.local/lib/libfoo.so),说明存在覆盖行为,应核查LD_LIBRARY_PATH或rpath
配合 ldd 和 readelf 进一步验证
strace 只告诉你“尝试加载了什么”,但不说明“为什么加载”。可补充:
-
ldd ./your_program | grep 'not found\|=>'查看编译期依赖是否缺失(可能导致运行时 fallback 到其他路径) -
readelf -d ./your_program | grep 'RUNPATH\|RPATH'检查二进制内嵌的搜索路径(可能绕过系统配置) -
objdump -p ./your_program | grep NEEDED确认预期依赖列表,比对 strace 中实际打开的库是否多余或缺失


















