在 Linux 上从 setuid 脚本运行 $ORIGIN 链接的二进制文件

在 Linux 上从 setuid 脚本运行 $ORIGIN 链接的二进制文件

我正在使用 suidperl 来运行一些需要 root 权限的程序。但是,运行时链接器不会扩展包含 $ORIGIN 条目的库路径,因此我想要运行的程序(来自 java 的 jstack)将无法运行。

更多信息请点击此处

建议大量使用 $ORIGIN,但有一个例外。运行时链接器不会为安全 (setuid) 应用程序扩展像 $ORIGIN 这样的标记。在大多数情况下,这应该不是问题。

我的程序看起来像这样:

#!/usr/bin/perl
$ENV{PATH} = "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.6.0_12/bin:/root/bin";
$ENV{JAVA_HOME} = "/usr/java/jdk1.6.0_12";
open(FILE, '/var/run/kil.pid');
$pid = <FILE>;
close(FILE);
chomp($pid);
if ($pid =~ /^(\d+)/) {
 $pid = $1;
} else {
  die 'nopid';
}

system( "/usr/java/jdk1.6.0_12/bin/jstack", "$pid");

有没有什么方法可以分叉一个子进程以使链接器能够正常工作。

答案1

不要使用 setuidperl,而是考虑使用 sudo 来启动脚本?

 sudo -u <targetuser> /path/to/not-setuid-script

如果目标是让用户以提升的权限运行此程序,则可能需要编写一个执行脚本“-helper”版本的弹跳脚本。

相关内容