From 1f3161362f8f846d88cc88f095e34b1670cf5e5f Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Thu, 29 Feb 2024 11:02:40 +0100 Subject: [PATCH] rust: update parser dependencies Time locked to 0.3.20 to guarantee MSRV of 1.63. Update snmp-parser to 0.10.0. Update asn1-rs to 0.6.1. Update kerberos-parser to 0.8.0. Update x509-parser 0.16.0. Update der-parser to 9.0.0. Remove specific use of der-parser 6. Ticket: #6817. Ticket: #6818. --- rust/Cargo.lock.in | 111 +++++++++++++++++++------------------------ rust/Cargo.toml.in | 18 +++---- rust/src/kerberos.rs | 14 +++--- rust/src/krb/krb5.rs | 7 +-- rust/src/smb/auth.rs | 12 ++--- 5 files changed, 73 insertions(+), 89 deletions(-) diff --git a/rust/Cargo.lock.in b/rust/Cargo.lock.in index b3013aafe412..5d7021aac7ff 100644 --- a/rust/Cargo.lock.in +++ b/rust/Cargo.lock.in @@ -69,9 +69,9 @@ dependencies = [ [[package]] name = "asn1-rs" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" dependencies = [ "asn1-rs-derive", "asn1-rs-impl", @@ -85,25 +85,25 @@ dependencies = [ [[package]] name = "asn1-rs-derive" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", - "synstructure", + "syn 2.0.39", + "synstructure 0.13.1", ] [[package]] name = "asn1-rs-impl" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] @@ -242,34 +242,11 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" -[[package]] -name = "der-oid-macro" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c73af209b6a5dc8ca7cbaba720732304792cddc933cfea3d74509c2b1ef2f436" -dependencies = [ - "num-bigint 0.4.4", - "num-traits 0.2.17", - "syn 1.0.109", -] - -[[package]] -name = "der-parser" -version = "6.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cddf120f700b411b2b02ebeb7f04dc0b7c8835909a6c2f52bf72ed0dd3433b2" -dependencies = [ - "der-oid-macro", - "nom", - "num-traits 0.2.17", - "rusticata-macros", -] - [[package]] name = "der-parser" -version = "8.2.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ "asn1-rs", "displaydoc", @@ -328,7 +305,7 @@ dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -414,11 +391,11 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "kerberos-parser" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10e7cfd4759cbce37ea65e2f48caebd695c246196a38e97ba4f731da48996da" +checksum = "dedcd80c336b8a8dc828afe2be00fb7006c48a95c2396beb0555149fb414f321" dependencies = [ - "der-parser 6.0.1", + "der-parser", "nom", "rusticata-macros", ] @@ -647,20 +624,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "oid-registry" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" dependencies = [ "asn1-rs", ] @@ -927,9 +895,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "snmp-parser" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773a26ad6742636f4259e7cc32262efb31feabd56bc34f0b2f28de9801aa24b3" +checksum = "0f93180ada23141ed2643b7b4a7b20c7efea6af9c6bdc997c15b813bfa6e2c20" dependencies = [ "asn1-rs", "nom", @@ -956,8 +924,7 @@ dependencies = [ "brotli", "byteorder", "crc", - "der-parser 6.0.1", - "der-parser 8.2.0", + "der-parser", "digest", "flate2", "hex", @@ -1044,6 +1011,17 @@ dependencies = [ "unicode-xid 0.2.4", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + [[package]] name = "test-case" version = "3.3.1" @@ -1099,21 +1077,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.13" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db76ff9fa4b1458b3c7f077f3ff9887394058460d21e634355b273aaf11eea45" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" dependencies = [ "itoa", - "libc", - "num_threads", + "serde", + "time-core", "time-macros", ] +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + [[package]] name = "time-macros" -version = "0.2.4" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] [[package]] name = "tls-parser" @@ -1198,13 +1185,13 @@ checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" [[package]] name = "x509-parser" -version = "0.15.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ "asn1-rs", "data-encoding", - "der-parser 8.2.0", + "der-parser", "lazy_static", "nom", "oid-registry", diff --git a/rust/Cargo.toml.in b/rust/Cargo.toml.in index 1e135510e9e3..03a475ed58af 100644 --- a/rust/Cargo.toml.in +++ b/rust/Cargo.toml.in @@ -39,19 +39,16 @@ hkdf = "~0.12.3" aes = "~0.7.5" aes-gcm = "~0.9.4" -der-parser = "~8.2.0" -kerberos-parser = { version = "~0.7.1", default_features = false } - -# Kerberos parsing still depends on der-parser 6.0.1. -der-parser6 = { package = "der-parser", version = "~6.0.1", default_features = false } +der-parser = { version = "~9.0.0", default_features = false } +kerberos-parser = { version = "~0.8.0", default_features = false } sawp-modbus = "~0.12.1" sawp = "~0.12.1" ntp-parser = "~0.6.0" ipsec-parser = "~0.7.0" -snmp-parser = "~0.9.0" +snmp-parser = "~0.10.0" tls-parser = "~0.11.0" -x509-parser = "~0.15.0" +x509-parser = "~0.16.0" libc = "~0.2.82" sha2 = "~0.10.2" digest = "~0.10.3" @@ -61,11 +58,10 @@ regex = "~1.5.5" lazy_static = "~1.4.0" base64 = "~0.13.0" bendy = { version = "~0.3.3", default-features = false } -asn1-rs = { version = "~0.5.2" } +asn1-rs = { version = "~0.6.1" } -# The time crate has a policy of supporting Rust versions up to 6 -# month olds, so it needs to be pinned even at the patch level. -time = "=0.3.13" +# last version to work with MSRV 1.63 +time = "=0.3.20" suricata-derive = { path = "./derive" } diff --git a/rust/src/kerberos.rs b/rust/src/kerberos.rs index e7c51cc2f28f..2b27069fe739 100644 --- a/rust/src/kerberos.rs +++ b/rust/src/kerberos.rs @@ -1,4 +1,4 @@ -/* Copyright (C) 2018 Open Information Security Foundation +/* Copyright (C) 2018-2024 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -20,11 +20,11 @@ use nom7::IResult; use nom7::error::{ErrorKind, ParseError}; use nom7::number::streaming::le_u16; -use der_parser6; -use der_parser6::der::parse_der_oid; -use der_parser6::error::BerError; +use der_parser; +use der_parser::der::parse_der_oid; +use der_parser::error::BerError; use kerberos_parser::krb5::{ApReq, PrincipalName, Realm}; -use kerberos_parser::krb5_parser::parse_ap_req; +use asn1_rs::FromDer; #[derive(Debug)] pub enum SecBlobError { @@ -57,14 +57,14 @@ pub struct Kerberos5Ticket { fn parse_kerberos5_request_do(blob: &[u8]) -> IResult<&[u8], ApReq, SecBlobError> { - let (_,b) = der_parser6::parse_der(blob).map_err(nom7::Err::convert)?; + let (_,b) = der_parser::parse_der(blob).map_err(nom7::Err::convert)?; let blob = b.as_slice().or( Err(nom7::Err::Error(SecBlobError::KrbFmtError)) )?; let parser = |i| { let (i, _base_o) = parse_der_oid(i)?; let (i, _tok_id) = le_u16(i)?; - let (i, ap_req) = parse_ap_req(i)?; + let (i, ap_req) = ApReq::from_der(i)?; Ok((i, ap_req)) }; parser(blob).map_err(nom7::Err::convert) diff --git a/rust/src/krb/krb5.rs b/rust/src/krb/krb5.rs index 3282d50ba78b..3f9ea23634c4 100644 --- a/rust/src/krb/krb5.rs +++ b/rust/src/krb/krb5.rs @@ -1,4 +1,4 @@ -/* Copyright (C) 2017-2021 Open Information Security Foundation +/* Copyright (C) 2017-2024 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -24,7 +24,8 @@ use nom7::number::streaming::be_u32; use der_parser::der::der_read_element_header; use der_parser::ber::Class; use kerberos_parser::krb5_parser; -use kerberos_parser::krb5::{EncryptionType,ErrorCode,MessageType,PrincipalName,Realm}; +use kerberos_parser::krb5::{EncryptionType,ErrorCode,MessageType,PrincipalName,Realm,KrbError}; +use asn1_rs::FromDer; use crate::applayer::{self, *}; use crate::core; use crate::core::{AppProto,Flow,ALPROTO_FAILED,ALPROTO_UNKNOWN,Direction}; @@ -203,7 +204,7 @@ impl KRB5State { self.req_id = 0; }, 30 => { - let res = krb5_parser::parse_krb_error(i); + let res = KrbError::from_der(i); if let Ok((_,error)) = res { let mut tx = self.new_tx(direction); if self.req_id > 0 { diff --git a/rust/src/smb/auth.rs b/rust/src/smb/auth.rs index 46f22bf7cffd..311a4ca73ea1 100644 --- a/rust/src/smb/auth.rs +++ b/rust/src/smb/auth.rs @@ -1,4 +1,4 @@ -/* Copyright (C) 2018 Open Information Security Foundation +/* Copyright (C) 2018-2024 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -21,12 +21,12 @@ use crate::smb::ntlmssp_records::*; use crate::smb::smb::*; use nom7::{Err, IResult}; -use der_parser6::ber::BerObjectContent; -use der_parser6::der::{parse_der_oid, parse_der_sequence}; +use der_parser::ber::BerObjectContent; +use der_parser::der::{parse_der_oid, parse_der_sequence}; fn parse_secblob_get_spnego(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError> { - let (rem, base_o) = der_parser6::parse_der(blob).map_err(Err::convert)?; + let (rem, base_o) = der_parser::parse_der(blob).map_err(Err::convert)?; SCLogDebug!("parse_secblob_get_spnego: base_o {:?}", base_o); let d = match base_o.content.as_slice() { Err(_) => { return Err(Err::Error(SecBlobError::NotSpNego)); }, @@ -59,7 +59,7 @@ fn parse_secblob_get_spnego(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError> fn parse_secblob_spnego_start(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError> { - let (rem, o) = der_parser6::parse_der(blob).map_err(Err::convert)?; + let (rem, o) = der_parser::parse_der(blob).map_err(Err::convert)?; let d = match o.content.as_slice() { Ok(d) => { SCLogDebug!("d: next data len {}",d.len()); @@ -96,7 +96,7 @@ fn parse_secblob_spnego(blob: &[u8]) -> Option Ok(s) => s, _ => { continue; }, }; - let o = match der_parser6::parse_der(n) { + let o = match der_parser::parse_der(n) { Ok((_,x)) => x, _ => { continue; }, };