Re: [PATCH nf-next v2] netfilter: nf_osf implementation: nf_osf_ttl() and nf_osf_match()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please, send your patches via git-send-email.

> diff --git a/include/linux/netfilter/nf_osf.h b/include/linux/netfilter/nf_osf.h
> new file mode 100644
> index 000000000000..5f2871fcde42
> --- /dev/null
> +++ b/include/linux/netfilter/nf_osf.h

This one needs to be in uapi because...

> @@ -0,0 +1,110 @@
> +#define NF_MAXGENRELEN     32
> +
> +#define NF_OSF_TTL      (1<<1)
> +#define NF_OSF_LOG      (1<<2)
> +
> +#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 */
> +#define NF_OSF_TTL_NOCHECK  2   /* Do not compare ip and fingerprint TTL at all */
> +
> +/*
> + * Wildcard MSS (kind of).
> + * It is used to implement a state machine for the different wildcard values
> + * of the MSS and window sizes.
> + */
> +struct xt_osf_wc {

And then, this should be nf_osf_ everywhere, so we don't have xt_
stuff in the generic nf_osf infrastructure.

> +        __u32                   wc;
> +        __u32                   val;
> +};
> +
> +/*
> + * This struct represents IANA options
> + * http://www.iana.org/assignments/tcp-parameters
> + */
> +struct xt_osf_opt {

Same above and everywhere else in this file.

Yes, you will have to update xt_osf.c

[...]
> +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 xt_osf_info *info, struct net *net);

enum osf_fmatch_states and nf_osf_match() should be placed in:

include/net/netfilter/nf_osf.h

This file will not be exposed to userspace via UAPI since they just
declare a function and this enum in a way that is not useful to
userspace.

> diff --git a/include/uapi/linux/netfilter/xt_osf.h b/include/uapi/linux/netfilter/xt_osf.h
> index dad197e2ab99..eb71a1c703db 100644
> --- a/include/uapi/linux/netfilter/xt_osf.h
> +++ b/include/uapi/linux/netfilter/xt_osf.h
> @@ -23,101 +23,24 @@
>  #include <linux/types.h>
>  #include <linux/ip.h>
>  #include <linux/tcp.h>
> +#include <linux/netfilter/nf_osf.h>
>  
> -#define MAXGENRELEN		32
> +#define MAXGENRELEN    NF_MAXGENRELEN
>  
> -#define XT_OSF_GENRE		(1<<0)
> -#define	XT_OSF_TTL		(1<<1)
> -#define XT_OSF_LOG		(1<<2)
> -#define XT_OSF_INVERT		(1<<3)
> +#define XT_OSF_GENRE    NF_OSF_GENRE
> +#define XT_OSF_INVERT    NF_OSF_INVERT
>  
> -#define XT_OSF_LOGLEVEL_ALL	0	/* log all matched fingerprints */
> -#define XT_OSF_LOGLEVEL_FIRST	1	/* log only the first matced fingerprint */
> -#define XT_OSF_LOGLEVEL_ALL_KNOWN	2 /* do not log unknown packets */
> +#define XT_OSF_TTL    NF_OSF_TTL
> +#define XT_OSF_LOG    NF_OSF_LOG
>  
> -#define XT_OSF_TTL_TRUE		0	/* True ip and fingerprint TTL comparison */
> -#define XT_OSF_TTL_LESS		1	/* Check if ip TTL is less than fingerprint one */
> -#define XT_OSF_TTL_NOCHECK	2	/* Do not compare ip and fingerprint TTL at all */
> -
> -struct xt_osf_info {

Add compatibility defines here too, eg.

#define xt_osf_info     nf_osf_info

Same for all other structures.

> -	char			genre[MAXGENRELEN];
> -	__u32			len;
> -	__u32			flags;
> -	__u32			loglevel;
> -	__u32			ttl;
> -};
> -
> -/*
> - * Wildcard MSS (kind of).
> - * It is used to implement a state machine for the different wildcard values
> - * of the MSS and window sizes.
> - */
> -struct xt_osf_wc {
> -	__u32			wc;
> -	__u32			val;
> -};
> -
> -/*
> - * This struct represents IANA options
> - * http://www.iana.org/assignments/tcp-parameters
> - */
> -struct xt_osf_opt {
> -	__u16			kind, length;
> -	struct xt_osf_wc	wc;
> -};
> -
> -struct xt_osf_user_finger {
> -	struct xt_osf_wc	wss;
> -
> -	__u8			ttl, df;
> -	__u16			ss, mss;
> -	__u16			opt_num;
> +#define XT_OSF_LOGLEVEL_ALL    NF_OSF_LOGLEVEL_ALL
> +#define XT_OSF_LOGLEVEL_FIRST    NF_OSF_LOGLEVEL_FIRST
> +#define XT_OSF_LOGLEVEL_ALL_KNOWN    NF_OSF_LOGLEVEL_ALL_KNOWN
>  
> -	char			genre[MAXGENRELEN];
> -	char			version[MAXGENRELEN];
> -	char			subtype[MAXGENRELEN];
> +#define XT_OSF_TTL_TRUE    NF_OSF_TTL_TRUE
> +#define XT_OSF_TTL_NOCHECK    NF_OSF_TTL_NOCHECK
>  
> -	/* MAX_IPOPTLEN is maximum if all options are NOPs or EOLs */
> -	struct xt_osf_opt	opt[MAX_IPOPTLEN];
> -};
> -
> -struct xt_osf_nlmsg {
> -	struct xt_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,
> -};
> -
> -/*
> - * 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 xt_osf_window_size_options {
> -	OSF_WSS_PLAIN	= 0,
> -	OSF_WSS_MSS,
> -	OSF_WSS_MTU,
> -	OSF_WSS_MODULO,
> -	OSF_WSS_MAX,
> -};
> +#define XT_OSF_TTL_LESS		1	/* Check if ip TTL is less than fingerprint one */
>  
>  /*
>   * Add/remove fingerprint from the kernel.
> diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
> index d3220b43c832..bd1c0eef0aa2 100644
> --- a/net/netfilter/Kconfig
> +++ b/net/netfilter/Kconfig
> @@ -631,6 +631,10 @@ config NFT_FIB_INET
>  	  The lookup will be delegated to the IPv4 or IPv6 FIB depending
>  	  on the protocol of the packet.
>  
> +config NF_OSF
> +    tristate '"osf" Passive OS fingerprint match'
   ^^^^

This is no a tab indent.

> +	depends on NETFILTER_ADVANCED && NETFILTER_NETLINK
> +
>  if NF_TABLES_NETDEV
>  
>  config NF_DUP_NETDEV
> @@ -1377,6 +1381,7 @@ config NETFILTER_XT_MATCH_NFACCT
>  config NETFILTER_XT_MATCH_OSF
>  	tristate '"osf" Passive OS fingerprint match'
>  	depends on NETFILTER_ADVANCED && NETFILTER_NETLINK
> +    select NF_OSF
   ^^^^

This is not a tab indent either.

Other than that, this looks good :-)

Please, revamp and resend asap, thanks.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux