6

「プログラミングPerl」では-w、ファイルテスト演算子は次のように説明されています。

–w ファイルは有効な UID/GID によって書き込み可能です。

私は2つのファイルを持っています:

-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が on に設定されて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. その演算子の正しい使用法を理解していなかった可能性があります。

私の感謝。

4

1 に答える 1

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 とグループ ID の値は$<、 RUID 、 EUID $>、 RGID $(、 EGID $)、または (より賢明に) 英語を使用して報告できます。

#!/usr/bin/env perl
use English '-no_match_vars';
print "EUID = $EUID; RUID = $UID; EGID = $EGID; RGID = $RGID\n";
于 2012-07-20T19:24:19.790 に答える