利用 LD_PRELOAD 环境变量

文章介绍了Linux环境下LD_PRELOAD的工作原理,如何通过控制LD_PRELOAD变量上传恶意.so文件,以及在PHP环境中实现RCE(RemoteCodeExecution)的示例,展示了如何通过构造函数绕过安全限制执行恶意代码。


原理

LD_PRELOAD介绍

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

什么是链接

程序的链接主要有以下三种:

静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。

对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说时透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致disable_function被绕过。
使用LD_PRELOAD绕过的条件

能够上传自己的.so文件
能够控制环境变量的值(设置LD_PRELOAD变量),比如putenv函数
存在可以控制PHP启动外部程序的函数并能执行(因为新进程启动将加载LD_PRELOAD中的.so文件),比如mail()、imap_mail()、mb_send_mail()和error_log()等

当我们能够设置环境变量,比如putenv函数未被禁止,我们就可以把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新的进程就会在新进程运行前优先加载该恶意.so文件,

### 如何在 Anaconda 环境中配置和使用 `LD_PRELOAD` 变量 为了在 Anaconda 环境中配置并使用 `LD_PRELOAD` 环境变量,可以按照如下方法操作: #### 方法一:临时设置 `LD_PRELOAD` 可以在命令行中直接导出该环境变量来实现一次性加载特定库文件。这种方式仅对当前终端会话有效。 ```bash export LD_PRELOAD=~/anaconda3/lib/libmkl_core.so:~/anaconda3/lib/libmkl_sequential.so[^3] ``` 这行指令指定了两个共享对象(`.so` 文件),它们会在程序启动前被预先载入内存空间,从而影响应用程序的行为或性能表现。 #### 方法二:持久化配置 `LD_PRELOAD` 为了让这种更改永久生效而不必每次手动输入上述命令,在激活某个 conda 虚拟环境之后编辑对应的 `.condarc`, 或者更常见的是通过创建一个名为 `env_vars.sh` 的脚本放在项目根目录下,并将其路径加入到 shell 配置文件(如 `.bashrc` 或 `.zshrc`)里自动执行。 不过对于大多数情况来说,推荐的做法是在 Conda 中利用 `activate.d` 和 `deactivate.d` 目录下的脚本来管理这些环境变量的变化。具体做法如下所示: 1. 创建一个新的文本文件作为自定义初始化脚本; 2. 将其放置于 `$CONDA_PREFIX/etc/conda/activate.d/env_vars.sh`; 3. 编辑此文件以包含所需的 `export` 命令; 例如: ```bash #!/bin/bash export LD_PRELOAD=$HOME/anaconda3/lib/libmkl_core.so:$HOME/anaconda3/lib/libmkl_sequential.so ``` 这样做的好处在于当切换不同的虚拟环境时能够方便地控制哪些环境下应用这个预加载机制以及何时解除它——只需相应调整对应位置上的脚本即可[^2]。 需要注意的一点是,某些情况下可能需要禁用已有的 `LD_PRELOAD` 设置才能成功安装像 Gensim 这样的 Python 库。因此建议先尝试移除现有的任何有关 `LD_PRELOAD` 的设定再继续后续的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_rev1ve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值