繁体   English   中英

如何在 systemd 中设置 LD_PRELOAD

[英]How to set LD_PRELOAD in systemd

我想用 systemd 中的LD_PRELOAD挂钩 libssl 中的一些函数。

在我放的systemd文件中

ExecStart=/etc/myscript.sh

在 /etc/myscript.sh 我把

#!/bin/sh
LD_PRELOAD=/lib/inject_libssl.so /bin/run

当我查看/proc/RUN_PID/maps时,我可以看到 inject_libssl.so 确实注入了进程,但原始 libssl.so 在注入库之前加载,所以我的钩子不起作用。

我也试过

ExecStart=/bin/run 
Environment="LD_PRELOAD=/lib/inject_libssl.so"

但我得到了相同的结果。

如果我运行LD_PRELOAD=/lib/inject_libssl.so curl https://google.com注入的 libssl 运行良好。

请问这是为什么?

你能试试这个脚本看看会加载哪个吗?

#!/usr/bin/env bash
  
cp /lib/x86_64-linux-gnu/libssl.so /tmp/inject_libssl.so
LD_PRELOAD=/tmp/inject_libssl.so /bin/run

您也可以尝试将 your.so 放入/usr/lib/x86_64-linux-gnu吗?

原因可能是systemd在 set-user-ID 模式下运行您的脚本/二进制文件。 根据动态 linker 文档LD_PRELOAD支持是有限的:

对于 set-user-ID/set-group-ID ELF 二进制文件,包含斜杠的预加载路径名将被忽略,并且只有在库文件上启用了 set-user-ID 权限位时才会加载标准搜索目录中的库。

所以你需要将你的库复制到正确的地方并提供相应的权限。 您可以使用特定的User=设置或使用包装器来解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM