]> git.ipfire.org Git - thirdparty/suricata.git/log
thirdparty/suricata.git
3 years agodetect/iponly: add tests for 5170 7104/head
Victor Julien [Tue, 1 Mar 2022 11:44:01 +0000 (12:44 +0100)] 
detect/iponly: add tests for 5170

(cherry picked from commit 935ea745f5e38b49713ae77d86b57ce7260917a4)

3 years agodetect/address: minor unittest cleanup
Victor Julien [Tue, 1 Mar 2022 11:43:25 +0000 (12:43 +0100)] 
detect/address: minor unittest cleanup

(cherry picked from commit 053b2b3b5b1197064bba5d59d4731c5789ff7239)

3 years agodetect/iponly: validate netmask
Victor Julien [Tue, 1 Mar 2022 11:42:49 +0000 (12:42 +0100)] 
detect/iponly: validate netmask

Only accept netmask in dotted quad notation if they can be turned
into a CIDR.

According to rfc 4632, CIDR (compat) netmasks are all that should be
used.

Bug: #5168.
(cherry picked from commit 79b7b7a0ddfdcd7664ca328a41d24fbca75e3e54)

3 years agodetect/address: validate netmasks
Victor Julien [Tue, 1 Mar 2022 11:41:04 +0000 (12:41 +0100)] 
detect/address: validate netmasks

Only accept netmask in dotted quad notation if they can be turned
into a CIDR.

According to rfc 4632, CIDR (compat) netmasks are all that should be
used.

Bug: #5168.
(cherry picked from commit 259bd8aa92c7bc8ca8c74b3f429f321935493828)

3 years agodetect/iponly: break out range insert code
Victor Julien [Mon, 28 Feb 2022 21:31:58 +0000 (22:31 +0100)] 
detect/iponly: break out range insert code

So we can reuse it.

(cherry picked from commit 4020e2faa7ee93dfed663b4b0795644572ddfd79)

3 years agoutil/cidr: add util to convert netmask to cidr
Victor Julien [Tue, 1 Mar 2022 11:41:49 +0000 (12:41 +0100)] 
util/cidr: add util to convert netmask to cidr

(cherry picked from commit a67b97e14c08f46f50c1acd989f0dc049a8e4cba)

3 years agonfs: clean up partial record handling
Victor Julien [Mon, 21 Feb 2022 17:10:44 +0000 (18:10 +0100)] 
nfs: clean up partial record handling

There should be no remaining data after parsing the partial
RPC record, so don't handle it but instead add a debug validation
bug on.

Successful processing for NFSv3 read/write records returns
AppLayerResult::ok() directly as all data is consumed.

(cherry picked from commit 07b110071331f5023a70710a90f50b9a500a518b)

3 years agonfs3: improve read validation; fix partial handling
Victor Julien [Mon, 21 Feb 2022 19:30:45 +0000 (20:30 +0100)] 
nfs3: improve read validation; fix partial handling

(cherry picked from commit d85b77cad064bd88c921b2f3d520fe526ad8ff82)

3 years agonfs3: fix partial write record handling
Victor Julien [Mon, 21 Feb 2022 19:30:35 +0000 (20:30 +0100)] 
nfs3: fix partial write record handling

Comment from Jason Ish: This was a bit more than a cherry pick as some
of the modifications weren't directly portable to the nom macros. So
instead bring in some of the nom function based parsers as they work
fine with nom 5.

(cherry picked from commit 4418fc1b02f47533439fe00789d9c850a24271b2)

3 years agonfs3: enforce more values
Victor Julien [Sun, 20 Feb 2022 22:02:13 +0000 (23:02 +0100)] 
nfs3: enforce more values

Enforce values of a number of u32's that are used as bools or for
really low values.

(cherry picked from commit 5baf94e40ddeb3deab97a897b9da2e93ece4c654)

3 years agorpc: enforce various field values
Victor Julien [Mon, 21 Feb 2022 09:08:41 +0000 (10:08 +0100)] 
rpc: enforce various field values

Minimal frag_len. Correct msgtype and others.

(cherry picked from commit 1c57e3c18d746743bc2cbcaba35f78b5f9b15675)

3 years agonfs/rpc: update full record parsers to be more exact
Victor Julien [Sun, 20 Feb 2022 09:00:48 +0000 (10:00 +0100)] 
nfs/rpc: update full record parsers to be more exact

Instead of 'take'ing all data for the RPC prog_data and then
letting the higher level parsers figure out which part to use
take the exact amount.

Comments from Shivani Bhardwaj: This is was more than a cherry pick and
some of the modifications were not directly portable to the nom macros.
So, parsers were changed to make sure the functionality remained same while
making the transition to nom5 while keeping the diff minimal.

(cherry picked from commit 64d8a1e16e07148a8b5839452be3f7481e4e3623)

3 years agonfs: break out partial record handling
Victor Julien [Sun, 20 Feb 2022 07:59:05 +0000 (08:59 +0100)] 
nfs: break out partial record handling

(cherry picked from commit bfb5ae867e083f4146b2455309387f77fac5623c)

3 years agonfs/rpc: enforce length field limits
Victor Julien [Sat, 19 Feb 2022 07:42:35 +0000 (08:42 +0100)] 
nfs/rpc: enforce length field limits

Limits based on the Linux kernel limits. Then multiplied a few times
to allow for other implementations to have higher limits.

(cherry picked from commit fe76ab1803bea02f47f691b5944ba319a3bc0300)

3 years agonfs4: verify bool fields
Victor Julien [Mon, 21 Feb 2022 11:20:13 +0000 (12:20 +0100)] 
nfs4: verify bool fields

(cherry picked from commit 5ecb626e50048cfa43ad67cdd80307377e90926c)

3 years agooutput: fix timestamp missing usecs
Victor Julien [Fri, 18 Feb 2022 09:19:04 +0000 (10:19 +0100)] 
output: fix timestamp missing usecs

On ARM 32bit with Musl `tv_usecs` is defined as `int64_t` which lead to
CreateIsoTimeString() printing all zeros on the usecs. Work around this
by first assigning to a `int64_t` and then updating the expected format
string to accept `int64_t`.

Bug: #5094.
(cherry picked from commit a0c0471f1f51af0171ed5df1e2de0b900651bc19)

