在“Programming Perl”-w
文件测试操作符中描述为:
-w文件可通过有效的UID / GID写入。
我有两个文件:
-rwsrwxrwx 1 testuser testuser 226 Jul 20 20:31 script.pl
-rw-rw-r-- 1 testuser testuser 34 Jul 14 17:24 file.txt
suid
设置在script.pl
上,因此当我以用户caligula运行时,有效的UID / GID应该是testuser的一个。 script.pl
是:
#!/usr/bin/perl
use v5.14;
if (-w 'file.txt') {
say "true";
}
else {
say "false";
}
但是当我运行caligula@ubuntu-host:~$ ./script.pl
时,输出始终为false
。为什么会发生这种情况,可能是我不明白该运营商的正确用法?
我的感激。
答案 0 :(得分:11)
可以配置Perl以便忽略SUID脚本;这是默认设置,也可能是您的设置方式。您应该在脚本中打印真实有效的UID和GID。
您可以使用适度模糊的Perl单行验证这一点:
$ perl -MConfig -e 'foreach $key (keys %Config) { print "$key = $Config{$key}\n"; }' |
> grep -i -e 'se*t*[ug]id'
d_dosuid =
d_setresgid = define
d_setresuid = define
d_suidsafe =
$
或者,稍微不那么模糊,我找到了正确的名字:
$ perl -MConfig -e 'print "d_suidsafe = $Config{d_suidsafe}\n"'
d_suidsafe =
$
这表明这个Perl(我构建的5.12.1)并不认为SUID脚本是安全的。
真实有效的用户和组ID值可通过以下方式报告:RUID $<
,EUID $>
,RGID $(
和EGID $)
,或者(更明智地)使用英文:
#!/usr/bin/env perl
use English '-no_match_vars';
print "EUID = $EUID; RUID = $UID; EGID = $EGID; RGID = $RGID\n";