13 regex security perl user-input
我的(基于Perl的)应用程序需要让用户输入正则表达式,以匹配幕后的各种字符串.到目前为止,我的计划是将字符串包装成类似的东西
$regex = eval { qr/$text/ };
if (my $error = $@) {
# mangle $error to extract user-facing message
Run Code Online (Sandbox Code Playgroud)
($text提前删除了换行符,因为它实际上是多行文本字段中的多个正则表达式split).
这样做是否存在任何潜在的安全风险 - 一些可能导致任意代码执行的奇怪输入?(除了CVE-2007-5116等正则表达式引擎中的缓冲区溢出漏洞).如果是这样,有没有办法减轻它们?
有一个更好的方法吗?任何Perl模块都有助于抽象将用户输入转换为正则表达式的操作(例如提取错误消息......或提供修饰符/i,我不在这里严格要求,但会很好)?我搜索了CPAN并没有找到很多有希望的东西,但是我觉得我错过了一些东西.
使用不受信任的输入作为正则表达式会创建拒绝服务漏洞,如perlsec中所述:
正则表达式 - Perl的正则表达式引擎被称为NFA(非确定性有限自动机),除其他外,它意味着如果正则表达式可能以多种方式匹配,它可以相当容易地消耗大量的时间和空间.仔细制作正则表达式可能有所帮助,但通常情况下确实没有多少人可以做("掌握正则表达式"一书是必读的,请参阅perlfaq2).Perl耗尽内存后,空间不足就会显现出来.
使用该(?{ code })构造,用户输入可用于执行任意代码.请参阅perlre #code中的示例以及它所说的位置
local $cnt = $cnt + 1,
Run Code Online (Sandbox Code Playgroud)
用表达式替换它
system("rm -rf /home/fennec"); print "Ha ha.\n";
Run Code Online (Sandbox Code Playgroud)
(实际上,不要这样做.)
在修道院里有一些关于这个的讨论。
域名注册地址: use re::engine::RE2 -strict => 1;
确保添加-strict => 1到您的 use 语句中,否则 re::engine::RE2 将退回到 Perl 的 re。
以下是GitHub 上项目所有者 Paul Wankadia (junyer) 的引文:
RE2 的设计和实现有一个明确的目标,即能够无风险地处理来自不受信任用户的正则表达式。它的主要保证之一是匹配时间与输入字符串的长度呈线性关系。它还考虑了生产问题:解析器、编译器和执行引擎通过在可配置的预算内工作来限制它们的内存使用——用完时优雅地失败——并且它们通过避免递归来避免堆栈溢出。
总结一下要点:
默认情况下不会执行任意代码,但添加“no re 'eval';” 以防止 PERL5OPT 或 ??别的什么?? 从把它设置在你身上。我不确定这样做是否能阻止一切。
使用带有 BSD::Resource(甚至在 Linux 上)的子进程(fork)来限制内存并在超时后杀死子进程。