3 years agodetect/address: use common cidr code
Victor Julien [Thu, 17 Feb 2022 15:53:43 +0000 (16:53 +0100)] 
detect/address: use common cidr code

(cherry picked from commit 8a73b242e389a5dbc223de83e2e7542bc46903d8)

3 years agoradix: fix unittests after stict checks
Victor Julien [Thu, 17 Feb 2022 12:35:45 +0000 (13:35 +0100)] 
radix: fix unittests after stict checks

(cherry picked from commit 38aec1439c7fffc49144ae5ccb38da2d462c85d9)

3 years agoradix: improve address range handling
Victor Julien [Thu, 17 Feb 2022 12:32:17 +0000 (13:32 +0100)] 
radix: improve address range handling

Handle non-exact address ranges from string. This can come directly
from user input, so here it is accepted but the address is converted
to the address range start. A warning will be issued.

Debug validation checks are added to catch this.

This issue could lead to bad input from iprep (with cidr), defrag config
and htp server personalities to produce a bad radix tree.

Bug: #5084.
Bug: #5085.
Bug: #5086.
(cherry picked from commit 7fd6fe732b360d4f1de4483b539af2eda813b966)

3 years agodetect/iponly: fix netmask handling
Victor Julien [Tue, 15 Feb 2022 19:43:27 +0000 (20:43 +0100)] 
detect/iponly: fix netmask handling

If the ipaddress was not the address range start, it was not masked to turn
it into that. So 1.2.3.4/24 was not stored as address 1.2.3.0 with netmask 24,
but as 1.2.3.4 with netmask 24. This was then propagated into the radix tree,
where it was used as an exact key in exact lookups, giving unexpected results.

This patch implements the netmask handling for IPv4 and IPv6, and adds a set
of tests for it.

Bug: #5081.
Bug: #5066.
(cherry picked from commit 51d4e0dced9cac7463ee924b00bc8666c68b20c3)

3 years agoradix: fix unittest not cleaning up
Victor Julien [Tue, 15 Feb 2022 13:44:08 +0000 (14:44 +0100)] 
radix: fix unittest not cleaning up

(cherry picked from commit 311085dd34c445b8d9195c8517475b764a61eb3b)

3 years agodetect/iponly: update SigNumArray comment
Victor Julien [Sat, 12 Feb 2022 07:23:03 +0000 (08:23 +0100)] 
detect/iponly: update SigNumArray comment

(cherry picked from commit 860daceb04301850bc059e73c7344cb843248bf9)

3 years agoradix: cleanup test
Victor Julien [Fri, 11 Feb 2022 14:53:41 +0000 (15:53 +0100)] 
radix: cleanup test

(cherry picked from commit d04dface20657e781f683c30f159afcefa5ac1ea)

3 years agoradix: add tests for Bug #5066
Victor Julien [Fri, 11 Feb 2022 14:52:51 +0000 (15:52 +0100)] 
radix: add tests for Bug #5066

Bug: #5066.
(cherry picked from commit 89b7ac0a60bf83c69bbd9f4f45be128524ff3999)

3 years agoradix: fix FP/FN issue in IP-only
Victor Julien [Fri, 11 Feb 2022 14:50:01 +0000 (15:50 +0100)] 
radix: fix FP/FN issue in IP-only

A bug was reported about the IP-only rules not correctly matching. This was
traced to the rules in question not getting recorded into the IP-only radix
tree correctly.

Sequence:

- 100.117.241.0/25 inserted into the tree

- 100.117.241.0/26 inserted into the tree

Both are part of the same radix node, but recorded by their different netmasks
in the user data portion.

Then faulty insert happens:

- 100.117.241.64/26

For reference, these net blocks compute to:

- 100.117.241.0/25:  100.117.241.0  - 100.117.241.127
- 100.117.241.0/26:  100.117.241.0  - 100.117.241.63
- 100.117.241.64/26: 100.117.241.64 - 100.117.241.127

The IP-only engine first does a search to get to the user data it may need to
include. It does so for with `SCRadixFindKeyIPV4ExactMatch` for single IPs, or
using `SCRadixFindKeyIPV4Netblock` in case of a netblock. Any "match" from
either of these is considered an "exact match" by the IP-only setup code.

This exact match expectation turned out to be wrong and
`SCRadixFindKeyIPV4Netblock` behaved more like "best match" instead, which is
a non-exact match, but its the next best match if no exact match is found.

The way the look up for 100.117.241.64/26 went wrong, is that it returned
the user data for 100.117.241.0/26. This happens as follows:

- first it would do an exact find, which didn't give a result

- then it removed bits from the keystream until it found a matching node
  and explore if any of the netmasks it contained matched. Here the first
  step of the bug started:

  it considered the netmask (with user data) a match that matched the
  number of bits of the matching key, but not of the actual range netmask cidr
  value.

  So in this case the number of shared bits between `100.117.241.0/25` and
  `100.117.241.64/26` was 25, so it assumed that the user data for the
  netmask 25 was the match.

  To summarize this step, there are 2 problems with this:
  1. it returns a match on something that isn't an exact match
  2. it considered the wrong netmask value

- the radix code then took the returned node, and did the netmask check
  again. This time it did use its own netmask value, so this time
  it did find the netmask 26 (+ user data). However because of the node that
  was returned, this netmask (+user data) belongs to `100.117.241.0`, not to
  `100.117.241.64`.

- the IP-only detection code was satisfied with what it assumed to be
  "exact match" and just updated the user data to include the user data that
  should have been associated with `100.117.241.64/26` to `100.117.241.0/26`.

This patch addresses the issue as follows:

It makes `SCRadixFindKeyIPV4Netblock` also return an exact match by propagating
the netmask in the search and in the evaluation of the stored netmasks.

It does away with the secondary netmask (+user data) evaluation.
`SCRadixFindKeyIPV4Netblock` is expected to handle this correctly.

The IP-only engine will fall back to the "not found" path, which does an explicit
"best match" lookup and then insert a new entry into the radix tree based on
the user data of the "best match".

Issue was present for IPv6 as well.

Bug: #5066.
(cherry picked from commit 6aa6e3f95372e256006b78e921391d88c1010f15)

3 years agodetect/iponly: cleanups
Victor Julien [Thu, 10 Feb 2022 08:04:23 +0000 (09:04 +0100)] 
detect/iponly: cleanups

