【问题标题】:Setuid Perl script works on Solaris, but not LinuxSetuid Perl 脚本适用于 Solaris,但不适用于 Linux
【发布时间】:2020-12-22 00:17:05
【问题描述】:

好吧,这很奇怪。但是在尝试为某人重现问题的过程中(这成为一个潜在的争论点),我发现了这个有趣的奇怪之处......以这个愚蠢而简单的 perl 脚本:

#!/usr/bin/perl

use POSIX;

$ENV{"PATH"} = "/usr/bin";
print "Effective:" . $> . "\n";
print "Actual   :" . $< . "\n";
print "geteuid():" . geteuid() . "\n";

如果我以(例如)root 身份创建此脚本,将其设置为 4755 权限,我会在 Solaris 11.4 (Perl 5.22.1) 和 Solaris 10.3 (Perl 5.16.1) 上获得此脚本:

Effective:0
Actual   :100
geteuid():0

完全相同的脚本,在相同或更高版本的 Perl 上运行,但在 Linux(RHEL 7.7、Ubuntu 14.04、Ubuntu 20.04、RHEL 6.10)上运行:

Effective:100
Actual   :100
geteuid():100

如果我在 Linux 上创建一个运行此脚本的 suid 可执行文件,我会得到预期的 0/100/0 输出。

在 RHEL 6.10 主机上,它还安装了 Perl 5.8.4,并且该 perl 一旦安装了 suidperl,也如预期的那样给了我 0/100/0。

知道为什么这适用于 Solaris 而不是 Linux 吗?当您处理迁移/升级问题时,平台特定的怪癖有点烦人......

【问题讨论】:

  • @TedLyngmo 不是那么多,因为这实际上是这里的问题。 Perl 应该支持这一点,但现在它“在某些平台上有效,在过去的其他平台上无效......”
  • 我都读过,但同样,它并没有回答“为什么 PERL 在 this 平台而不是 that 平台上工作的基本问题?”我怀疑这个问题的答案类似于“一些 Linux Perl 维护者不喜欢这个并杀死了它”,但我无法证明或反驳这个假设。
  • 我猜不同的平台(和平台的版本)有不同的安全措施。甚至两个 Linux 都不相同,因为您可以调整安全设置。您测试的所有 perl 版本是否都使用perlsec 中提到的SETUID_SCRIPTS_ARE_SECURE_NOW (perl -V | grep SETUID_SCRIPTS_ARE_SECURE_NOW) 编译?即使您在两个不同的平台上使用相同的版本,如果我没看错的话,该选项将决定您是否可以在较新的 perl 版本中做您希望做的事情。

标签: linux perl solaris


【解决方案1】:

如果可移植性是一个问题,假设类 Unix 平台会尊重脚本上的 setuid 标志是不安全的。这不是 Perl 或任何其他解释器的问题——像这样的限制在相当深的层面被支持到平台中。许多人担心 - 有充分的理由 - 允许的 setuid 脚本会造成安全漏洞。

标准的解决方案——正如你已经想到的——是从设置了 setuid 标志的二进制文件中调用脚本。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多