-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfilter: extract Passive OS fingerprint infrastructure from xt_osf
Add nf_osf_ttl() and nf_osf_match() into nf_osf.c to prepare for nf_tables support. Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
- Loading branch information
Fernando Fernandez Mancera
authored and
Pablo Neira Ayuso
committed
May 6, 2018
1 parent
3f9c56a
commit bfb15f2
Showing
7 changed files
with
359 additions
and
289 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#include <uapi/linux/netfilter/nf_osf.h> | ||
|
||
/* Initial window size option state machine: multiple of mss, mtu or | ||
* plain numeric value. Can also be made as plain numeric value which | ||
* is not a multiple of specified value. | ||
*/ | ||
enum nf_osf_window_size_options { | ||
OSF_WSS_PLAIN = 0, | ||
OSF_WSS_MSS, | ||
OSF_WSS_MTU, | ||
OSF_WSS_MODULO, | ||
OSF_WSS_MAX, | ||
}; | ||
|
||
enum osf_fmatch_states { | ||
/* Packet does not match the fingerprint */ | ||
FMATCH_WRONG = 0, | ||
/* Packet matches the fingerprint */ | ||
FMATCH_OK, | ||
/* Options do not match the fingerprint, but header does */ | ||
FMATCH_OPT_WRONG, | ||
}; | ||
|
||
bool nf_osf_match(const struct sk_buff *skb, u_int8_t family, | ||
int hooknum, struct net_device *in, struct net_device *out, | ||
const struct nf_osf_info *info, struct net *net, | ||
const struct list_head *nf_osf_fingers); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
#ifndef _NF_OSF_H | ||
#define _NF_OSF_H | ||
|
||
#define MAXGENRELEN 32 | ||
|
||
#define NF_OSF_GENRE (1 << 0) | ||
#define NF_OSF_TTL (1 << 1) | ||
#define NF_OSF_LOG (1 << 2) | ||
#define NF_OSF_INVERT (1 << 3) | ||
|
||
#define NF_OSF_LOGLEVEL_ALL 0 /* log all matched fingerprints */ | ||
#define NF_OSF_LOGLEVEL_FIRST 1 /* log only the first matced fingerprint */ | ||
#define NF_OSF_LOGLEVEL_ALL_KNOWN 2 /* do not log unknown packets */ | ||
|
||
#define NF_OSF_TTL_TRUE 0 /* True ip and fingerprint TTL comparison */ | ||
|
||
/* Do not compare ip and fingerprint TTL at all */ | ||
#define NF_OSF_TTL_NOCHECK 2 | ||
|
||
/* Wildcard MSS (kind of). | ||
* It is used to implement a state machine for the different wildcard values | ||
* of the MSS and window sizes. | ||
*/ | ||
struct nf_osf_wc { | ||
__u32 wc; | ||
__u32 val; | ||
}; | ||
|
||
/* This struct represents IANA options | ||
* http://www.iana.org/assignments/tcp-parameters | ||
*/ | ||
struct nf_osf_opt { | ||
__u16 kind, length; | ||
struct nf_osf_wc wc; | ||
}; | ||
|
||
struct nf_osf_info { | ||
char genre[MAXGENRELEN]; | ||
__u32 len; | ||
__u32 flags; | ||
__u32 loglevel; | ||
__u32 ttl; | ||
}; | ||
|
||
struct nf_osf_user_finger { | ||
struct nf_osf_wc wss; | ||
|
||
__u8 ttl, df; | ||
__u16 ss, mss; | ||
__u16 opt_num; | ||
|
||
char genre[MAXGENRELEN]; | ||
char version[MAXGENRELEN]; | ||
char subtype[MAXGENRELEN]; | ||
|
||
/* MAX_IPOPTLEN is maximum if all options are NOPs or EOLs */ | ||
struct nf_osf_opt opt[MAX_IPOPTLEN]; | ||
}; | ||
|
||
struct nf_osf_finger { | ||
struct rcu_head rcu_head; | ||
struct list_head finger_entry; | ||
struct nf_osf_user_finger finger; | ||
}; | ||
|
||
struct nf_osf_nlmsg { | ||
struct nf_osf_user_finger f; | ||
struct iphdr ip; | ||
struct tcphdr tcp; | ||
}; | ||
|
||
/* Defines for IANA option kinds */ | ||
enum iana_options { | ||
OSFOPT_EOL = 0, /* End of options */ | ||
OSFOPT_NOP, /* NOP */ | ||
OSFOPT_MSS, /* Maximum segment size */ | ||
OSFOPT_WSO, /* Window scale option */ | ||
OSFOPT_SACKP, /* SACK permitted */ | ||
OSFOPT_SACK, /* SACK */ | ||
OSFOPT_ECHO, | ||
OSFOPT_ECHOREPLY, | ||
OSFOPT_TS, /* Timestamp option */ | ||
OSFOPT_POCP, /* Partial Order Connection Permitted */ | ||
OSFOPT_POSP, /* Partial Order Service Profile */ | ||
|
||
/* Others are not used in the current OSF */ | ||
OSFOPT_EMPTY = 255, | ||
}; | ||
|
||
#endif /* _NF_OSF_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.