【问题标题】:LD_PRELOAD does not loaded on systemdLD_PRELOAD 未在 systemd 上加载
【发布时间】:2016-07-02 05:54:29
【问题描述】:

我正在尝试将 SO 注入到使用 systemd init 系统(使用 LD_PRELOAD)开始的进程中,但它没有加载到新进程中。

我遵守了一个基本的 SO (unrandom.c):

int rand(){
    return 42; //the most random number in the universe
}

使用命令行:

gcc -shared -fPIC unrandom.c -o unrandom.so

我将 .service 文件更改为包括:

Environment="LD_PRELOAD=/tmp/unrandom.so"

启动服务后进程中存在LD_PRELOAD环境变量,但没有注入SO

cat /proc/<PID>/maps

我错过了什么吗?

我的机器是 RHEL7

【问题讨论】:

  • 如果你从 shell 中运行它会起作用吗?
  • 是的,如果我直接从 shell 运行命令,它正在工作......
  • 我需要测试一下。晚上可以给你反馈。顺便说一句,奇怪的想法! :) 请问你为什么要这样做?
  • 并不是一个奇怪的想法,我发现自己也在尝试做同样的事情,因为有一个错误解决方法:bugs.launchpad.net/ubuntu/+source/libpam-ldap/+bug/1418265
  • systemd启动的流程是什么?它是静态链接还是动态链接(检查ldd /path/filename),还是脚本(检查head -1 /path/filename)还是将删除其LD_PRELOAD 的suid 程序?

标签: linux rhel systemd ld-preload


【解决方案1】:

出于安全原因,Setuid 进程限制使用 LD_PRELOAD(以及其他一些环境变量)。

加载的库必须仅通过名称指定,并且位于/etc/ld.so.conf 中列出的目录之一中(参见例如this link)。例如在基于 Debian 的系统上

sudo cp library.so /usr/lib/x86_64-linux-gnu
LD_PRELOAD=library.so daemon

另一种方法是将库的完整路径放入/etc/ld.so.preload

sudo echo path/to/library.so >> /etc/ld.so.preload

但随后它会被预加载到所有新进程中(如果您不非常小心,很有可能会破坏您的系统)。

【讨论】:

  • 那么预加载的具体步骤是什么?
猜你喜欢
  • 2022-12-26
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多