On Tue, 2019-08-27 at 12:35 +0200, Pablo Neira Ayuso wrote: > On Wed, Aug 21, 2019 at 11:15:06AM -0300, Leonardo Bras wrote: > > If IPv6 is disabled on boot (ipv6.disable=1), but nft_fib_inet ends up > > dealing with a IPv6 package, it causes a kernel panic in > > fib6_node_lookup_1(), crashing in bad_page_fault. > > Q: How do you get to see IPv6 packets if IPv6 module is disable? I could reproduce this bug on a host ('ipv6.disable=1') starting a guest with a virtio-net interface with 'filterref' over a virtual bridge. It crashes the host during guest boot (just before login). By that I could understand that a guest IPv6 network traffic (viavirtio-net) may cause this kernel panic. > > > The panic is caused by trying to deference a very low address (0x38 > > in ppc64le), due to ipv6.fib6_main_tbl = NULL. > > BUG: Kernel NULL pointer dereference at 0x00000038 > > > > Fix this behavior by dropping IPv6 packages if !ipv6_mod_enabled(). > > I'd suggest: s/package/packet/ Sure, I will make sure to put it on v3. (Sorry, I am not very used to net subsystem.) > > [...] > > diff --git a/net/ipv6/netfilter/nft_fib_ipv6.c b/net/ipv6/netfilter/nft_fib_ipv6.c > > index 7ece86afd079..75acc417e2ff 100644 > > --- a/net/ipv6/netfilter/nft_fib_ipv6.c > > +++ b/net/ipv6/netfilter/nft_fib_ipv6.c > > @@ -125,6 +125,11 @@ void nft_fib6_eval_type(const struct nft_expr *expr, struct nft_regs *regs, > > u32 *dest = ®s->data[priv->dreg]; > > struct ipv6hdr *iph, _iph; > > > > + if (!ipv6_mod_enabled()) { > > + regs->verdict.code = NF_DROP; > > NFT_BREAK instead to stop evaluating this rule, this results in a > mismatch, so you let the user decide what to do with packets that do > not match your policy. Ok, I will replace for v3. > > The drop case at the bottom of the fib eval function never actually > never happens. Which one do you mean?
Attachment:
signature.asc
Description: This is a digitally signed message part