[英]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.