10.75. 多缓冲区匹配¶
Suricata 7及更高版本现已支持在同一事务中对多个缓冲区的内容进行匹配。
例如一个包含两条查询的DNS事务:
查询1: example.net 查询2: something.com
规则示例:
alert dns $HOME_NET any -> $EXTERNAL_NET any (msg:"DNS多问题示例规则"; dns.query; content:"example"; dns.query; content:".com"; classtype:misc-activity; sid:1; rev:1;)
在这个单一的DNS查询事务中,存在两个查询,Suricata将为每个查询建立独立的dns.query缓冲区实例。
第一个 dns.query
缓冲区将匹配content:"example";
第二个 dns.query
缓冲区将匹配content:".com";
该示例规则会在example查询上触发告警,因为规则中的所有内容匹配条件均得到满足。
对于HTTP2流量中多个请求头的匹配,使用新功能的规则示例如下:
alert http2 any any -> any any (msg:"HTTP2多请求头缓冲区示例"; flow:established,to_server; http.request_header; content:"method|3a 20|GET"; http.request_header; content:"authority|3a 20|example.com"; classtype:misc-activity; sid:1; rev:1;)
在HTTP2协议中,同一流量记录可能包含多个请求头。现在我们可以通过多缓冲区功能以更高效的方式编写规则。
注意 使用粘性缓冲区时的现有行为仍然适用:
规则示例:
alert dns $HOME_NET any -> $EXTERNAL_NET any (msg:"DNS查询粘性缓冲区经典示例规则"; dns.query; content:"example"; content:".net"; classtype:misc-activity; sid:1; rev:1;)
上述规则会在包含"example.net"或"example.domain.net"的DNS查询上触发告警,因为规则内容匹配都在同一个 dns.query
缓冲区内完成,且满足所有内容匹配要求。
注意: 这是新行为。在Suricata 7之前的版本中,重复声明相同的粘性缓冲区不会创建新的缓冲区实例。例如:
dns.query; content:"example"; dns.query; content:".com";
等价于:
dns.query; content:"example"; content:".com";
以前文示例为例,第一个查询example.net匹配content:"example"但不匹配content:".com"; 第二个查询something.com匹配content:".com"但不匹配content:"example";
因此在Suricata 7之前的版本中,由于无法同时满足两个内容条件,该签名不会触发告警。
当前支持多缓冲区匹配的关键字包括:
dns.answer.name
dns.query.name
dns.query
email.received
email.url
file.data
file.magic
file.name
http.request_header
http.response_header
http2.header_name
ike.vendor
krb5_cname
krb5_sname
ldap.request.attribute_type
ldap.responses.attribute_type
ldap.responses.dn
ldap.responses.message
mqtt.subscribe.topic
mqtt.unsubscribe.topic
quic.cyu.hash
quic.cyu.string
sip.content_length
sip.content_type
sip.from
sip.to
sip.ua
sip.via
smtp.rcpt_to
tls.alpn
tls.cert_subject
tls.certs
tls.subjectaltname