Setuid to Perl script



我正在使用一个Perl脚本,该脚本从mqueue文件夹中删除sendmail的数据。

当我setuid到该Perl脚本并尝试从用户运行它时,它会抛出以下消息:

Insecure dependency in chdir while running setuid at /file/find

如何解决它并使用根权限成功运行脚本?

!/usr/bin/perl
use strict;
my $qtool = "/usr/local/bin/qtool.pl";
my $mqueue_directory = "/var/spool/mqueue";
my $messages_removed = 0;
use File::Find;
# Recursively find all files and directories in $mqueue_directory
find(&wanted, $mqueue_directory);
sub wanted {
   # Is this a qf* file?
   if ( /^qf(w{14})/ ) {
      my $qf_file = $_;
      my $queue_id = $1;
      my $deferred = 0;
      my $from_postmaster = 0;
      my $delivery_failure = 0;
      my $double_bounce = 0;
      open (QF_FILE, $_);
      while(<QF_FILE>) {
         $deferred = 1 if ( /^MDeferred/ );
         $from_postmaster = 1 if ( /^S<>$/ );
         $delivery_failure = 1 if 
            ( /^H??Subject: DELIVERY FAILURE: (User|Recipient)/ );
         if ( $deferred && $from_postmaster && $delivery_failure ) {
            $double_bounce = 1;
            last;
         }
      }
      close (QF_FILE);
      if ($double_bounce) {
         print "Removing $queue_id...n";
         system "$qtool", "-d", $qf_file;
         $messages_removed++;
      }
   }
}
print "n$messages_removed total "double bounce" message(s) removed from ";
print "mail queue.n";

"不安全的依赖"是一件Taint的事情:http://perldoc.perl.org/perlsec.html。

正在强制实施污点,因为您已经运行了脚本 setuid。 您需要将untaint指定为 File::Find 的 %option 键:

http://metacpan.org/pod/File::Find

my %options = (
    wanted => &wanted,
    untaint => 1
);
find(%options, $mqueue_directory);

您还应该查看 File::Find 的 POD 中的untaint_pattern

你应该构建一个程序包装器。在几乎任何 unix 系统上,脚本永远无法通过 SetUID 位获得 root 权限。你可以在这里找到一些有用的例子 http://www.tuxation.com/setuid-on-shell-scripts.html

最新更新