gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:47:44 25 4
gpt4 key购买 nike

我有一个 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 ,因为在阅读文档后:

  1. 我无法为每个 $username 将此脚本的副本放入 http://www.example.com/~username 中。该脚本需要从一个位置运行,并且我需要在脚本中指定 uid

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

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

最佳答案

setuid 为任意 uid 的唯一方法是以 root 身份运行。[1]

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

更改 uid 后这段代码实际上应该做什么?也许有一种方法可以实现这一点,而无需setuid

[1] 根据您的代码及其安全模型,您也许能够收集用户的密码并使用 su/sudo[2] 运行单独的命令行程序在 Web 服务器环境之外运行实际操作,但 su/sudo 能够执行此操作,因为它们是 suid root 并且仍然会打开无论如何,解决与以 root 身份运行 CGI 代码相关的大多数/所有问题。即使您将 root 作为无效用户名过滤掉,伪装成任意用户也会带来大量滥用机会。

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

关于perl - 当用作 cgi-bin 时,如何使用 setuid() 成功运行 Perl 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com