can: af_can: Fix Spectre v1 vulnerability
Subsystems (4)
PATCH 1/1 can: af_can: Fix Spectre v1 vulnerability
protocol is indirectly controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability.
This issue was detected with the help of Smatch:
net/can/af_can.c:115 can_get_proto() warn: potential spectre issue 'proto_tab' [w]
Fix this by sanitizing protocol before using it to index proto_tab.
Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1].
[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2
--- net/can/af_can.c | 2 ++ 1 file changed, 2 insertions(+)
net/can/af_can.c +2 -0
@@ -59,6 +59,7 @@#include <linux/can/core.h> #include <linux/can/skb.h> #include <linux/ratelimit.h> +#include <linux/nospec.h> #include <net/net_namespace.h> #include <net/sock.h>
@@ -136,6 +137,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol,if (protocol <0 || protocol >=CAN_NPROTO )return -EINVAL ; + protocol =array_index_nospec (protocol,CAN_NPROTO ); cp =can_get_proto (protocol);
Signature · 1 line
2.20.1
Oliver Hartkopp
maintainerAfter *trying* to follow the discussion on ...
https://marc.info/?l=linux-kernel&m=154554485324143&w=2
[PATCH] net: core: Fix Spectre v1 vulnerability
... I'm still not sure whether af_can.c needs this enhancement or not.
Just waiting for the end of the discussion :-)
Thanks to the experts!
Oliver
Quoted 41 lines · Gustavo A. R. Silva
protocol is indirectly controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability.
This issue was detected with the help of Smatch:
net/can/af_can.c:115can_get_proto()warn: potential spectre issue 'proto_tab' [w]Fix this by sanitizing protocol before using it to index
proto_tab.Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1].
[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2
Signed-off-by Gustavo A. R. Silva <[email protected]>--- net/can/af_can.c | 2 ++ 1 file changed, 2 insertions(+)net/can/af_can.c +2
-0@@ -59,6 +59,7 @@#include <linux/can/core.h> #include <linux/can/skb.h> #include <linux/ratelimit.h> +#include <linux/nospec.h> #include <net/net_namespace.h> #include <net/sock.h> @@ -136,6 +137,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol,if (protocol <0 || protocol >=CAN_NPROTO )return -EINVAL ; + protocol =array_index_nospec (protocol,CAN_NPROTO ); cp =can_get_proto (protocol);