]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust/nfs4: Add NFSPROC4_SECINFO_NO_NAME op parsers
authorSam Muhammed <ghostinthehive.vx@gmail.com>
Sun, 20 Feb 2022 12:47:08 +0000 (14:47 +0200)
committerVictor Julien <vjulien@oisf.net>
Fri, 4 Mar 2022 15:50:55 +0000 (16:50 +0100)
rust/src/nfs/nfs4_records.rs
rust/src/nfs/types.rs

index 61915b06763d76ba6ebf8f7e3768617bd74dd940..e49e8e3bc19ad373caf1dbb8c53a3a1a42ab22ca 100644 (file)
@@ -30,6 +30,8 @@ const OPEN_DELEGATE_NONE:    u32 = 0;
 const OPEN_DELEGATE_READ:    u32 = 1;
 const OPEN_DELEGATE_WRITE:   u32 = 2;
 
+const RPCSEC_GSS: u32 = 6;
+
 // Maximum number of operations per compound
 // Linux defines NFSD_MAX_OPS_PER_COMPOUND to 16 (tested in Linux 5.15.1).
 const NFSD_MAX_OPS_PER_COMPOUND: usize = 64;
@@ -62,6 +64,7 @@ pub enum Nfs4RequestContent<'a> {
     Sequence(Nfs4RequestSequence<'a>),
     CreateSession(Nfs4RequestCreateSession<'a>),
     ReclaimComplete(u32),
+    SecInfoNoName(u32),
 }
 
 #[derive(Debug,PartialEq)]
@@ -230,7 +233,6 @@ fn nfs4_req_open_exclusive4(i: &[u8]) -> IResult<&[u8], Nfs4OpenRequestContent>
     map(take(8_usize), Nfs4OpenRequestContent::Exclusive4)(i)
 }
 
-
 fn nfs4_req_open_type(i: &[u8]) -> IResult<&[u8], Nfs4OpenRequestContent> {
     let (i, mode) = be_u32(i)?;
     let (i, data) = match mode {
@@ -308,6 +310,10 @@ fn nfs4_req_remove(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent> {
     map(nfs4_parse_nfsstring, Nfs4RequestContent::Remove)(i)
 }
 
+fn nfs4_req_secinfo_no_name(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent> {
+    map(be_u32, Nfs4RequestContent::SecInfoNoName) (i)
+}
+
 #[derive(Debug,PartialEq)]
 pub struct Nfs4RequestSetAttr<'a> {
     pub stateid: Nfs4StateId<'a>,
@@ -494,6 +500,7 @@ fn parse_request_compound_command(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent
         NFSPROC4_EXCHANGE_ID => nfs4_req_exchangeid(i)?,
         NFSPROC4_CREATE_SESSION => nfs4_req_create_session(i)?,
         NFSPROC4_RECLAIM_COMPLETE => nfs4_req_reclaim_complete(i)?,
+        NFSPROC4_SECINFO_NO_NAME => nfs4_req_secinfo_no_name(i)?,
         _ => { return Err(Err::Error(make_error(i, ErrorKind::Switch))); }
     };
     Ok((i, cmd_data))
@@ -544,6 +551,7 @@ pub enum Nfs4ResponseContent<'a> {
     Sequence(u32, Option<Nfs4ResponseSequence<'a>>),
     CreateSession(u32, Option<Nfs4ResponseCreateSession<'a>>),
     ReclaimComplete(u32),
+    SecInfoNoName(u32),
 }
 
 #[derive(Debug, PartialEq)]
@@ -739,6 +747,34 @@ fn nfs4_res_open(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> {
     Ok((i, Nfs4ResponseContent::Open(status, open_data)))
 }
 
+
+// #[derive(Debug, PartialEq)]
+// pub struct Nfs4FlavorRpcSecGss<'a> {
+//     pub oid: &'a[u8],
+//     pub qop: u32,
+//     pub service: u32,
+// }
+
+fn nfs4_parse_rpcsec_gss(i: &[u8]) -> IResult<&[u8], u32> {
+    let (i, _oid) = nfs4_parse_nfsstring(i)?;
+    let (i, _qop) = be_u32(i)?;
+    let (i, _service) = be_u32(i)?;
+    Ok((i, RPCSEC_GSS))
+}
+
+fn nfs4_parse_flavors(i: &[u8]) -> IResult<&[u8], u32> {
+    let (i, flavor_type) = be_u32(i)?;
+    let (i, _flavor) = cond(flavor_type == RPCSEC_GSS, nfs4_parse_rpcsec_gss)(i)?;
+    Ok((i, flavor_type))
+}
+
+fn nfs4_res_secinfo_no_name(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> {
+    let (i, status) = be_u32(i)?;
+    let (i, flavors_cnt) = be_u32(i)?;
+    let (i, _flavors) = count(nfs4_parse_flavors, flavors_cnt as usize)(i)?;
+    Ok((i, Nfs4ResponseContent::SecInfoNoName(status)))
+}
+
 #[derive(Debug,PartialEq)]
 pub struct Nfs4ResponseReaddirEntry<'a> {
     pub name: &'a[u8],
@@ -958,6 +994,7 @@ fn nfs4_res_compound_command(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> {
         NFSPROC4_RENEW => nfs4_res_renew(i)?,
         NFSPROC4_CREATE_SESSION => nfs4_res_create_session(i)?,
         NFSPROC4_RECLAIM_COMPLETE => nfs4_res_reclaim_complete(i)?,
+        NFSPROC4_SECINFO_NO_NAME => nfs4_res_secinfo_no_name(i)?,
         _ => { return Err(Err::Error(make_error(i, ErrorKind::Switch))); }
     };
     Ok((i, cmd_data))
index f20f1a29463bec67362893483eeff5c05281235a..acee8a4d3bbc3a2c494b549e1573b33b21a60e2f 100644 (file)
@@ -275,6 +275,7 @@ pub const NFSPROC4_WRITE:               u32 = 38;
 pub const NFSPROC4_RELEASE_LOCKOWNER:   u32 = 39;
 pub const NFSPROC4_EXCHANGE_ID:         u32 = 42;
 pub const NFSPROC4_CREATE_SESSION:      u32 = 43;
+pub const NFSPROC4_SECINFO_NO_NAME:     u32 = 52;
 pub const NFSPROC4_SEQUENCE:            u32 = 53;
 pub const NFSPROC4_RECLAIM_COMPLETE:    u32 = 58;