Merge in SNORT/snort3 from ~OSHUMEIK/snort3:js_regex_grp_limit to master
Squashed commit of the following:
commit
07c377d4a4c4e3aea177047747fbe61fcf1a4b27
Author: Oleksii Shumeiko <oshumeik@cisco.com>
Date: Mon Apr 11 11:43:30 2022 +0300
utils: limit JS regex stack size
The 'http_inspect.js_norm_max_tmpl_nest' configuration option controls the limit.
ALIAS_VALUE // var a = eval
};
+ template <class T>
+ using VStack = std::stack<T, std::vector<T>>;
+
public:
enum JSRet
{
bool mixed_encoding_seen = false;
uint8_t max_template_nesting;
- std::stack<uint16_t, std::vector<uint16_t>> brace_depth;
+ VStack<uint16_t> brace_depth;
JSToken token = UNDEFINED;
ASIGroup previous_group = ASI_OTHER;
JSIdentifierCtxBase& ident_ctx;
size_t bytes_read;
size_t tmp_bytes_read;
bool ext_script;
- std::stack<char> regex_stack;
+ VStack<char> regex_stack;
struct
{
if (tmp_buffer)
switch_to_initial();
- brace_depth = std::stack<uint16_t, std::vector<uint16_t>>();
+ brace_depth = VStack<uint16_t>();
token = UNDEFINED;
previous_group = ASI_OTHER;
yyless(1);
BEGIN(regex);
set_ident_norm(true);
- regex_stack = std::stack<char>();
+ regex_stack = VStack<char>();
return EOS;
}
JSTokenizer::JSRet JSTokenizer::literal_regex_g_open()
{
+ if (regex_stack.size() >= max_template_nesting)
+ return TEMPLATE_NESTING_OVERFLOW;
+
regex_stack.push(yytext[0]);
ECHO;
return EOS;
static const char syntax_cases_expected23[] =
"`${`${`${`${`";
+static const char syntax_cases_buf24[] =
+ "var a=/[[[[/]]]]/;"
+ "var b=/[[[[[/]]]]]/;";
+
+static const char syntax_cases_expected24[] =
+ "var a=/[[[[/]]]]/;"
+ "var b=/[[[[";
+
TEST_CASE("syntax cases", "[JSNormalizer]")
{
SECTION("variables")
}
}
-TEST_CASE("template literal overflow", "[JSNormalizer]")
+TEST_CASE("braces overflow", "[JSNormalizer]")
{
SECTION("exceeding template literal limit")
{
VALIDATE_FAIL(syntax_cases_buf23, syntax_cases_expected23,
JSTokenizer::TEMPLATE_NESTING_OVERFLOW, 15);
}
+ SECTION("exceeding regex literal limit")
+ {
+ NORMALIZE(syntax_cases_buf24);
+ VALIDATE_FAIL(syntax_cases_buf24, syntax_cases_expected24,
+ JSTokenizer::TEMPLATE_NESTING_OVERFLOW, 30);
+ }
}
static const char asi_cases_buf0[] =