6.10.1.1. 苏里塔快速模式确定解释¶
如果在规则中显式设置了“fast_pattern”关键字,则suricata将使用它作为快速模式匹配。每个规则只能设置一次“fast_pattern”关键字。如果未设置“快速模式”,Suricata会自动确定用作快速模式匹配的内容。
下面解释逻辑测量用于自动确定要使用的快速模式匹配。
请注意,如果存在正的(即非负的)内容匹配,则忽略负的内容匹配以快速确定模式。否则,将考虑否定的内容匹配。
快速模式选择标准如下:
Suricata首先标识签名中使用的具有最高“优先级”的所有内容匹配项。优先级基于匹配的缓冲区,通常“http_*”缓冲区具有更高的优先级(数字越小,优先级越高)。参见 Appendix B 有关哪个缓冲区具有什么优先级的详细信息。
在步骤1中标识的内容匹配(最高优先级的内容匹配)中,最长的(字符/字节长度)内容匹配用作快速模式匹配。
如果多个内容匹配具有相同的最高优先级并符合最长长度,则使用字符/字节多样性得分最高的内容匹配(“模式强度”)作为快速模式匹配。参见 Appendix C 有关用于确定图案强度的算法的详细信息。
如果多个内容匹配具有相同的最高优先级、最长长度和相同的最高模式强度,则为 上次注册时间 用作快速模式匹配。参见 Appendix B 不同缓冲区/列表的注册顺序。
如果多个内容匹配具有相同的最高优先级、最长长度、相同的最高模式强度,并且具有相同的列表ID(即在同一缓冲区中查找),则规则中第一个(从左到右)的内容将用作快速模式匹配。
值得注意的是,对于优先级、长度和模式强度相同的内容匹配,“http-stat-msg”、“http-stat-code”和“http-method”优先于常规的“content”匹配。
6.10.1.1.1. 附录¶
6.10.1.1.1.1. 附录A-SURICTA 1.3.4的缓冲器、列表ID值和登记顺序¶
对于Suricata 1.1.x-1.4.x,这应该差不多相同。
list_id |
内容修饰符关键字 |
缓冲区名称 |
登记令 |
---|---|---|---|
1 |
<none>(常规内容匹配) |
DETECT_SM_LIST_PMATCH |
1(第一个) |
2 |
http_uri |
DETECT_SM_LIST_UMATCH |
2 |
6 |
http_client_body |
DETECT_SM_LIST_HCBDMATCH |
3 |
7 |
http_server_body |
DETECT_SM_LIST_HSBDMATCH |
4 |
8 |
http_header |
DETECT_SM_LIST_HHDMATCH |
5 |
9 |
http_raw_header |
DETECT_SM_LIST_HRHDMATCH |
6 |
10 |
http_method |
DETECT_SM_LIST_HMDMATCH |
7 |
11 |
http_cookie |
DETECT_SM_LIST_HCDMATCH |
8 |
12 |
http_raw_uri |
DETECT_SM_LIST_HRUDMATCH |
9 |
13 |
http_stat_msg |
DETECT_SM_LIST_HSMDMATCH |
10 |
14 |
http_stat_code |
DETECT_SM_LIST_HSCDMATCH |
11 |
15 |
http_user_agent |
DETECT_SM_LIST_HUADMATCH |
12(最后) |
注:当确定Suricata 1.3.4的快速模式匹配时,注册顺序无关紧要,但List_ID值起作用。
6.10.1.1.1.2. 附录B-SURICA 2.0.7的缓冲器、列表ID值、优先级和登记顺序¶
对于Suricata 2.0.x,这应该差不多相同。
优先级(数字越小优先级越高) |
登记令 |
内容修饰符关键字 |
缓冲区名称 |
list_id |
---|---|---|---|---|
3 |
11 |
<none>(常规内容匹配) |
DETECT_SM_LIST_PMATCH |
1 |
3 |
12 |
http_method |
DETECT_SM_LIST_HMDMATCH |
12 |
3 |
13 |
http_stat_code |
DETECT_SM_LIST_HSCDMATCH |
9 |
3 |
14 |
http_stat_msg |
DETECT_SM_LIST_HSMDMATCH |
8 |
2 |
1(第一个) |
http_client_body |
DETECT_SM_LIST_HCBDMATCH |
4 |
2 |
2 |
http_server_body |
DETECT_SM_LIST_HSBDMATCH |
5 |
2 |
3 |
http_header |
DETECT_SM_LIST_HHDMATCH |
6 |
2 |
4 |
http_raw_header |
DETECT_SM_LIST_HRHDMATCH |
7 |
2 |
5 |
http_uri |
DETECT_SM_LIST_UMATCH |
2 |
2 |
6 |
http_raw_uri |
DETECT_SM_LIST_HRUDMATCH |
3 |
2 |
7 |
http_host |
DETECT_SM_LIST_HHHDMATCH |
10 |
2 |
8 |
http_raw_host |
DETECT_SM_LIST_HRHHDMATCH |
11 |
2 |
9 |
http_cookie |
DETECT_SM_LIST_HCDMATCH |
13 |
2 |
10 |
http_user_agent |
DETECT_SM_LIST_HUADMATCH |
14 |
2 |
15(最后) |
dns_query |
DETECT_SM_LIST_DNSQUERY_MATCH |
20 |
注意:当确定Suricata 2.0.7的快速模式匹配时,List_ID值并不重要,但注册顺序是。
6.10.1.1.1.3. 附录C-模式强度算法¶
从检测引擎mpm.c.基本上模式强度“score”从零开始,从左到右查看传入字节数组中的每个字符/字节。如果在数组中以前没有看到字符/字节,则如果是字母字符,则在分数上加3;如果是可打印字符,则在分数上加4;如果是可打印字符,则在分数上加0x00、0x01或0xFF;否则,在分数上加6。如果在分数加1之前看到字符/字节。最后的分数将被返回。
/** \brief Predict a strength value for patterns
*
* Patterns with high character diversity score higher.
* Alpha chars score not so high
* Other printable + a few common codes a little higher
* Everything else highest.
* Longer patterns score better than short patters.
*
* \param pat pattern
* \param patlen length of the pattern
*
* \retval s pattern score
*/
uint32_t PatternStrength(uint8_t *pat, uint16_t patlen) {
uint8_t a[256];
memset(&a, 0 ,sizeof(a));
uint32_t s = 0;
uint16_t u = 0;
for (u = 0; u < patlen; u++) {
if (a[pat[u]] == 0) {
if (isalpha(pat[u]))
s += 3;
else if (isprint(pat[u]) || pat[u] == 0x00 || pat[u] == 0x01 || pat[u] == 0xFF)
s += 4;
else
s += 6;
a[pat[u]] = 1;
} else {
s++;
}
}
return s;
}