gpt4 book ai didi

c - 使用 linux 功能是否禁用 LD_PRELOAD

转载 作者:IT王子 更新时间:2023-10-29 00:46:47 26 4
gpt4 key购买 nike

在我的自定义环境中,预加载了一个拦截器库,它运行 bind()connect() 等调用的特殊实现。

我看到的问题是,每当应用程序使用命令 setcap 显式启用功能时,执行应用程序无法预加载拦截器库并调用默认 libc connect()

这是预期的行为吗?如果是,禁用 LD_PRELOAD 的原因可能是什么?

是否有任何调整或方法可以用来成功预加载启用功能的库?

最佳答案

就像 Oliver Matthews 回答的那样,出于安全原因,LD_PRELOAD 对于 setuid 二进制文件和具有文件功能的二进制文件都被禁用。

要在启用文件功能的同时预加载库,您有两个选择:

  1. 设置预加载库setuid root

    (Linux 动态链接器 ld.so 会为启用了 setuid/file-capability 的二进制文件预加载库,如果库由 root 拥有并标记为 set-uid。)

  2. 使用 setuid 根包装器

    wrapper 获得完整的 root 权限(真实和有效的用户和组 ID 均为零),并将原始真实用户和组 ID 存储到例如环境变量。

    预加载的库有一个构造函数,例如

    static void my_library_init(void) __attribute__((constructor));
    static void my_library_init(void)
    {
    /* ... */
    }

    它在 main() 之前自动运行(但可能在其他预加载库中的其他构造函数之后,或者在预加载库所依赖的库中)。

    此构造函数获得所需的功能,通过环境变量(getenv()cap_from_text())或二进制可执行文件本身(cap_from_file( "/proc/self/exe")).

    构造函数必须临时使用prctl(PR_SET_KEEPCAPS, 1) 来保持身份更改的能力,并保留CAP_SETUIDCAP_SETGID 能力以能够将身份从 root 更改为环境变量中指定的用户和组,然后再将自身限制为最终功能集。

这两种选择都有明显的安全考虑。我建议在预加载的库构造函数中进行健全性检查(并清除 LD_PRELOAD)。如果有任何可疑之处,请使用 _exit() 立即中止进程。

一般来说,为了简单起见(实现和安全问题),我推荐第一种选择,但如果由于某种原因无法使用,我也可以为第二种情况提供概念验证代码。 (我已经验证这两个选项在运行 3.8.0-27-generic x86-64 内核、使用 ext4 文件系统的 Ubuntu 12.04.2 LTS 上工作。)

希望这对您有所帮助。

关于c - 使用 linux 功能是否禁用 LD_PRELOAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18058426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com