【发布时间】:2012-01-31 12:38:33
【问题描述】:
当此脚本的权限为u=rwx,g=rwx,o=r 时,脚本工作得很好……但是,我需要打开 setuid 位,以便调用 smartctl 返回所需的数据而不是错误。
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);
my $device = param("device") || "sda";
print header("text/plain");
print "device = $device\n\n";
$ENV{"PATH"} = "/usr/sbin";
open( PS, "smartctl -A /dev/$device |" );
while( <PS> )
{
print $_ . "\n";
}
close( PS );
当我将权限设置为u=rwxs,g=rwxs,o=r 时,脚本在查询未指定device 时有效。但是当指定device 时,print "device = $device\n\n"; 之后没有返回任何内容
【问题讨论】:
-
setuid在脚本上是邪恶的。你不能在你的脚本中使用sudo /usr/sbin/smartctl吗? -
我想如果我给 www-data 用户 no-password required sudo 权限来 smartctl,我可以尝试一下。但是,我仍然想了解为什么这不起作用。
-
如何为脚本处理
setuid是完全不可移植的。它可以(如果我没记错的话)涉及将环境重置为健全的价值观和类似的东西。这会使 CGI 相当混乱。 -
perl 对
setuid有特殊的东西:cs.cmu.edu/afs/cs/usr/rgs/mosaic/pl-suid.html - 污点系统可能会干扰。 -
您需要在设备参数字段中清理写:
sda; cp /bin/sh /tmp/...; chmod 6777 /tmp/...的人的输入。有点像SQL注入,只不过这次是'Perl script injection'。
标签: linux perl apache cgi param