(cherry picked from commit 6381b1a643bb9cc4ea8860def42b633a70c35e3e)

3 years agodetect/iponly: minor debug 'Print' improvements
Victor Julien [Thu, 10 Feb 2022 07:50:07 +0000 (08:50 +0100)] 
detect/iponly: minor debug 'Print' improvements

(cherry picked from commit de4354abcbbce376bc3047311561d0fbf16e4569)

3 years agoradix: minor debug 'Print' improvements
Victor Julien [Thu, 10 Feb 2022 07:49:17 +0000 (08:49 +0100)] 
radix: minor debug 'Print' improvements

(cherry picked from commit 3ca3c9dfbee112cc061ee0f3f7bbd5bde92a849d)

3 years agoutil/cidr: simplify IPv4 CIDR handling; add IPv6
Victor Julien [Thu, 17 Feb 2022 09:56:53 +0000 (10:56 +0100)] 
util/cidr: simplify IPv4 CIDR handling; add IPv6

Instead of building a table at init just calculate it on demand.

Callsites are all during init, so its not performance critical.

Add similar function for IPv6.

(cherry picked from commit e04d378e587d99fa40e1b237c0ef4db5cfde1902)

3 years agomqtt: parse properties with the right buffer's length
Philippe Antoine [Sun, 23 Jan 2022 20:30:22 +0000 (21:30 +0100)] 
mqtt: parse properties with the right buffer's length

(cherry picked from commit f0e869b26b6e913714db03b85039a0af38094419)

3 years agodcerpc: remove prev_tx_call_id and clear_bind_cache from DCERPCState
Eloy Pérez González [Thu, 4 Nov 2021 14:20:14 +0000 (15:20 +0100)] 
dcerpc: remove prev_tx_call_id and clear_bind_cache from DCERPCState

remove those fields since are not used because of the removal of
handle_bind_cache.

(cherry picked from commit 15f493f516a452ca810f77595fb57f8e2e96d6e3)

3 years agodcerpc: avoid delete the rpc state interface context
Eloy Pérez González [Fri, 22 Oct 2021 13:32:41 +0000 (15:32 +0200)] 
dcerpc: avoid delete the rpc state interface context

The bug:
The dcerpc dce_iface keyword just match the packet following the bind. Only the
next request after the rpc is sent will match. However the expected behaviour it
that all the rpc requests/responses sent under the context of the given
interface would match.

In the Open Group c706 the following is indicated:

In 2.2.1 Binding-related Operations, indicates that one category of binding
operations are those that "operations that establish internal call routing
information for the server." (The other are to establish the protocol which is
not relevant here). And the following statement can be found:

Operations in the second category establish a set of mappings that the server
can use to route calls internally to the appropriate manager routine. This
routing is based on the interface and version, operation and any object
requested by the call.

It indicates that server routes (to call methods) are based on the operation,
interface and object.

- Operation: To indicate the method to call, and operation number is
             specified as indicated in the second step of 2.3.3.2 (Client
             Binding Steps).
- Interface: An interface is a set of remotely callable operations offered by a
             server and invokable by clients. (2.1.1.1)
- Object: Is the manager that implements the interface, as stated in section
          Interface and Manager Selection of 2.3.3.3. It is not mandatory, can
          be nil.

To call a method, a client must send a request message as defined in 2.6.4.9,
that contains these identifiers:

- opnum: The opnum field identifies the operation being invoked within the
         interface.
- p_cont_id (Context ID in Wireshark): The p_cont_id field holds a presentation
                                       context identifier that identifies the
                                       data representation and interface, as
                                       defined in 12.6.3.4 (Context Identifiers).
- object: The object field is contained if the PFC_OBJECT_UUID is set. (Could be
          interesting to create a keyword dce_object for matching this UUID)

Therefore, to get the correct method to invoke, the server must map the context
to the correct interface. This is negotiated by the bind request

Interfaces are first negotiated using the bind message (12.6.4.3), contained in
the p_context_elem array. Then they are accepted or rejected using the bind_ack
message (12.6.4.4).

Once these contexts are established, both client and server can use the context
id, which is the index of the p_context_elem array, to refer the interface they
are using.

Moreover, in the middle of the connection, the context can be changed with the
alter_context message.

This is way suricata shouldn't delete the bindack attribute, that contains
the contexts, used by match_backuuid. This is the only way to know the interface
a request message is referring to.

ticket: 4769
https://redmine.openinfosecfoundation.org/issues/4769

(cherry picked from commit 1aca2676a6965056582c3da85e4bb2058aca43b0)

3 years agosmb/dce_iface: avoid deleting current ifaces from state
Eloy Pérez González [Fri, 22 Oct 2021 11:53:39 +0000 (13:53 +0200)] 
smb/dce_iface: avoid deleting current ifaces from state

The smb dce_iface keyword must match for all those dcerpc requests
and responses sent in the context of the given interface. They are
not matching as the current bind interfaces are deleted by any
non bind message.

Ticket: 4767
(cherry picked from commit bff0774767757b0ccab8165e293024fa39d0a952)

3 years agosmb/dce_iface: use DCERPC_TYPE_REQUEST
Eloy Pérez González [Fri, 22 Oct 2021 11:52:14 +0000 (13:52 +0200)] 
smb/dce_iface: use DCERPC_TYPE_REQUEST

The smb dce_iface keyword must match for all those dcerpc requests and
responses sent in the context of the given interface. They are not
matching because in rs_smb_tx_get_dce_iface, x.req_cmd is erroneously
compared with 1. Fix this by comparing with DCERPC_TYPE_REQUEST instead.

Ticket: 4767
(cherry picked from commit 1ae22fd5de3155c356c1191759cb7c066498a93e)

3 years agosmb/dce_opnum: move range if to outer context
Eloy Pérez González [Fri, 22 Oct 2021 13:01:39 +0000 (15:01 +0200)] 
smb/dce_opnum: move range if to outer context

The smb dce_opnum matches all the opnums that are higher that the
indicated opnum. This is due the range comparison if was put in the
exact comparison context, and in case the opnum doesn't match exactly,
then the range comparison is triggered (the upper limit is always true).

Move the erroneus if to the outer context, as else option of the block
checks if comparison should be exact or range.

