0

我正在运行 Ubuntu 11.04。

我正在尝试使用“C”execlp 程序来运行 Java 程序,然后我想在“C”程序上设置 setuid,以便 Java 程序可以以 root 身份执行。这里有一个例子:

http://www.coderanch.com/t/110254/Linux-UNIX/setuid

除了不是tomcat用户,我使用了root,我按照这个例子进行了操作。

Root 能够执行“C”程序,该程序又执行 Java 程序。并且,在授予 root 所有权之前,用户(我)可以运行执行 Java 程序的“C”程序。但是一旦我设置使用 setuid,并且用户尝试执行该程序。我得到似乎是 LD_LIBRARY_PATH 类型的错误: java:加载共享库时出错:libjli.so:无法打开共享对象文件:没有这样的文件或目录

libjli.so 文件存在于 Java JRE 下。用户和 Root 在单独运行时都可以看到此文件。但是用户在 setuid 到 root 发生后运行程序时看不到它。

当 setuid 程序执行时,是否有一些不同的方式设置 root 的 LD_LIBRARY_PATH?这是交互式与非交互式问题吗?

有任何想法吗?提前致谢。

4

3 回答 3

0

要解决LD_*setuid 程序的环境限制,在大多数 POSIX 系统上,您应该能够在包装器代码中执行此操作:

setreuid(0, 0);

这会将真实有效的 UID 都设置为root,尽管这仅在程序本身在setuid启用该位的情况下启动时才有效。

不过,我不会这样做。

看看为什么你的 Java 程序需要以 root 身份运行,看看是否有更好的方法来赋予它所需的权限,而无需实际以 root 身份运行。

于 2011-06-12T06:25:26.877 回答
0

在文件上设置 setuid 位将更改进程的有效 UID,但不会更改真正的 UID。动态链接器将检查 EUID ≠ RUID,如果是,它将忽略所有环境变量。您的包装器必须过滤环境变量本身(重要!),一旦完成,更改真实的 UID 以匹配有效的 UID。

警告:不要忘记好好清理环境变量,除非你可以为盒子上的每个人提供完全的 root 访问权限。

于 2011-06-12T04:26:37.563 回答
0

由于LD_*环境变量可用于将代码加载到进程中,因此它们都被 setuid 二进制文件忽略。您可能需要使 setuid 二进制文件成为执行 C 程序的包装器。

于 2011-06-12T04:10:27.550 回答