Skip to content

Commit f095040

Browse files
edumazetkuba-moo
authored andcommitted
netlink: prevent potential spectre v1 gadgets
Most netlink attributes are parsed and validated from __nla_validate_parse() or validate_nla() u16 type = nla_type(nla); if (type == 0 || type > maxtype) { /* error or continue */ } @type is then used as an array index and can be used as a Spectre v1 gadget. array_index_nospec() can be used to prevent leaking content of kernel memory to malicious users. This should take care of vast majority of netlink uses, but an audit is needed to take care of others where validation is not yet centralized in core netlink functions. Fixes: bfa83a9 ("[NETLINK]: Type-safe netlink messages/attributes interface") Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/r/20230119110150.2678537-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 5deaa98 commit f095040

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

lib/nlattr.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/kernel.h>
1111
#include <linux/errno.h>
1212
#include <linux/jiffies.h>
13+
#include <linux/nospec.h>
1314
#include <linux/skbuff.h>
1415
#include <linux/string.h>
1516
#include <linux/types.h>
@@ -381,6 +382,7 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
381382
if (type <= 0 || type > maxtype)
382383
return 0;
383384

385+
type = array_index_nospec(type, maxtype + 1);
384386
pt = &policy[type];
385387

386388
BUG_ON(pt->type > NLA_TYPE_MAX);
@@ -596,6 +598,7 @@ static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
596598
}
597599
continue;
598600
}
601+
type = array_index_nospec(type, maxtype + 1);
599602
if (policy) {
600603
int err = validate_nla(nla, maxtype, policy,
601604
validate, extack, depth);

0 commit comments

Comments
 (0)