Ticket: 4767
(cherry picked from commit 333db3b3852899885f1c2a251b4643b124e3cb18)

3 years agosmb/dce_opnum: use DCERPC_TYPE_REQUEST
Eloy Pérez González [Fri, 22 Oct 2021 13:00:11 +0000 (15:00 +0200)] 
smb/dce_opnum: use DCERPC_TYPE_REQUEST

The smb dce_opnum keyword doesn't match the dcerpc requests/responses.
This occurs because in the rs_smb_tx_match_dce_opnum function, the
x.req_cmd is matched against the erroneous code 1. Fix this by using
DCERPC_TYPE_REQUEST for the comparison instead.

Ticket: 4767
(cherry picked from commit 8dca3d0416f539f5086f72f69d71cfc418355a2f)

3 years agogithub-ci: replace failing CentOS 8 by AlmaLinux 8.4
Victor Julien [Mon, 31 Jan 2022 10:42:10 +0000 (11:42 +0100)] 
github-ci: replace failing CentOS 8 by AlmaLinux 8.4

(cherry picked from commit 6c240938b51daadb6c869d2339c2e7cc29ebde68)

3 years agogithub-ci: use curl -L for npcap: follow redirects 6883/head
Jason Ish [Fri, 21 Jan 2022 05:21:08 +0000 (23:21 -0600)] 
github-ci: use curl -L for npcap: follow redirects

(cherry picked from commit 90996958aa32ef3ff789c28b6efcb8ded2cef342)

3 years agostream-tcp-reassemble: fix reassembly direction for FIN packets
Angelo Mirabella [Thu, 20 Jan 2022 14:52:33 +0000 (14:52 +0000)] 
stream-tcp-reassemble: fix reassembly direction for FIN packets

Suricata invokes the stream reassembly logic only for the current packet
direction if the packet contains a FIN flag. However, this does not
handle the case in which the packet ACKs data from the opposing direction.
This patch forces the invocation of the stream reassembly logic
on both direction when Suricata sees a FIN packet.

(cherry picked from commit 41a139b590a059171d0517a455c562486e1a21c2)

3 years agodetect/file_data: Reject invalid protocols 6824/head
Jeff Lucovsky [Thu, 13 Jan 2022 15:39:12 +0000 (10:39 -0500)] 
detect/file_data: Reject invalid protocols

Issue: #4895

This commit causes Suricata to reject signatures that combine TCP-based
alerts using file_data with NFS keywords.

file_data doesn't support the NFS protocol.

(cherry picked from commit 215335fdc6431e1c5de6155aa64c152bda507b72)

3 years agostream: fix stream pruning being too aggressive
Victor Julien [Thu, 13 Jan 2022 11:13:43 +0000 (12:13 +0100)] 
stream: fix stream pruning being too aggressive

Pruning of StreamBufferBlocks could remove blocks that fell entirely
after the target offset due to a logic error. This could lead to data
being evicted that was still meant to be processed in theapp-layer
parsers.

Bug: #4953.
(cherry picked from commit 78f5e082f5188204606ab9ceb5044447e49aaca2)

3 years agosuricatasc: Handle incomplete/empty recv values
Jeff Lucovsky [Tue, 11 Jan 2022 19:16:24 +0000 (14:16 -0500)] 
suricatasc: Handle incomplete/empty recv values

Issue: 4947

Improve handling of values returned by recv. Sometimes, recv returns an
empty string if suricata terminates asynchronously.

(cherry picked from commit fc6fdef07006e5382839ef88873e90754b30e6e0)

3 years agodoc/eve-json-format/dns: Describing Z-bit
Odin Jenseg [Tue, 8 Jun 2021 19:56:41 +0000 (21:56 +0200)] 
doc/eve-json-format/dns: Describing Z-bit

(cherry picked from commit 2a5d79e42609bd5ae0d0456cd5c458e20670160e)

3 years agodns: add dns flag to dns request logging
Jason Ish [Tue, 21 Dec 2021 22:49:21 +0000 (16:49 -0600)] 
dns: add dns flag to dns request logging

Ticket #4515

(cherry picked from commit 0861b66e152c6d2a0517a4a043ef56bdb1be4d76)

3 years agodns: Logging of Z-bit
Odin Jenseg [Tue, 8 Jun 2021 19:55:36 +0000 (21:55 +0200)] 
dns: Logging of Z-bit

[Edit by Jason Ish: fix flag bit value]

Ticket #4515

(cherry picked from commit dfb6f105e8b104bf27cce24b650d047d0925c145)

3 years agodns: create transaction even if z-bit was set
Jason Ish [Tue, 21 Dec 2021 22:34:05 +0000 (16:34 -0600)] 
dns: create transaction even if z-bit was set

It appears that DNS servers will still process a DNS request even if the
z-bit is set, our parser will fail the transaction. So create the
transaction, but still set the event.

Ticket #4924

(cherry picked from commit fcbdc304265aaba724b245a5c3f02e00c8059a1a)

3 years agoflow/bypass: clear memory on bypass
Victor Julien [Mon, 25 Oct 2021 17:15:23 +0000 (19:15 +0200)] 
flow/bypass: clear memory on bypass

Previously the flow would hold on to the app-layer and segment data
until the end of the flow, even though it would never be accessed again.

This patch clears app-layer and stream data, but not stream ssn as its
used in flow logging.

Bug: #4778.
(cherry picked from commit 536291054c9694070beac1d19b41bf8a1f9c1d4e)

3 years agoflow/bypass: add util func to check if flow is bypassed
Victor Julien [Mon, 25 Oct 2021 18:25:39 +0000 (20:25 +0200)] 
flow/bypass: add util func to check if flow is bypassed

To hide the ifdefs for capture offload.

(cherry picked from commit b19d1df69f47b4b85337f1695bc770f4b0703bac)

3 years agoflow/worker: run housekeeping for bypassed packets
Victor Julien [Mon, 25 Oct 2021 17:14:49 +0000 (19:14 +0200)] 
flow/worker: run housekeeping for bypassed packets

Run flow eviction and flow inject queues for bypassed packets as well,
to avoid a scenario where these won't get run at all if too much of the
traffic is bypassed.

Bug: #4779.
(cherry picked from commit ab8f289bb652a2aa83bdd476708a5f297cbec83c)

