如何防止 LD_PRELOAD 或 ld.so.preload 配置?

Posted

技术标签:

【中文标题】如何防止 LD_PRELOAD 或 ld.so.preload 配置?【英文标题】:How to prevent LD_PRELOAD or ld.so.preload configuration? 【发布时间】:2014-01-02 07:29:51 【问题描述】:

由于许可问题,很少有库无法静态链接。

那么是否可以通过 LD_PRELOAD 环境变量或通过 /etc/ld.so.preload 配置来防止/检测预加载库?

前一个可以通过getenv()检测。但我不知道其他方法。

我认为可能有一个通用的方法,是吗?

【问题讨论】:

【参考方案1】:

是否可以通过 LD_PRELOAD 环境变量或通过 /etc/ld.so.preload 配置来防止/检测预加载库?

您似乎正在尝试实施某种反黑客保护。如果是这样,那么研究现有的防裂技术是值得的。 This book 描述了一些。

请注意,除了LD_PRELOAD/etc/ld.so.preload 之外,还有许多 其他技术可以将“外来”代码注入您的应用程序。立即想到的一对是:LD_AUDIT,在调试器下运行,以及重命名/替换 libc.so

你几乎没有希望阻止一个中等老练的攻击者。在 Linux 上,我可以构建自己的 libc.so.6,并且可以将 LD_PRELOAD 重命名为其他名称。我还可以构建自己的内核,并让它自动将myhack.so 注入您的进程,而不会产生任何用户空间可见效果。或者我可以简单地让系统调用在您的应用程序执行时执行其他操作。

... LD_PRELOAD ... 可以通过getenv()检测到

这只会阻止最不成熟的攻击者,原因有两个:

预加载的库本身可以插入getenv(),并且可以从您的应用程序中隐藏LD_PRELOAD,并且 LD_PRELOAD 仅在进程启动时起作用。在该过程开始后,预加载的库可以在您的应用程序有机会检查它之前轻松地从环境中删除 LD_PRELOAD

【讨论】:

以上是关于如何防止 LD_PRELOAD 或 ld.so.preload 配置?的主要内容,如果未能解决你的问题,请参考以下文章

使用LD_PRELOAD指定多个文件

UNIX下的LD_PRELOAD环境变量

使用Linux功能是否会禁用LD_PRELOAD

什么是 LD_PRELOAD 技巧?

利用jemalloc分析内存泄漏以及LD_PRELOAD--转载--可以为定位内存问题的雏形

LD_PRELOAD和ld --wrap