【问题标题】:How to successfully run Perl script with setuid() when used as cgi-bin?用作 cgi-bin 时如何使用 setuid() 成功运行 Perl 脚本?
【发布时间】:2011-06-26 20:01:53
【问题描述】:

我有一个通过 Apache 或命令行调用的 Perl 脚本。

出于测试目的,我将我希望 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

【问题讨论】:

  • 您的命令行用户可能有权更改其 UID,而您的网络服务器用户可能没有?

标签: perl apache cgi-bin setuid suexec


【解决方案1】:

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

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

更改 uid 后,这段代码实际上应该做什么?或许有一种无需setuid 即可完成此任务的方法?

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

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

【讨论】:

  • 这个 cgi-bin 用于 Ajax 调用。该脚本应以指定用户身份运行,以限制该用户访问 Web 服务器可访问的文件系统上的文件列表。
  • 我想我将不得不拆分我用来提供目录列表的代码,然后根据提供的用户名的 uid 过滤结果。
  • @Alex - 后者(根据用户 ID 让 CGI 过滤掉结果)实际上是解决这个问题的最佳方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2015-05-27
  • 2012-03-10
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多