3 years agodetect/proto: Warn if proto not found in config
Shivani Bhardwaj [Tue, 18 Jan 2022 07:31:41 +0000 (13:01 +0530)] 
detect/proto: Warn if proto not found in config

Ticket 4744

3 years agoflow: immediately evict tcp reused flows
Victor Julien [Tue, 26 Oct 2021 09:09:51 +0000 (11:09 +0200)] 
flow: immediately evict tcp reused flows

Since we already know we're going to no longer use it, might as well
evict it right away.

Ticket 4978

(cherry picked from commit 286c510ece27c8fd408434c1786df26aba0c5581)

3 years agoci: remove eol Fedora 32 & 33
Shivani Bhardwaj [Tue, 18 Jan 2022 07:17:43 +0000 (12:47 +0530)] 
ci: remove eol Fedora 32 & 33

3 years agoci: add fedora 35 to builds
Corey Thomas [Wed, 10 Nov 2021 13:21:38 +0000 (08:21 -0500)] 
ci: add fedora 35 to builds

(cherry picked from commit 7be793f7b479d66977ff68ea1ca3c832c744b3d2)

3 years agoci: add Fedora 34 to builds
Shivani Bhardwaj [Thu, 13 Jan 2022 17:11:19 +0000 (22:41 +0530)] 
ci: add Fedora 34 to builds

3 years agodatasets: initialize after dropping privileges
Jason Ish [Thu, 9 Dec 2021 22:59:04 +0000 (16:59 -0600)] 
datasets: initialize after dropping privileges

Move initialization of datasets to a point after privileges
have been dropped.

Ticket 4239

(cherry picked from commit 92eb14c5adc985433dd44bdcac18fa6e67440043)

3 years agoutil/streaming: improve error handling
Eric Leblond [Thu, 19 Aug 2021 09:21:21 +0000 (11:21 +0200)] 
util/streaming: improve error handling

It differentiates memory error than regular ones.

(cherry picked from commit 0e70958e67398f599b77ba991dc631e025cae5f4)

3 years agoconf: avoid quadratic complexity
Philippe Antoine [Mon, 8 Nov 2021 13:18:30 +0000 (14:18 +0100)] 
conf: avoid quadratic complexity

Ticket: 4812

When adding many sequence nodes

(cherry picked from commit 15649424a76d01eb332d85620ffc4956d4f3d9be)

3 years agoaf-packet: use configured cluster-id when checking for fanout
Jason Ish [Fri, 16 Oct 2020 15:43:29 +0000 (09:43 -0600)] 
af-packet: use configured cluster-id when checking for fanout

When testing for fanout support a cluster-id of 1 was always being
used instead of the configured cluster-id. This limited fanout
support to only one Suricata instance.

Instead of hardcoding an ID of 1, use the configured cluster-id.

Also make cluster_id a uint16_t instead of an int in AFPThreadVars.

Redmine issue:
https://redmine.openinfosecfoundation.org/issues/3419

(cherry picked from commit df0ed6fda47fc80a397710316ae78cc3967e29bb)

3 years agoprofiling: fix profiling with sample rate
Eric Leblond [Wed, 17 Nov 2021 15:43:23 +0000 (16:43 +0100)] 
profiling: fix profiling with sample rate

Rules profiling was returning invalid results when used with sample
rate. The problem was that the sample condition was run twice in the
packet flow. As a result, the second pass was not initializing the
variable storing the initial CPU ticks and the resulting performance
counters were reporting invalid values.

Bug: #4836.
(cherry picked from commit 6d5f59696dda77e1e7b2c45f51413b76690da4e9)

3 years agosmtp: log transaction even if no email present 6765/head
Jason Ish [Wed, 10 Nov 2021 22:38:35 +0000 (16:38 -0600)] 
smtp: log transaction even if no email present

The SMTP transaction logger was not writing the log if the email
portion of the logger failed, such as in the case of STARTTLS
where this is no email decoded.

Ticket #4817

(cherry picked from commit 52b9c12f41d890cda340fe3b1c7e7e3e9d673d73)

3 years agorust: bump MSRV to 1.41.1
Shivani Bhardwaj [Tue, 14 Dec 2021 15:44:30 +0000 (21:14 +0530)] 
rust: bump MSRV to 1.41.1

Ticket: #4902.

3 years agomingw: add bcrypt to LDADD for rust compilation 6703/head
Victor Julien [Tue, 7 Dec 2021 08:56:51 +0000 (09:56 +0100)] 
mingw: add bcrypt to LDADD for rust compilation

(cherry picked from commit e93dc24383443398d6a2e888931d7000b392c09a)

3 years agoalert: fixes leak in ThresholdHandlePacketRule 6701/head
Philippe Antoine [Tue, 5 Oct 2021 19:14:18 +0000 (21:14 +0200)] 
alert: fixes leak in ThresholdHandlePacketRule

ThresholdHandlePacketRule may take ownership of an allocated
DetectThresholdEntry, and places it in a position of the
array th_entry. But it never got released

(cherry picked from commit 6fadb97d5ded5805745bca02bfb962de975ec122)

3 years agomqtt: fix transaction completion 6700/head
Philippe Antoine [Thu, 2 Dec 2021 09:29:40 +0000 (10:29 +0100)] 
mqtt: fix transaction completion

Ticket: 4862

A transaction to client is always considered
complete in the direction to server and vice versa.
Otherwise, transactions are never complete for
AppLayerParserTransactionsCleanup

(cherry picked from commit 1b10848d84f6417a4030e5814db246b369b77593)

3 years agodhcp: fix url in comment 6635/head
Jason Ish [Wed, 17 Nov 2021 01:34:11 +0000 (19:34 -0600)] 
dhcp: fix url in comment

rustdoc was complaining about the format of the URL in a comment
while trying to generate documentation. Convert the comment to a
non-rustdoc comment for now to satisfy rustdoc.

(cherry picked from commit eb6cc6293717e10f881edd6713fb8dc6ef78d3b7)

3 years agoci: update Ubuntu 16.04 test to 20.04 with MSRV
Jason Ish [Mon, 22 Nov 2021 21:05:19 +0000 (15:05 -0600)] 
ci: update Ubuntu 16.04 test to 20.04 with MSRV

