Commit 1a6a0951 authored by Fernando Fernandez Mancera's avatar Fernando Fernandez Mancera Committed by Pablo Neira Ayuso

netfilter: nfnetlink_osf: add missing fmatch check

When we check the tcp options of a packet and it doesn't match the current
fingerprint, the tcp packet option pointer must be restored to its initial
value in order to do the proper tcp options check for the next fingerprint.

Here we can see an example.
Assumming the following fingerprint base with two lines:

S10:64:1:60:M*,S,T,N,W6:      Linux:3.0::Linux 3.0
S20:64:1:60:M*,S,T,N,W7:      Linux:4.19:arch:Linux 4.1

Where TCP options are the last field in the OS signature, all of them overlap
except by the last one, ie. 'W6' versus 'W7'.

In case a packet for Linux 4.19 kicks in, the osf finds no matching because the
TCP options pointer is updated after checking for the TCP options in the first
line.

Therefore, reset pointer back to where it should be.

Fixes: 11eeef41 ("netfilter: passive OS fingerprint xtables match")
Signed-off-by: default avatarFernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 2035f3ff
...@@ -66,6 +66,7 @@ static bool nf_osf_match_one(const struct sk_buff *skb, ...@@ -66,6 +66,7 @@ static bool nf_osf_match_one(const struct sk_buff *skb,
int ttl_check, int ttl_check,
struct nf_osf_hdr_ctx *ctx) struct nf_osf_hdr_ctx *ctx)
{ {
const __u8 *optpinit = ctx->optp;
unsigned int check_WSS = 0; unsigned int check_WSS = 0;
int fmatch = FMATCH_WRONG; int fmatch = FMATCH_WRONG;
int foptsize, optnum; int foptsize, optnum;
...@@ -155,6 +156,9 @@ static bool nf_osf_match_one(const struct sk_buff *skb, ...@@ -155,6 +156,9 @@ static bool nf_osf_match_one(const struct sk_buff *skb,
} }
} }
if (fmatch != FMATCH_OK)
ctx->optp = optpinit;
return fmatch == FMATCH_OK; return fmatch == FMATCH_OK;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment