【发布时间】: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 版本中做您希望做的事情。