【问题标题】:How do I sanitize EDITOR, etc, environment variables?如何清理 EDITOR 等环境变量?
【发布时间】:2010-12-15 16:20:56
【问题描述】:

我有以下代码,但我认为我需要清理环境变量,但我不确定应该如何清理它们。我意识到我可以对它们进行消毒的程度可能是有限的,但我能做什么?

#!/usr/bin/perl
use 5.012;
use warnings;
use autodie;
use Env qw( EDITOR VISUAL );
use File::Temp qw( :seekable );

my $editor = '/usr/bin/nano';
if ( $VISUAL ) {
    $editor = $VISUAL;
}
elsif ( $EDITOR ) {
    $editor = $EDITOR;
} else {
    warn 'set VISUAL and EDITOR env variables not set falling back to nano'
    . "\n";
}

my $tmpf = File::Temp->new;

system $editor, $tmpf->filename;

open $tmpf, '<', $tmpf->filename;

print while ( <$tmpf> );

【问题讨论】:

  • 看看perlsec,它告诉你“污染”模式。污染模式会将来自程序外部环境的任何数据标记为污染。受污染的数据在不被清除的情况下无法写回环境。例如,如果“EDITOR”设置为“rm -rf /& #”会怎样?

标签: perl environment-variables sanitization taint-checking


【解决方案1】:

我只在 CGI 脚本中做过类似的事情,所以也许这根本不是你想要的;我只是希望它会有所帮助。这是我使用的允许字符选择的修改版本,以及代码建议:

   my $editor = '/usr/bin/nano';
   my $allowed = 'a-zA-Z0-9.\-_/';

   # this is what I did, but you will probably not want to do this... 
   #$file =~ s/[^$allowed]//go; # Remove every character thats NOT in the OK-list

   # check that the variables contain only allowed characters
   if ($VISUAL =~ m/^[$allowed]+$/) {
      $editor = $VISUAL;
   }
   elsif ($EDITOR =~ m/^[$allowed]+$/) {
      $editor = $EDITOR;
   } 
   else {
      # message
   }

   # The code I have given above should also leave $editor in its default
   # state if neither $VISUAL nor $EDITOR has been set, as the condition
   # will not be true for empty strings/undef values.

显然,如果您发现环境变量中有您认为不应该存在的字符(即不在 $allowed 字符串中的字符),则您无法更改环境变量,但您可以检查这些字符是否存在并下降在这种情况下,回到你的默认编辑器。这只是我的谦虚建议;也许该主题的专家会在一段时间内回复,您会得到她/他的智慧盛宴:)

【讨论】:

  • 您的谦虚建议符合污点模式强制执行的最佳实践。
【解决方案2】:

您为什么需要对它们进行消毒?如果您的脚本的用户拥有VISUAL="rm -f" 和 EDITOR 到其他奇怪的东西,将会发生什么损害?在您做任何危险的事情之前,您将检查编辑器操作是否成功、文件是否已打开以及其内容在编辑后是否有意义。但是,如果用户只能损坏他们自己的文件(您没有运行一个他们可以损坏您的文件的系统,是吗?),那么就没有太多需要对它们进行清理了。提供违约是合理的;当地情况决定了nano 是否比vim 更好。

如果用户不能通过滥用 VISUAL 和 EDITOR 来损坏您的东西,那么我不会太担心他们会选择损坏自己的东西。

如果您正在编写将使用提升的权限运行的东西——例如,使用 SetUID 或 SetGID 权限——那么您必须更加担心它。 (Perl 代码缺少比担心要使用的编辑器更基本的检查。哦,但是 use autodie; 意味着脚本会自动中止错误。这对我来说听起来有点激进。但它可能确实让你原谅 - 虽然我注意到它不处理 systemexec 除非你有 use autodie qw(:all);)

【讨论】:

    【解决方案3】:

    我认为您需要对此稍有不同的看法。毕竟,您的脚本似乎需要用户交互。因此,询问用户使用哪个编辑器并不是不合理的。您可以在执行编辑器之前发出提示,如下所示:

    Which editor would you like to use [/usr/bin/vi]?

    默认值将从$ENV{EDITOR}$ENV{VISUAL} 填写,或者如果两者都未定义,则/usr/bin/nano。这样,用户就可以判断该值是否有意义。

    如果您对$ENV{EDITOR} 指向的位置有疑虑,您可能还必须对是否有人在用户路径中放置恶意可执行文件并将其命名为greateditor 或类似名称感到疑虑。

    【讨论】:

    • 那么我将不得不存储设置...如果我问,因为我知道我不想每次都回答...除了设置这些变量是什么
    • @xenoterracide 这就是为什么我通常不会担心清理这些变量的原因。当然,能够修改用户环境的恶意攻击者也能够修改您的配置文件。但是,如果您必须偏执,则可能不得不将这种不便强加给用户。另一方面,如果你需要那种程度的偏执狂,不能保证/usr/bin/vi 就是vi
    【解决方案4】:

    system 与多个参数一起使用不需要您清理任何内容,因为不会调用任何shell。您可能想先检查可执行文件是否存在,但这会使您的程序不必要地复杂化,您必须查看$PATH。像这样的环境变量通常也是受信任的。

    不过,您可能想从系统调用退出状态。你可以尝试先调用$VISUAL,如果失败,再调用$EDITOR(如果设置了$VISUAL$EDITOR应该作为后备)。

    【讨论】:

    • 我确信环境变量比用户输入更安全,但它们仍然不受您自己的控制,所以提问者是对的,最好对它们进行清理。
    • @Narveson:当你谈论不受“你”控制的事情时,这引出了“你”是谁的问题。如果“你”是运行代码的人,那么就没有问题。如果“您”是代表其运行代码的其他实体,则这是一种污染情况。这都是一个观点问题。我认为没有理由清洗您的编辑器变量;从我的角度来看,这没有任何意义。
    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2014-07-10
    相关资源
    最近更新 更多