]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
dns/probe: adds check for 0 records and big size
authorPhilippe Antoine <pantoine@oisf.net>
Wed, 2 Oct 2024 12:30:15 +0000 (14:30 +0200)
committerVictor Julien <victor@inliniac.net>
Fri, 20 Dec 2024 06:55:46 +0000 (07:55 +0100)
Ticket: 7279

Make dns probing function stricter to avoid matching on non-DNS
on port 53 and later returning a app-layer error.

rust/src/dns/dns.rs

index ce67e577df1dc29e2b4882774fe4cd5654733214..11ebfb1a4c1c483acc740abc6eadf5e3cf3e9e10 100644 (file)
@@ -770,19 +770,24 @@ impl DNSState {
 const DNS_HEADER_SIZE: usize = 12;
 
 fn probe_header_validity(header: &DNSHeader, rlen: usize) -> (bool, bool, bool) {
-    let min_msg_size = 2
-        * (header.additional_rr as usize
-            + header.answer_rr as usize
-            + header.authority_rr as usize
-            + header.questions as usize)
-        + DNS_HEADER_SIZE;
+    let nb_records = header.additional_rr as usize
+        + header.answer_rr as usize
+        + header.authority_rr as usize
+        + header.questions as usize;
 
+    let min_msg_size = 2 * nb_records;
     if min_msg_size > rlen {
         // Not enough data for records defined in the header, or
         // impossibly large.
         return (false, false, false);
     }
 
+    if nb_records == 0 && rlen > DNS_HEADER_SIZE {
+        // zero fields, data size should be just DNS_HEADER_SIZE
+        // happens when DNS server returns format error
+        return (false, false, false);
+    }
+
     let is_request = header.flags & 0x8000 == 0;
     return (true, is_request, false);
 }