多缓冲区匹配 ======================== Suricata 7及更高版本现已支持在同一事务中对多个缓冲区的内容进行匹配。 例如一个包含两条查询的DNS事务: 查询1: example.net 查询2: something.com 规则示例: .. container:: example-rule `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流量中多个请求头的匹配,使用新功能的规则示例如下: .. container:: example-rule `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协议中,同一流量记录可能包含多个请求头。现在我们可以通过多缓冲区功能以更高效的方式编写规则。 **注意** 使用粘性缓冲区时的现有行为仍然适用: 规则示例: .. container:: example-rule `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``