在哪种语言中使用用户提供的正则表达式是一个安全漏洞?

问题描述 投票:12回答:8

编辑:tchrist告诉我,我对Perl不安全的最初指责是没有根据的。但问题仍然存在。

我知道在Perl中,你可以在正则表达式中嵌入任意代码,因此显然接受用户提供的正则表达式并匹配它允许任意代码执行并且是一个明显的安全漏洞。 但对于使用正则表达式的所有语言都是如此吗?所有使用“Perl兼容”正则表达式的语言都适用吗?在哪些语言中,用户提供的正则表达式是否可以安全使用,以及哪些语言允许任意代码执行或其他安全漏洞?

regex security language-features
8个回答
17
投票

在大多数语言中,允许用户提供正则表达式意味着您允许拒绝服务攻击。

某些类型的正则表达式执行起来非常麻烦。因此,一般来说,允许用户输入将在远程系统上执行的正则表达式是一个坏主意。

有关详细信息,请阅读此页:http://www.regular-expressions.info/catastrophic.html


6
投票

事实并非如此:您无法通过将它们隐藏在评估的正则表达式中来执行Perl中的代码回调。这是被禁止的。您必须使用词法范围专门覆盖它

use re "eval";

如果你希望插入和代码转义都以相同的模式发生。

看:

% perl -le '$x = "(?{ die 'naughty' })"; "aaa" =~ /$x/'
Eval-group not allowed at runtime, use re 'eval' in regex m/(?{ die naughty })/ at -e line 1.
Exit 255

% perl -Mre=eval -le '$x = "(?{ die 'naughty' })"; "aaa" =~ /$x/'
naughty at (re_eval 1) line 1.
Exit 255

2
投票

它通常是具有eval工具的动态语言,往往能够从正则表达式执行代码。在静态语言(即那些需要单独编译步骤的语言)中,通常无法执行未编译的代码,因此从正则表达式中评估代码是不可能的。

如果没有办法在正则表达式中嵌入代码,用户可以做的最糟糕的事情就是编写一个需要很长时间才能进行评估的正则表达式。


2
投票

1)在regex库中发现了漏洞,例如这个buffer overflow that affects Webkit,并且允许任何攻击者通过从javascript访问regex库来获得远程代码执行。

2)It is a DoS condition in C#.

3)由于修饰符,用户提供的正则表达式可以用于php。添加/ e修饰符会使匹配失败。在这种情况下,系统将是eval()。

preg_replace("/.*/e","system('echo /etc/passwd')");

或者以漏洞的形式:

preg_replace($_GET['regex'],$_GET['check']);


1
投票

正则表达式是一种编程语言。我认为它们并不完全是图灵完整的,但它们足够接近允许用户将它们输入您的网站IS允许其他人在您的服务器上运行代码。 QED,是的,这是一个安全漏洞。

你可能可以通过允许你想要使用的任何正则表达式语言的子集,将一组特定的结构列入白名单,使其成为一个不够大的漏洞...其他人已经提到过可能的筑巢和*的厄运。你愿意让人们加载你的服务器多少取决于你。就个人而言,我很乐意让他们有一个SQL“CONTAINS”语句,也许是“BETWEEN()”。 :)


1
投票

我怀疑红宝石会允许/#{system("rm -rf really_important_directory")}/ - 这是你担心的那种事情吗?


1
投票

无论编程语言如何,用户提供的正则表达式或一般用户输入都不应被视为安全。如果您的程序无法执行此操作,则很容易受到故意制作的输入的攻击。

在Regex的情况下,它可以是ReDos:正则表达式拒绝服务。基本上,正则表达式消耗过多的CPU和内存来处理。

例如:如果你试图评估这个正则表达式

^(([a-z])+.)+[A-Z]([a-z])+$

在这个输入上:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

你会注意到它可能会挂起 - 它被称为灾难性的回溯。在这里亲自看看:https://regex101.com/r/Qhn3Vb/1

阅读更多关于Regex DoS的信息:https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS


底线:永远不要假设用户输入是安全的!


0
投票

AFAIK,您可以在C#中安全地执行它:您可以将正则表达式字符串提供给Regex构造函数,如果它无法解析它将抛出。我不确定别人。

© www.soinside.com 2019 - 2024. All rights reserved.