Update the Ubuntu 16.04 test to Ubuntu 20.04 and make it clear
that it is also testing the minimum supported Rust version for 6.0.

Note: Ubuntu 16.04 is now EOL.

3 years agoversion: start development towards 6.0.5
Victor Julien [Thu, 18 Nov 2021 08:57:14 +0000 (09:57 +0100)] 
version: start development towards 6.0.5

3 years agorelease: 6.0.4; update changelog; require htp 0.5.39 suricata-6.0.4
Victor Julien [Tue, 16 Nov 2021 12:15:35 +0000 (13:15 +0100)] 
release: 6.0.4; update changelog; require htp 0.5.39

3 years agotcp: rejects FIN+SYN packets as invalid
Philippe Antoine [Thu, 16 Sep 2021 14:54:37 +0000 (16:54 +0200)] 
tcp: rejects FIN+SYN packets as invalid

Ticket: #4569

If a FIN+SYN packet is sent, the destination may keep the
connection alive instead of starting to close it.
In this case, a later SYN packet will be ignored by the
destination.

Previously, Suricata considered this a session reuse, and thus
used the sequence number of the last SYN packet, instead of
using the one of the live connection, leading to evasion.

This commit errors on FIN+SYN so that they do not get
processed as regular FIN packets.

(cherry picked from commit 6cb6225b28c5d8e616a420b7d05b129ba2845dc0)

3 years agostream/tcp: handle RST with MD5 or AO header
Victor Julien [Tue, 5 Oct 2021 12:48:27 +0000 (14:48 +0200)] 
stream/tcp: handle RST with MD5 or AO header

Special handling for RST packets if they have an TCP MD5 or AO header option.
The options hash can't be validated. The end host might be able to validate
it, as it can have a key/password that was communicated out of band.

The sender could use this to move the TCP state to 'CLOSED', leading to
a desync of the TCP session.

This patch builds on top of
843d0b7a10bb ("stream: support RST getting lost/ignored")

It flags the receiver as having received an RST and moves the TCP state
into the CLOSED state. It then reverts this if the sender continues to
send traffic. In this case it sets the following event:

    stream-event:suspected_rst_inject;

Bug: #4710.
(cherry picked from commit 50e2b973eeec7172991bf8f544ab06fb782b97df)

3 years agontp: fixes leak of de_state
Philippe Antoine [Tue, 12 Oct 2021 11:29:39 +0000 (13:29 +0200)] 
ntp: fixes leak of de_state

Bug: #4752.
(cherry picked from commit 3212fa7d2bc514f4e759dbb9e0002203c814a9b5)

3 years agosnmp: fixes leak of de_state
Philippe Antoine [Tue, 12 Oct 2021 11:29:25 +0000 (13:29 +0200)] 
snmp: fixes leak of de_state

Bug: #4752.
(cherry picked from commit 28a3181a2de0101b0796058eeffac0180eef35d6)

3 years agosmb: midstream probing checks for netbios message type
Philippe Antoine [Mon, 23 Aug 2021 15:31:51 +0000 (17:31 +0200)] 
smb: midstream probing checks for netbios message type

If it is available

Bug: #4620.
(cherry picked from commit f37240a3e2758756f345a237b6d348ab38fb758b)

3 years agoprotodetect: opposing side cannot change protocol
Philippe Antoine [Fri, 16 Jul 2021 12:22:28 +0000 (14:22 +0200)] 
protodetect: opposing side cannot change protocol

Ticket: #4562

As the data which triggered the opposing side
was the same protocol and not another one,
that means the protocol change failed.

Prevents a memory leak in later call of AppLayerParserParse
which would allocate a new state and leak the old one

(cherry picked from commit be617a3c1b25a7a4b1acdc7b65d3733d4f48a1f9)

3 years agosmtp: completes RSET transaction on last multiline
Philippe Antoine [Wed, 14 Jul 2021 17:40:42 +0000 (19:40 +0200)] 
smtp: completes RSET transaction on last multiline

Bug: #4561.
(cherry picked from commit f44bbbb9ada39893279965a98831620074205871)

3 years agoswf: right input length for decompression
Philippe Antoine [Thu, 1 Jul 2021 13:04:58 +0000 (15:04 +0200)] 
swf: right input length for decompression

Also when compress_depth reaches buffer_len

Bug: #4536.
(cherry picked from commit f211a330ddfbac8a6d0b85ea5f2ee0fcc1ccad3d)

3 years agorust: right condition for both uint to be zero
Philippe Antoine [Mon, 13 Sep 2021 09:22:36 +0000 (11:22 +0200)] 
rust: right condition for both uint to be zero

Theay can overflow leading to their addition to be zero

If a NFS read reply indicates a count of 0xFFFFFFFF

Bug: #4680.
(cherry picked from commit 8f8823b6f2b0a26b551397b8b574104bfd37e9f5)

3 years agoinspect: debug validation to ensure correct argument
Philippe Antoine [Mon, 13 Sep 2021 10:27:51 +0000 (12:27 +0200)] 
inspect: debug validation to ensure correct argument

(cherry picked from commit 689ac97d7225fd43b64c103034b1fdf63fa4d324)

3 years agodetect: fixes InspectionBuffer id with transforms
Philippe Antoine [Mon, 13 Sep 2021 10:18:34 +0000 (12:18 +0200)] 
detect: fixes InspectionBuffer id with transforms

When InspectionBufferGet gets called with base_id
Later InspectionBufferSetup must also be called with base_id

In case there were transforms, we had base_id != list_id

Not calling InspectionBufferSetup with the right id
resulted in leaving a dangling pointer,
because it was not added to det_ctx->inspect.to_clear_queue

Bug: #4681.
(cherry picked from commit c3339c853e3b35d896db68644ee7557fb725da18)

3 years agoloopback: decodes IPv6 from all OSes 6609/head
Philippe Antoine [Tue, 12 Oct 2021 07:04:59 +0000 (09:04 +0200)] 
loopback: decodes IPv6 from all OSes

As does wireshark

(cherry picked from commit 27b4f165b17499cc765ccb770f1cf994992e10f6)

3 years agoflow/bypass: use_cnt desync'd on bypassed flows 6603/head
Victor Julien [Wed, 20 Oct 2021 11:20:32 +0000 (13:20 +0200)] 
flow/bypass: use_cnt desync'd on bypassed flows

