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