"version": {
"type": "integer"
},
+ "opcode": {
+ "description": "DNS opcode as an integer",
+ "type": "integer"
+ },
"answers": {
"type": "array",
"minItems": 1,
},
"z": {
"type": "boolean"
+ },
+ "opcode": {
+ "description": "DNS opcode as an integer",
+ "type": "integer"
}
},
"additionalProperties": false
},
"version": {
"type": "integer"
+ },
+ "opcode": {
+ "description": "DNS opcode as an integer",
+ "type": "integer"
}
},
"additionalProperties": false
alert dns any any -> any any (msg:"SURICATA DNS Not a response"; flow:to_client; app-layer-event:dns.not_a_response; classtype:protocol-command-decode; sid:2240005; rev:2;)
# Z flag (reserved) not 0
alert dns any any -> any any (msg:"SURICATA DNS Z flag set"; app-layer-event:dns.z_flag_set; classtype:protocol-command-decode; sid:2240006; rev:2;)
+alert dns any any -> any any (msg:"SURICATA DNS Invalid opcode"; app-layer-event:dns.invalid_opcode; classtype:protocol-command-decode; sid:2240007; rev:1;)
NotRequest,
NotResponse,
ZFlagSet,
+ InvalidOpcode,
}
#[derive(Debug, PartialEq, Eq)]
}
let z_flag = request.header.flags & 0x0040 != 0;
+ let opcode = ((request.header.flags >> 11) & 0xf) as u8;
let mut tx = self.new_tx();
tx.request = Some(request);
self.set_event(DNSEvent::ZFlagSet);
}
+ if opcode >= 7 {
+ self.set_event(DNSEvent::InvalidOpcode);
+ }
+
return true;
}
Err(Err::Incomplete(_)) => {
}
let z_flag = response.header.flags & 0x0040 != 0;
+ let opcode = ((response.header.flags >> 11) & 0xf) as u8;
let mut tx = self.new_tx();
if let Some(ref mut config) = &mut self.config {
self.set_event(DNSEvent::ZFlagSet);
}
+ if opcode >= 7 {
+ self.set_event(DNSEvent::InvalidOpcode);
+ }
+
return true;
}
Err(Err::Incomplete(_)) => {
const DNS_HEADER_SIZE: usize = 12;
fn probe_header_validity(header: DNSHeader, rlen: usize) -> (bool, bool, bool) {
- let opcode = ((header.flags >> 11) & 0xf) as u8;
- if opcode >= 7 {
- //unassigned opcode
- return (false, false, false);
- }
if 2 * (header.additional_rr as usize
+ header.answer_rr as usize
+ header.authority_rr as usize
js.set_bool("z", true)?;
}
+ let opcode = ((header.flags >> 11) & 0xf) as u8;
+ js.set_uint("opcode", opcode as u64)?;
+
if let Some(query) = response.queries.first() {
js.set_string_from_bytes("rrname", &query.name)?;
js.set_string("rrtype", &dns_rrtype_string(query.rrtype))?;
if request.header.flags & 0x0040 != 0 {
jb.set_bool("z", true)?;
}
+ let opcode = ((request.header.flags >> 11) & 0xf) as u8;
+ jb.set_uint("opcode", opcode as u64)?;
return Ok(true);
}
}