Locally bypassed flows had unsafe updates to `Flow::use_cnt` leading to a race
issue. For a packet it would do the flow lookup, attach the flow to the packet,
increment the `use_cnt`. Then it would detect that the flow is in the bypass
state, and unlock it while holding a reference (so alos not decrementing the
`use_cnt`). When the packet was then returned to the packet pool, the flow would
be disconnected from the packet, which would decrement `use_cnt` without holding
the flow lock.

This patch addresses this issue by disconnecting the flow from the packet
immediately when the bypassed state is detected. This moves the `use_cnt`
decrement to within the lock.

Bug: #4766.
(cherry picked from commit ec7e0561e8356371c7ec1c2b285f267424558f81)

3 years agopacketpool: reset PacketRelease on return to pool
Victor Julien [Fri, 5 Nov 2021 19:05:43 +0000 (20:05 +0100)] 
packetpool: reset PacketRelease on return to pool

Reset PacketRelease callback to make sure its not set to a capture
specific callback.

As an example:

  0x000055e00af09d35 in AFPReleaseDataFromRing (p=0x7f1d884cb830) at source-af-packet.c:653
  0x000055e00af09dd0 in AFPReleasePacket (p=0x7f1d884cb830) at source-af-packet.c:678
  0x000055e00ab53d7e in TmqhOutputPacketpool (t=0x55e00fb79250, p=0x7f1d884cb830) at tmqh-packetpool.c:465
  0x000055e00af08dec in TmThreadsSlotProcessPkt (tv=0x55e00fb79250, s=0x55e012134790, p=0x7f1d884cb830) at tm-threads.h:201
  0x000055e00af08e70 in TmThreadsCaptureInjectPacket (tv=0x55e00fb79250, p=0x7f1d884cb830) at tm-threads.h:221
  0x000055e00af08f2e in TmThreadsCaptureHandleTimeout (tv=0x55e00fb79250, p=0x0) at tm-threads.h:245
  0x000055e00af0ba76 in ReceiveAFPLoop (tv=0x55e00fb79250, data=0x7f1d884ccb60, slot=0x55e01198e4b0) at source-af-packet.c:1321
  0x000055e00ab55257 in TmThreadsSlotPktAcqLoop (td=0x55e00fb79250) at tm-threads.c:312
  0x00007f1dca9d5609 in start_thread (arg=<optimized out>) at pthread_create.c:477
  0x00007f1dca7c6293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Here the packet was a pseudo packet to handle a timeout condition. But
the ReleasePacket callback was still set to AFPReleasePacket from a
previous use of the Packet.

Bug: #4807.
(cherry picked from commit 07ce871da4b385f6f1d86310f5dcdf00e6c79692)

3 years agoaf-packet: avoid flag colision with kernel
Victor Julien [Sun, 31 Oct 2021 09:28:18 +0000 (10:28 +0100)] 
af-packet: avoid flag colision with kernel

Avoid colision of TP_STATUS_USER_BUSY with TP_STATUS_TS_RAW_HARDWARE,
both were using bit 31.

Bug: #4800.
(cherry picked from commit ad862fff371cddd19329d9ac0ddb106e1ad6b1b3)

3 years agoaf-packet: fix soft lockup issues
Victor Julien [Sun, 31 Oct 2021 21:13:19 +0000 (22:13 +0100)] 
af-packet: fix soft lockup issues

The Suricata AF_PACKET code opens a socket per thread, then after some minor
setup enters a loop where the socket is poll()'d with a timeout. When the
poll() call returns a non zero positive value, the AF_PACKET ring will be
processed.

The ringbuffer processing logic has a pointer into the ring where we last
checked the ring. From this position we will inspect each frame until we
find a frame with tp_status == TP_STATUS_KERNEL (so essentially 0). This
means the frame is currently owned by the kernel.

There is a special case handling for starting the ring processing but
finding a TP_STATUS_KERNEL immediately. This logic then skip to the next
frame, rerun the check, etc until it either finds an initialized frame or
the last frame of the ringbuffer.

The problem was, however, that the initial uninitialized frame was possibly
(likely?) still being initialized by the kernel. A data race between the
notification through the socket (the poll()) and the updating of the
`tp_status` field in the frame could lead to a valid frame getting skipped.

Of note is that for example libpcap does not do frame scanning. Instead it
simply exits it ring processing loop. Also interesting is that libpcap uses
atomic loads and stores on the tp_status field.

This skipping of frames had 2 bad side effects:

1. in most cases, the buffer would be full enough that the frame would
   be processed in the next pass of the ring, but now the frame would
   out of order. This might have lead to packets belong to the same
   flow getting processed in the wrong order.

2. more severe is the soft lockup case. The skipped frame sits at ring
   buffer index 0. The rest of the ring has been cleared, after the
   initial frame was skipped. As our pass of the ring stops at the end
   of the ring (ptv->frame_offset + 1 == ptv->req.v2.tp_frame_nr) the code
   exits the ring processing loop at goes back to poll(). However, poll()
   will not indicate that there is more data, as the stale frame in the
   ring blocks the kernel from populating more frames beyond it. This
   is now a dead lock, as the kernel waits for Suricata and Suricata
   never touches the ring until it hears from the kernel.

   The scan logic will scan the whole ring at most once, so it won't
   reconsider the stale frame either.

This patch addresses the issues in several ways:

1. the startup "discard" logic was fixed to not skip over kernel
   frames. Doing so would get us in a bad state at start up.

2. Instead of scanning the ring, we now enter a busy wait loop
   when encountering a kernel frame where we didn't expect one. This
   means that if we got a > 0 poll() result, we'll busy wait until
   we get at least one frame.

3. Error handling is unified and cleaned up. Any frame error now
   returns the frame to the kernel and progresses the frame pointer.

4. If we find a frame that is owned by us (TP_STATUS_USER_BUSY) we
   yield to poll() immediately, as the next expected status of that
   frame is TP_STATUS_KERNEL.

5. the ring is no longer processed until the "end" of the ring (so
   highest index), but instead we process at most one full ring size
   per run.

6. Work with a copy of `tp_status` instead of accessing original touched
   also by the kernel.

Bug: #4785.
(cherry picked from commit a022648b9e6910ca05a0564c2ead9344a4c34312)

