首页 文章

当用作cgi-bin时,如何使用setuid()成功运行Perl脚本?

提问于
浏览
3

我有一个Perl脚本,可以通过Apache或命令行调用 .

出于测试目的,我将其传递给我希望Perl脚本操作的用户名,并使用 POSIX::setuid 来设置 uid .

如果我从命令行运行脚本,则 uid 设置正确:

use CGI::Pretty qw/:standard/;
use POSIX qw(setuid getuid);

...
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment, 
    $pwGcos, $pwHome, $pwLogprog) = getpwnam($username);

if ((defined $pwUid) && (getuid() == $pwUid)) {
    setuid($pwUid);
    print header;
    print Dumper $<;
}
else {
    print header(-status => 401);
    print "Could not setuid to correct uid (currently: )".getuid()."\n";
}

命令行输出显示指定 $username 的正确 uid ,而不是开始运行脚本的测试帐户的 uid .

如果我通过Apache调用脚本,那么 uid 仍然设置为 apache 用户的id,并且永远不会更改 .

我不相信我可以在这里使用 suExec ,因为在阅读文档之后:

  • 我不能为每个 $username 将此脚本的副本放入 http://www.example.com/~username . 脚本需要从一个位置运行,我需要在脚本中指定 uid .

  • 我需要在运行时将脚本作为指定的用户名运行,而不是在Apache配置文件中的虚拟主机指令中指定的单个用户名 . 每次新用户运行此脚本时更改此配置文件并重新启动Apache都是不现实的 .

当使用 setuid() 时,如何正确运行作为cgi-bin的Perl脚本来正确更改 uid

1 回答

  • 4

    你可以使用任意uid的唯一方法是以root身份运行 . [1]

    我不了解你,但以root身份运行的CGI程序的想法给了我噩梦 .

    在更改uid之后,这段代码应该实际执行什么操作?也许有一种方法可以实现这一点,而不必 setuid

    [1]根据您的代码及其安全模型,您可以收集用户的密码并使用 su / sudo [2]运行单独的命令行程序来运行Web服务器环境之外的实际操作,但是 su / sudo 能够做到这一点,因为它们是suid root,它仍然会打开与以root身份运行CGI代码相关的大部分/全部问题 . 即使您将root过滤为无效的用户名,也可以伪装成任意用户,从而为滥用提供了大量机会 .

    [2] sudo 甚至可以配置为允许它而不需要密码,但是在这条路径上有龙 . 如果你尝试的话,请确保你知道自己在做什么,以免你的用户自由地随意冒充对方 .

相关问题