From d38c6c0ef8b306bfd1a5542649b07f738954833d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sven=20Sch=C3=B6ling?= Date: Thu, 21 Jul 2016 11:23:35 +0200 Subject: [PATCH] Sicherheit: ReDoS in trim() umgehen. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit trim hat bisher whitespace mit dem regex /^\p{WSpace}+|\p{WSpace}+$/ getrimmt. Der ist aber anfällig gegen große Mengen Whitespace in der Mitte, weil dann das Backtracking in O(n²) läuft: $_ = "--".(" "x200000)."and more"; s/^\p{WSpace}+|\p{WSpace}+$//; -> 0m16.572s Für genau den Fall hat die Perl Engine aber Optimierungen, die bei Regexes die rechts geankert sind einfach von hinten sucht. Die funktionieren aber nur wenn einzeln gesucht wird. Also sind das jetzt zwei separate Regexes. $_ = "--".(" "x200000)."and more"; s/^\p{WSpace}+//; s/\p{WSpace}+$//; -> 0m0.022s --- SL/Util.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SL/Util.pm b/SL/Util.pm index 9022d939b..bf2e9ff41 100644 --- a/SL/Util.pm +++ b/SL/Util.pm @@ -33,7 +33,8 @@ sub snakify { sub trim { my $value = shift; - $value =~ s{^ \p{WSpace}+ | \p{WSpace}+ $}{}xg if defined($value); + $value =~ s{^ \p{WSpace}+ }{}xg if defined($value); + $value =~ s{ \p{WSpace}+ $}{}xg if defined($value); return $value; } -- 2.20.1