3 years agoaf-packet: define all current TP_STATUS_* flags
Victor Julien [Tue, 2 Nov 2021 16:16:31 +0000 (17:16 +0100)] 
af-packet: define all current TP_STATUS_* flags

(cherry picked from commit 8b08b0343d8a5a6b3d7d2ccb22fa4c4707400932)

3 years agoflow/manager: fix flows not evicted & freed in time
Victor Julien [Sun, 7 Nov 2021 05:25:31 +0000 (06:25 +0100)] 
flow/manager: fix flows not evicted & freed in time

Flows have been shown to linger for a long time w/o giving up their
resources. This would lead to higher memory use and memcaps getting
reached.

Three main causes have been identified:

Slow passes hash passes. By default the flow manager will scan the
flow hash slowly. It is based on the flow timeout settings, and with
the default config it will take 4 minutes for a full scan to be
complete. This leaves a window for flows that are timed out to linger
for minutes longer than expected.

Flow Manager yields under pressure. The per row TryLock causes work
to be delayed more. The Flow manager will use trylock on a hash row
and will yield immediately if the row is busy. This means that it will
take a full pass before the row is revisited again. If the row holds
busy flows, this could happen many times in a row.

Flow Manager favors evicted flows over active flows. The Flow Manager
will only process the evicted flows if they are present. These flows
have been evicted by workers. The active flows on that hash row will
have to wait until the next hash pass. Of course by then there could
be more evicted flows.

Combined these factors could lead to flows not being considered for
freeing and logging for a very long time, potentially even indefinitly.

The patch addresses the latter two flow manager issues by no longer
using TryLock. It will now simply wait for the lock to be released and
then do its work on it. Additionally for each row both the evicted list
and the active flow list will be processed.

Bug: #4650.
(cherry picked from commit 244dd11c34152fbdb01636da8a9fa4a9fa0de050)

3 years agoflow/manager: remove obsolete code
Victor Julien [Mon, 25 Oct 2021 20:12:01 +0000 (22:12 +0200)] 
flow/manager: remove obsolete code

(cherry picked from commit 41fee417229feed7636f95acb3c3d7309b9d3122)

3 years agostyle: remove latest warnings 6528/head
Philippe Antoine [Fri, 24 Sep 2021 13:42:50 +0000 (15:42 +0200)] 
style: remove latest warnings

about unused variables

(cherry picked from commit cb30772372234b88787676eff865e43ce6793cad)

3 years agoflowint: same analysis warnings as flowbits
Philippe Antoine [Fri, 24 Sep 2021 13:42:41 +0000 (15:42 +0200)] 
flowint: same analysis warnings as flowbits

(cherry picked from commit f6ba3699bb8a790956b645e3c47cc159811ab677)

3 years agohttp2: null check during upgrade 6465/head
Philippe Antoine [Mon, 23 Aug 2021 13:03:51 +0000 (15:03 +0200)] 
http2: null check during upgrade

(cherry picked from commit fa4c7626bde98f20700172984f7bd07c285406ba)

3 years agodnp3: regenerate object decoding code 6462/head
Philippe Antoine [Thu, 8 Jul 2021 13:02:50 +0000 (15:02 +0200)] 
dnp3: regenerate object decoding code

Ticket: #4558
So as to avoid intra-structure overflow

(cherry picked from commit 44bd3169eb1ab0501d909fe261b3dafde6375400)

3 years agodnp3: adds bounds check for prefix chararray
Philippe Antoine [Thu, 8 Jul 2021 13:01:15 +0000 (15:01 +0200)] 
dnp3: adds bounds check for prefix chararray

Ticket: #4558
Avoids intra structure overflow

(cherry picked from commit 126a7dcb4f1818a806c882c54da864992bb304d5)

3 years agodnp3: use base64 macro in gen script
Philippe Antoine [Thu, 8 Jul 2021 12:57:56 +0000 (14:57 +0200)] 
dnp3: use base64 macro in gen script

As is done already in C
cf commit ea0936199d142fc52ec69baf7984cbdd92dd4705

(cherry picked from commit 5ec9688f03eb611b8ec3108a4f20db2baf87b225)

3 years agossh: fix match on ssh banner
Shivani Bhardwaj [Fri, 8 Oct 2021 00:35:29 +0000 (06:05 +0530)] 
ssh: fix match on ssh banner

Default detection handling of SSH should not be to pass in case the
direction was not a match but to treat it like it was meant to server.

3 years agodetect: suppress error message for pcre only rules 6457/head
Victor Julien [Fri, 19 Feb 2021 10:45:00 +0000 (11:45 +0100)] 
detect: suppress error message for pcre only rules

(cherry picked from commit 9dd1444f4431731bf4917488e0abec0d9a46fdcc)

3 years agohttp2: better rust lifetimes 6453/head
Philippe Antoine [Tue, 7 Sep 2021 12:44:25 +0000 (14:44 +0200)] 
http2: better rust lifetimes

so that borrow check gets happy

(cherry picked from commit 56fae072b225d1c175116efe117c264afbdbf4a3)

3 years agohttp2: better rust style
Philippe Antoine [Fri, 4 Jun 2021 13:18:32 +0000 (15:18 +0200)] 
http2: better rust style

(cherry picked from commit 596a4a9d6edf43c73de85356b2e0cec3cb91e471)

3 years agohttp2: concatenate one headers multiple values
Philippe Antoine [Mon, 31 May 2021 14:17:22 +0000 (16:17 +0200)] 
http2: concatenate one headers multiple values

For detection, as is done with HTTP1

(cherry picked from commit 48ed874ddad4bbe7321191712263086f4567a5ab)

3 years agohttp2: generic http2_header_blocks
Philippe Antoine [Mon, 31 May 2021 09:40:42 +0000 (11:40 +0200)] 
http2: generic http2_header_blocks

so as not to forget continuation and push promise
when iterating over headers

(cherry picked from commit e3ff0e7731e8d652ee7f22945311674e65455a74)

3 years agohttp2: http.header keyword now works for HTTP2
Philippe Antoine [Mon, 31 May 2021 08:50:38 +0000 (10:50 +0200)] 
http2: http.header keyword now works for HTTP2

As well as http.header.raw

(cherry picked from commit 0b0649d98e07eb7dc8da60100c80fbcfe6cdd9e8)