]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
dns: create transaction even if z-bit was set
authorJason Ish <jason.ish@oisf.net>
Tue, 21 Dec 2021 22:34:05 +0000 (16:34 -0600)
committerJason Ish <jason.ish@oisf.net>
Tue, 21 Dec 2021 22:50:06 +0000 (16:50 -0600)
It appears that DNS servers will still process a DNS request even if the
z-bit is set, our parser will fail the transaction. So create the
transaction, but still set the event.

Ticket #4924

rust/src/dns/dns.rs
src/detect-dns-query.c

index 3697208bceb0d6966365296d94f6553f340a98c9..9d47a68a27d771f675b6644b641536da3c324590 100644 (file)
@@ -393,15 +393,17 @@ impl DNSState {
                     return false;
                 }
 
-                if request.header.flags & 0x0040 != 0 {
-                    SCLogDebug!("Z-flag set on DNS response");
-                    self.set_event(DNSEvent::ZFlagSet);
-                    return false;
-                }
+                let z_flag = request.header.flags & 0x0040 != 0;
 
                 let mut tx = self.new_tx();
                 tx.request = Some(request);
                 self.transactions.push(tx);
+
+                if z_flag {
+                    SCLogDebug!("Z-flag set on DNS response");
+                    self.set_event(DNSEvent::ZFlagSet);
+                }
+
                 return true;
             }
             Err(Err::Incomplete(_)) => {
@@ -430,11 +432,7 @@ impl DNSState {
                     self.set_event(DNSEvent::NotResponse);
                 }
 
-                if response.header.flags & 0x0040 != 0 {
-                    SCLogDebug!("Z-flag set on DNS response");
-                    self.set_event(DNSEvent::ZFlagSet);
-                    return false;
-                }
+                let z_flag = response.header.flags & 0x0040 != 0;
 
                 let mut tx = self.new_tx();
                 if let Some(ref mut config) = &mut self.config {
@@ -444,6 +442,12 @@ impl DNSState {
                 }
                 tx.response = Some(response);
                 self.transactions.push(tx);
+
+                if z_flag {
+                    SCLogDebug!("Z-flag set on DNS response");
+                    self.set_event(DNSEvent::ZFlagSet);
+                }
+
                 return true;
             }
             Err(Err::Incomplete(_)) => {
index 50728041f270ec50dbb98387a04b1bc3ab08b360..c256f2a30eea4dbde7e26c60777d9520b1aa82fd 100644 (file)
@@ -829,8 +829,8 @@ static int DetectDnsQueryTest05(void)
     FLOWLOCK_WRLOCK(&f);
     r = AppLayerParserParse(NULL, alp_tctx, &f, ALPROTO_DNS, STREAM_TOCLIENT,
                             buf2, sizeof(buf2));
-    if (r != -1) {
-        printf("toserver client 1 returned %" PRId32 ", expected -1\n", r);
+    if (r != 0) {
+        printf("toserver client 1 returned %" PRId32 ", expected 0\n", r);
         FLOWLOCK_UNLOCK(&f);
         FAIL;
     }