Skip to content

Commit 7ea55a4

Browse files
Fernando Fernandez Manceragregkh
authored andcommitted
netfilter: nft_objref: validate objref and objrefmap expressions
[ Upstream commit f359b80 ] Referencing a synproxy stateful object from OUTPUT hook causes kernel crash due to infinite recursive calls: BUG: TASK stack guard page was hit at 000000008bda5b8c (stack is 000000003ab1c4a5..00000000494d8b12) [...] Call Trace: __find_rr_leaf+0x99/0x230 fib6_table_lookup+0x13b/0x2d0 ip6_pol_route+0xa4/0x400 fib6_rule_lookup+0x156/0x240 ip6_route_output_flags+0xc6/0x150 __nf_ip6_route+0x23/0x50 synproxy_send_tcp_ipv6+0x106/0x200 synproxy_send_client_synack_ipv6+0x1aa/0x1f0 nft_synproxy_do_eval+0x263/0x310 nft_do_chain+0x5a8/0x5f0 [nf_tables nft_do_chain_inet+0x98/0x110 nf_hook_slow+0x43/0xc0 __ip6_local_out+0xf0/0x170 ip6_local_out+0x17/0x70 synproxy_send_tcp_ipv6+0x1a2/0x200 synproxy_send_client_synack_ipv6+0x1aa/0x1f0 [...] Implement objref and objrefmap expression validate functions. Currently, only NFT_OBJECT_SYNPROXY object type requires validation. This will also handle a jump to a chain using a synproxy object from the OUTPUT hook. Now when trying to reference a synproxy object in the OUTPUT hook, nft will produce the following error: synproxy_crash.nft: Error: Could not process rule: Operation not supported synproxy name mysynproxy ^^^^^^^^^^^^^^^^^^^^^^^^ Fixes: ee394f9 ("netfilter: nft_synproxy: add synproxy stateful object support") Reported-by: Georg Pfuetzenreuter <[email protected]> Closes: https://bugzilla.suse.com/1250237 Signed-off-by: Fernando Fernandez Mancera <[email protected]> Reviewed-by: Pablo Neira Ayuso <[email protected]> Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent d74bcf4 commit 7ea55a4

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

net/netfilter/nft_objref.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,35 @@ void nft_objref_eval(const struct nft_expr *expr,
2222
obj->ops->eval(obj, regs, pkt);
2323
}
2424

25+
static int nft_objref_validate_obj_type(const struct nft_ctx *ctx, u32 type)
26+
{
27+
unsigned int hooks;
28+
29+
switch (type) {
30+
case NFT_OBJECT_SYNPROXY:
31+
if (ctx->family != NFPROTO_IPV4 &&
32+
ctx->family != NFPROTO_IPV6 &&
33+
ctx->family != NFPROTO_INET)
34+
return -EOPNOTSUPP;
35+
36+
hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD);
37+
38+
return nft_chain_validate_hooks(ctx->chain, hooks);
39+
default:
40+
break;
41+
}
42+
43+
return 0;
44+
}
45+
46+
static int nft_objref_validate(const struct nft_ctx *ctx,
47+
const struct nft_expr *expr)
48+
{
49+
struct nft_object *obj = nft_objref_priv(expr);
50+
51+
return nft_objref_validate_obj_type(ctx, obj->ops->type->type);
52+
}
53+
2554
static int nft_objref_init(const struct nft_ctx *ctx,
2655
const struct nft_expr *expr,
2756
const struct nlattr * const tb[])
@@ -93,6 +122,7 @@ static const struct nft_expr_ops nft_objref_ops = {
93122
.activate = nft_objref_activate,
94123
.deactivate = nft_objref_deactivate,
95124
.dump = nft_objref_dump,
125+
.validate = nft_objref_validate,
96126
.reduce = NFT_REDUCE_READONLY,
97127
};
98128

@@ -197,6 +227,14 @@ static void nft_objref_map_destroy(const struct nft_ctx *ctx,
197227
nf_tables_destroy_set(ctx, priv->set);
198228
}
199229

230+
static int nft_objref_map_validate(const struct nft_ctx *ctx,
231+
const struct nft_expr *expr)
232+
{
233+
const struct nft_objref_map *priv = nft_expr_priv(expr);
234+
235+
return nft_objref_validate_obj_type(ctx, priv->set->objtype);
236+
}
237+
200238
static const struct nft_expr_ops nft_objref_map_ops = {
201239
.type = &nft_objref_type,
202240
.size = NFT_EXPR_SIZE(sizeof(struct nft_objref_map)),
@@ -206,6 +244,7 @@ static const struct nft_expr_ops nft_objref_map_ops = {
206244
.deactivate = nft_objref_map_deactivate,
207245
.destroy = nft_objref_map_destroy,
208246
.dump = nft_objref_map_dump,
247+
.validate = nft_objref_map_validate,
209248
.reduce = NFT_REDUCE_READONLY,
210249
};
211250

0 commit comments

Comments
 (0)