繁体   English   中英

为什么在perl脚本更改的C包装器的setgid-bit时@INC会发生变化?

[英]Why does @INC change when setgid-bit of C wrapper around perl script change?

这完全在RHEL6上

我试图通过将其包装在C二进制文件中然后设置二进制文件的setgid位来作为特定用户(perl脚本的所有者)运行perl脚本(参考: https//superuser.com/questions/440363/ can-i-make-a-script-always-execute-as-root )。 perl脚本使用各种perl模块。 如果perl模块在试图运行C二进制文件的帐户的PERL5LIB中,并且未在C二进制文件上设置setgid-bit,则它运行正常。 如果设置了setgid-bit,那么它会失败,因为使用的perl模块不在@INC中。

一些代码用于演示@INC如何随粘性位改变...

the.pl

#!/usr/bin/env perl
print "Size of INC: ".scalar(@INC)."\n";
exit;

wrapper.c

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

int main(int argc, char *argv[])
{
  exit(execvp("/home/me/the.pl",(char **)argv));
}

perl脚本权限是-rwxrwxr-x

当我将包装器的权限设置为-rwxr-xr-x时(注意未设置setgid位),然后从其他帐户运行二进制文件,我得到...

Size of INC = 87

...这是我所期望的(PERL5LIB中有87个元素)。

但是当我将包装器的权限设置为-rwxr-sr-x时(注意setgid位已设置),然后从其他帐户运行二进制文件,我得到...

Size of INC = 4

即使我在perl脚本的所有者和运行包装器的帐户的.cshrc中加载​​了所有87个元素的PERL5LIB,我也会得到相同的结果。

我需要将二进制文件作为perl脚本的所有者运行,因为该帐户具有用户帐户所没有的priv。 root用户不是任何一个玩家。

为什么我会丢失这些PERL5LIB元素? 有没有办法解决这个问题?

提前致谢!

setuid perl脚本以污点模式运行, perlsec说:

当污点模式(“ -T ”)生效时, . ”目录将从@INC删除,Perl将忽略环境变量“ PERL5LIB ”和“ PERLLIB 您仍然可以使用“ -I ”命令行选项从程序外部调整@INC ,如perlrun 这两个环境变量被忽略,因为它们被遮挡,运行程序的用户可能不知道它们被设置,而“ -I ”选项清晰可见,因此被允许。

如果您无法在程序中调整@INC (例如, use lib ... ),您将需要重写您的C程序以调用perl可执行文件而不是您的脚本名称,并使用您的脚本名称和任何适当的前缀argv -I...您想要使用的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM