]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb2: validate negotiate read/write max sizes
authorVictor Julien <vjulien@oisf.net>
Tue, 19 Apr 2022 06:13:48 +0000 (08:13 +0200)
committerVictor Julien <vjulien@oisf.net>
Tue, 19 Apr 2022 11:14:23 +0000 (13:14 +0200)
Raise event if they exceed the configured limit.

rust/src/smb/events.rs
rust/src/smb/smb2.rs

index 650fb7d6f63262b7876a235697db9e847ff6e662..980801e4cdff8da71a1e6869a66c5ccd2075977e 100644 (file)
@@ -31,6 +31,11 @@ pub enum SMBEvent {
     RequestToClient,
     /// A response was seen in the to server direction,
     ResponseToServer,
+
+    /// Negotiated max sizes exceed our limit
+    NegotiateMaxReadSizeTooLarge,
+    NegotiateMaxWriteSizeTooLarge,
+
     /// READ request asking for more than `max_read_size`
     ReadRequestTooLarge,
     /// READ response bigger than `max_read_size`
index 0590642a3742ff6e167e93908ab1aefb245aee7d..34c6a43573d408626ecc054496b34ff4ae34b6a6 100644 (file)
@@ -827,6 +827,15 @@ pub fn smb2_response_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
                 Ok((_, rd)) => {
                     SCLogDebug!("SERVER dialect => {}", &smb2_dialect_string(rd.dialect));
 
+                    let smb_cfg_max_read_size = unsafe { SMB_CFG_MAX_READ_SIZE };
+                    if smb_cfg_max_read_size != 0 && rd.max_read_size > smb_cfg_max_read_size {
+                        state.set_event(SMBEvent::NegotiateMaxReadSizeTooLarge);
+                    }
+                    let smb_cfg_max_write_size = unsafe { SMB_CFG_MAX_WRITE_SIZE };
+                    if smb_cfg_max_write_size != 0 && rd.max_write_size > smb_cfg_max_write_size {
+                        state.set_event(SMBEvent::NegotiateMaxWriteSizeTooLarge);
+                    }
+
                     state.dialect = rd.dialect;
                     state.max_read_size = rd.max_read_size;
                     state.max_write_size = rd.max_write_size;