netfilter: Only allow sane values in nf_register_net_hook
[cascardo/linux.git] / net / netfilter / core.c
1 /* netfilter.c: look after the filters for various protocols.
2  * Heavily influenced by the old firewall.c by David Bonn and Alan Cox.
3  *
4  * Thanks to Rob `CmdrTaco' Malda for not influencing this code in any
5  * way.
6  *
7  * Rusty Russell (C)2000 -- This code is GPL.
8  * Patrick McHardy (c) 2006-2012
9  */
10 #include <linux/kernel.h>
11 #include <linux/netfilter.h>
12 #include <net/protocol.h>
13 #include <linux/init.h>
14 #include <linux/skbuff.h>
15 #include <linux/wait.h>
16 #include <linux/module.h>
17 #include <linux/interrupt.h>
18 #include <linux/if.h>
19 #include <linux/netdevice.h>
20 #include <linux/netfilter_ipv6.h>
21 #include <linux/inetdevice.h>
22 #include <linux/proc_fs.h>
23 #include <linux/mutex.h>
24 #include <linux/slab.h>
25 #include <net/net_namespace.h>
26 #include <net/sock.h>
27
28 #include "nf_internals.h"
29
30 static DEFINE_MUTEX(afinfo_mutex);
31
32 const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;
33 EXPORT_SYMBOL(nf_afinfo);
34 const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly;
35 EXPORT_SYMBOL_GPL(nf_ipv6_ops);
36
37 DEFINE_PER_CPU(bool, nf_skb_duplicated);
38 EXPORT_SYMBOL_GPL(nf_skb_duplicated);
39
40 int nf_register_afinfo(const struct nf_afinfo *afinfo)
41 {
42         mutex_lock(&afinfo_mutex);
43         RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo);
44         mutex_unlock(&afinfo_mutex);
45         return 0;
46 }
47 EXPORT_SYMBOL_GPL(nf_register_afinfo);
48
49 void nf_unregister_afinfo(const struct nf_afinfo *afinfo)
50 {
51         mutex_lock(&afinfo_mutex);
52         RCU_INIT_POINTER(nf_afinfo[afinfo->family], NULL);
53         mutex_unlock(&afinfo_mutex);
54         synchronize_rcu();
55 }
56 EXPORT_SYMBOL_GPL(nf_unregister_afinfo);
57
58 #ifdef HAVE_JUMP_LABEL
59 struct static_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS];
60 EXPORT_SYMBOL(nf_hooks_needed);
61 #endif
62
63 static DEFINE_MUTEX(nf_hook_mutex);
64
65 static struct list_head *nf_find_hook_list(struct net *net,
66                                            const struct nf_hook_ops *reg)
67 {
68         struct list_head *hook_list = NULL;
69
70         if (reg->pf != NFPROTO_NETDEV)
71                 hook_list = &net->nf.hooks[reg->pf][reg->hooknum];
72         else if (reg->hooknum == NF_NETDEV_INGRESS) {
73 #ifdef CONFIG_NETFILTER_INGRESS
74                 if (reg->dev && dev_net(reg->dev) == net)
75                         hook_list = &reg->dev->nf_hooks_ingress;
76 #endif
77         }
78         return hook_list;
79 }
80
81 struct nf_hook_entry {
82         const struct nf_hook_ops        *orig_ops;
83         struct nf_hook_ops              ops;
84 };
85
86 int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg)
87 {
88         struct list_head *hook_list;
89         struct nf_hook_entry *entry;
90         struct nf_hook_ops *elem;
91
92         if (reg->pf == NFPROTO_NETDEV &&
93             (reg->hooknum != NF_NETDEV_INGRESS ||
94              !reg->dev || dev_net(reg->dev) != net))
95                 return -EINVAL;
96
97         entry = kmalloc(sizeof(*entry), GFP_KERNEL);
98         if (!entry)
99                 return -ENOMEM;
100
101         entry->orig_ops = reg;
102         entry->ops      = *reg;
103
104         hook_list = nf_find_hook_list(net, reg);
105         if (!hook_list) {
106                 kfree(entry);
107                 return -ENOENT;
108         }
109
110         mutex_lock(&nf_hook_mutex);
111         list_for_each_entry(elem, hook_list, list) {
112                 if (reg->priority < elem->priority)
113                         break;
114         }
115         list_add_rcu(&entry->ops.list, elem->list.prev);
116         mutex_unlock(&nf_hook_mutex);
117 #ifdef CONFIG_NETFILTER_INGRESS
118         if (reg->pf == NFPROTO_NETDEV && reg->hooknum == NF_NETDEV_INGRESS)
119                 net_inc_ingress_queue();
120 #endif
121 #ifdef HAVE_JUMP_LABEL
122         static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
123 #endif
124         return 0;
125 }
126 EXPORT_SYMBOL(nf_register_net_hook);
127
128 void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg)
129 {
130         struct list_head *hook_list;
131         struct nf_hook_entry *entry;
132         struct nf_hook_ops *elem;
133
134         hook_list = nf_find_hook_list(net, reg);
135         if (!hook_list)
136                 return;
137
138         mutex_lock(&nf_hook_mutex);
139         list_for_each_entry(elem, hook_list, list) {
140                 entry = container_of(elem, struct nf_hook_entry, ops);
141                 if (entry->orig_ops == reg) {
142                         list_del_rcu(&entry->ops.list);
143                         break;
144                 }
145         }
146         mutex_unlock(&nf_hook_mutex);
147         if (&elem->list == hook_list) {
148                 WARN(1, "nf_unregister_net_hook: hook not found!\n");
149                 return;
150         }
151 #ifdef CONFIG_NETFILTER_INGRESS
152         if (reg->pf == NFPROTO_NETDEV && reg->hooknum == NF_NETDEV_INGRESS)
153                 net_dec_ingress_queue();
154 #endif
155 #ifdef HAVE_JUMP_LABEL
156         static_key_slow_dec(&nf_hooks_needed[reg->pf][reg->hooknum]);
157 #endif
158         synchronize_net();
159         nf_queue_nf_hook_drop(net, &entry->ops);
160         /* other cpu might still process nfqueue verdict that used reg */
161         synchronize_net();
162         kfree(entry);
163 }
164 EXPORT_SYMBOL(nf_unregister_net_hook);
165
166 int nf_register_net_hooks(struct net *net, const struct nf_hook_ops *reg,
167                           unsigned int n)
168 {
169         unsigned int i;
170         int err = 0;
171
172         for (i = 0; i < n; i++) {
173                 err = nf_register_net_hook(net, &reg[i]);
174                 if (err)
175                         goto err;
176         }
177         return err;
178
179 err:
180         if (i > 0)
181                 nf_unregister_net_hooks(net, reg, i);
182         return err;
183 }
184 EXPORT_SYMBOL(nf_register_net_hooks);
185
186 void nf_unregister_net_hooks(struct net *net, const struct nf_hook_ops *reg,
187                              unsigned int n)
188 {
189         while (n-- > 0)
190                 nf_unregister_net_hook(net, &reg[n]);
191 }
192 EXPORT_SYMBOL(nf_unregister_net_hooks);
193
194 static LIST_HEAD(nf_hook_list);
195
196 int nf_register_hook(struct nf_hook_ops *reg)
197 {
198         struct net *net, *last;
199         int ret;
200
201         rtnl_lock();
202         for_each_net(net) {
203                 ret = nf_register_net_hook(net, reg);
204                 if (ret && ret != -ENOENT)
205                         goto rollback;
206         }
207         list_add_tail(&reg->list, &nf_hook_list);
208         rtnl_unlock();
209
210         return 0;
211 rollback:
212         last = net;
213         for_each_net(net) {
214                 if (net == last)
215                         break;
216                 nf_unregister_net_hook(net, reg);
217         }
218         rtnl_unlock();
219         return ret;
220 }
221 EXPORT_SYMBOL(nf_register_hook);
222
223 void nf_unregister_hook(struct nf_hook_ops *reg)
224 {
225         struct net *net;
226
227         rtnl_lock();
228         list_del(&reg->list);
229         for_each_net(net)
230                 nf_unregister_net_hook(net, reg);
231         rtnl_unlock();
232 }
233 EXPORT_SYMBOL(nf_unregister_hook);
234
235 int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)
236 {
237         unsigned int i;
238         int err = 0;
239
240         for (i = 0; i < n; i++) {
241                 err = nf_register_hook(&reg[i]);
242                 if (err)
243                         goto err;
244         }
245         return err;
246
247 err:
248         if (i > 0)
249                 nf_unregister_hooks(reg, i);
250         return err;
251 }
252 EXPORT_SYMBOL(nf_register_hooks);
253
254 void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
255 {
256         while (n-- > 0)
257                 nf_unregister_hook(&reg[n]);
258 }
259 EXPORT_SYMBOL(nf_unregister_hooks);
260
261 unsigned int nf_iterate(struct list_head *head,
262                         struct sk_buff *skb,
263                         struct nf_hook_state *state,
264                         struct nf_hook_ops **elemp)
265 {
266         unsigned int verdict;
267
268         /*
269          * The caller must not block between calls to this
270          * function because of risk of continuing from deleted element.
271          */
272         list_for_each_entry_continue_rcu((*elemp), head, list) {
273                 if (state->thresh > (*elemp)->priority)
274                         continue;
275
276                 /* Optimization: we don't need to hold module
277                    reference here, since function can't sleep. --RR */
278 repeat:
279                 verdict = (*elemp)->hook((*elemp)->priv, skb, state);
280                 if (verdict != NF_ACCEPT) {
281 #ifdef CONFIG_NETFILTER_DEBUG
282                         if (unlikely((verdict & NF_VERDICT_MASK)
283                                                         > NF_MAX_VERDICT)) {
284                                 NFDEBUG("Evil return from %p(%u).\n",
285                                         (*elemp)->hook, state->hook);
286                                 continue;
287                         }
288 #endif
289                         if (verdict != NF_REPEAT)
290                                 return verdict;
291                         goto repeat;
292                 }
293         }
294         return NF_ACCEPT;
295 }
296
297
298 /* Returns 1 if okfn() needs to be executed by the caller,
299  * -EPERM for NF_DROP, 0 otherwise.  Caller must hold rcu_read_lock. */
300 int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state)
301 {
302         struct nf_hook_ops *elem;
303         unsigned int verdict;
304         int ret = 0;
305
306         elem = list_entry_rcu(state->hook_list, struct nf_hook_ops, list);
307 next_hook:
308         verdict = nf_iterate(state->hook_list, skb, state, &elem);
309         if (verdict == NF_ACCEPT || verdict == NF_STOP) {
310                 ret = 1;
311         } else if ((verdict & NF_VERDICT_MASK) == NF_DROP) {
312                 kfree_skb(skb);
313                 ret = NF_DROP_GETERR(verdict);
314                 if (ret == 0)
315                         ret = -EPERM;
316         } else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE) {
317                 int err = nf_queue(skb, elem, state,
318                                    verdict >> NF_VERDICT_QBITS);
319                 if (err < 0) {
320                         if (err == -ESRCH &&
321                            (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS))
322                                 goto next_hook;
323                         kfree_skb(skb);
324                 }
325         }
326         return ret;
327 }
328 EXPORT_SYMBOL(nf_hook_slow);
329
330
331 int skb_make_writable(struct sk_buff *skb, unsigned int writable_len)
332 {
333         if (writable_len > skb->len)
334                 return 0;
335
336         /* Not exclusive use of packet?  Must copy. */
337         if (!skb_cloned(skb)) {
338                 if (writable_len <= skb_headlen(skb))
339                         return 1;
340         } else if (skb_clone_writable(skb, writable_len))
341                 return 1;
342
343         if (writable_len <= skb_headlen(skb))
344                 writable_len = 0;
345         else
346                 writable_len -= skb_headlen(skb);
347
348         return !!__pskb_pull_tail(skb, writable_len);
349 }
350 EXPORT_SYMBOL(skb_make_writable);
351
352 /* This needs to be compiled in any case to avoid dependencies between the
353  * nfnetlink_queue code and nf_conntrack.
354  */
355 struct nfnl_ct_hook __rcu *nfnl_ct_hook __read_mostly;
356 EXPORT_SYMBOL_GPL(nfnl_ct_hook);
357
358 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
359 /* This does not belong here, but locally generated errors need it if connection
360    tracking in use: without this, connection may not be in hash table, and hence
361    manufactured ICMP or RST packets will not be associated with it. */
362 void (*ip_ct_attach)(struct sk_buff *, const struct sk_buff *)
363                 __rcu __read_mostly;
364 EXPORT_SYMBOL(ip_ct_attach);
365
366 void nf_ct_attach(struct sk_buff *new, const struct sk_buff *skb)
367 {
368         void (*attach)(struct sk_buff *, const struct sk_buff *);
369
370         if (skb->nfct) {
371                 rcu_read_lock();
372                 attach = rcu_dereference(ip_ct_attach);
373                 if (attach)
374                         attach(new, skb);
375                 rcu_read_unlock();
376         }
377 }
378 EXPORT_SYMBOL(nf_ct_attach);
379
380 void (*nf_ct_destroy)(struct nf_conntrack *) __rcu __read_mostly;
381 EXPORT_SYMBOL(nf_ct_destroy);
382
383 void nf_conntrack_destroy(struct nf_conntrack *nfct)
384 {
385         void (*destroy)(struct nf_conntrack *);
386
387         rcu_read_lock();
388         destroy = rcu_dereference(nf_ct_destroy);
389         BUG_ON(destroy == NULL);
390         destroy(nfct);
391         rcu_read_unlock();
392 }
393 EXPORT_SYMBOL(nf_conntrack_destroy);
394
395 /* Built-in default zone used e.g. by modules. */
396 const struct nf_conntrack_zone nf_ct_zone_dflt = {
397         .id     = NF_CT_DEFAULT_ZONE_ID,
398         .dir    = NF_CT_DEFAULT_ZONE_DIR,
399 };
400 EXPORT_SYMBOL_GPL(nf_ct_zone_dflt);
401 #endif /* CONFIG_NF_CONNTRACK */
402
403 #ifdef CONFIG_NF_NAT_NEEDED
404 void (*nf_nat_decode_session_hook)(struct sk_buff *, struct flowi *);
405 EXPORT_SYMBOL(nf_nat_decode_session_hook);
406 #endif
407
408 static int nf_register_hook_list(struct net *net)
409 {
410         struct nf_hook_ops *elem;
411         int ret;
412
413         rtnl_lock();
414         list_for_each_entry(elem, &nf_hook_list, list) {
415                 ret = nf_register_net_hook(net, elem);
416                 if (ret && ret != -ENOENT)
417                         goto out_undo;
418         }
419         rtnl_unlock();
420         return 0;
421
422 out_undo:
423         list_for_each_entry_continue_reverse(elem, &nf_hook_list, list)
424                 nf_unregister_net_hook(net, elem);
425         rtnl_unlock();
426         return ret;
427 }
428
429 static void nf_unregister_hook_list(struct net *net)
430 {
431         struct nf_hook_ops *elem;
432
433         rtnl_lock();
434         list_for_each_entry(elem, &nf_hook_list, list)
435                 nf_unregister_net_hook(net, elem);
436         rtnl_unlock();
437 }
438
439 static int __net_init netfilter_net_init(struct net *net)
440 {
441         int i, h, ret;
442
443         for (i = 0; i < ARRAY_SIZE(net->nf.hooks); i++) {
444                 for (h = 0; h < NF_MAX_HOOKS; h++)
445                         INIT_LIST_HEAD(&net->nf.hooks[i][h]);
446         }
447
448 #ifdef CONFIG_PROC_FS
449         net->nf.proc_netfilter = proc_net_mkdir(net, "netfilter",
450                                                 net->proc_net);
451         if (!net->nf.proc_netfilter) {
452                 if (!net_eq(net, &init_net))
453                         pr_err("cannot create netfilter proc entry");
454
455                 return -ENOMEM;
456         }
457 #endif
458         ret = nf_register_hook_list(net);
459         if (ret)
460                 remove_proc_entry("netfilter", net->proc_net);
461
462         return ret;
463 }
464
465 static void __net_exit netfilter_net_exit(struct net *net)
466 {
467         nf_unregister_hook_list(net);
468         remove_proc_entry("netfilter", net->proc_net);
469 }
470
471 static struct pernet_operations netfilter_net_ops = {
472         .init = netfilter_net_init,
473         .exit = netfilter_net_exit,
474 };
475
476 int __init netfilter_init(void)
477 {
478         int ret;
479
480         ret = register_pernet_subsys(&netfilter_net_ops);
481         if (ret < 0)
482                 goto err;
483
484         ret = netfilter_log_init();
485         if (ret < 0)
486                 goto err_pernet;
487
488         return 0;
489 err_pernet:
490         unregister_pernet_subsys(&netfilter_net_ops);
491 err:
492         return ret;
493 }