C 如何防止二进制文件上的LD_预加载?

C 如何防止二进制文件上的LD_预加载?,c,linux,hook,ld-preload,C,Linux,Hook,Ld Preload,我用C代码写二进制代码。如何防止其他用户在我的二进制文件上使用LD_PRELOAD 当使用LD_PRELOAD时,是否有任何信号可以处理并中断程序 如果我静态编译二进制文件,我听说LD_PRELOAD将无法工作,对吗 还有其他方法吗?ld preload是在运行程序时通过设置ld_preload环境变量来使用的。所以你的程序可以检查这个 #include <stdlib.h> #include <stdio.h> int main(int argv, char *arg

我用C代码写二进制代码。如何防止其他用户在我的二进制文件上使用LD_PRELOAD

当使用LD_PRELOAD时,是否有任何信号可以处理并中断程序

如果我静态编译二进制文件,我听说LD_PRELOAD将无法工作,对吗


还有其他方法吗?

ld preload是在运行程序时通过设置ld_preload环境变量来使用的。所以你的程序可以检查这个

#include <stdlib.h>
#include <stdio.h>

int main(int argv, char *argv) {
    if (getenv("LD_PRELOAD")) {
        fprintf(stderr, "Sorry, you can't use ld preload with this program.\n");
        exit(1);
    }
    ...
}

除非预加载的库提供了自己的getenv来隐藏此变量,否则这将起作用。

执行以下操作(尽管是故意的),将防止用户对二进制文件使用LD_PRELOAD:

将二进制文件的所有者设置为该用户。 设置setuid位,并使用chmod 4100将文件仅可执行给二进制文件的所有者 使用sudo chattr+i在上设置不可变位,我认为xfs和ext4都支持它。
就像脚本有一个通过指定的解释器一样!在机制上,例外项也起着类似的作用。ELF可执行文件在程序头中有一个字段,其类型为PT_INTERP,它为可执行文件提供解释器的路径。这个解释器就是动态链接器ld-linux.so。该链接器将处理头文件,并将文件映射到内存和所有其他文件中

正是这个ld-linux.so加载程序实现了ld_预加载功能

如果您生成了此程序的自定义版本,其中删除或禁用了对LD_预加载的支持,然后将可执行文件的程序头指向使用该LD-linux。因此,您应该能够击败LD_预加载,而不是使用通常的LD-linux解释器

如果我静态编译二进制文件,我听说LD_PRELOAD将无法工作,对吗


虽然这基本上是正确的,但Glibc上不支持静态链接。现在,如果您想发布一个静态链接的可执行文件,您可以考虑使用一个替代的C库:它是为静态链接而从头设计的,musl小心地避免引入大量应用程序不会使用的代码或数据。

您可以检查是否设置了LD_PRELOAD环境变量。但他们可能会链接到不同版本的getenv,这就很困难了。你为什么关心这个?几乎是一个跨站点的傻瓜:@Barmar你能解释一下吗?当进程以LD_PRELOAD运行时,要处理的环境变量是什么?我怎样才能检查它,并且可以设置哪种环境变量?这些用户能够对你给他们的二进制文件进行十六进制编辑吗?或者在类似dtrace的环境下运行它?但是LD_PRELOAD也可以预加载getenv。我知道,我在上面的评论中提到过它。我已经把它添加到了答案中。。。。然而,它会产生其他各种潜在的危险影响。是的,它有副作用。设置setuid位的二进制文件的所有者不需要是特权用户。即使所有者没有特权,允许他人以其他用户的身份运行代码也存在风险,例如,规避日志记录或资源限制。在我看来,这个建议就像是在你的财产上埋设地雷来防止入室行窃。当然,这是出于安全考虑。但我认为这不是问题的重点。此外,还有一些带有setuid位的标准工具,比如su.Yes,这些程序编写得非常仔细,以避免不当使用,即使如此,它们偶尔也会有严重的安全漏洞。我真的不认为你的答案是一个很好的解决方案,我没有看到任何证据表明,阿克的情况有特殊的特点,使它成为一个合理的方法在这种情况下。