Skip to content

Commit 9aba6c5

Browse files
peilin-yedavem330
authored andcommitted
openvswitch: Prevent kernel-infoleak in ovs_ct_put_key()
ovs_ct_put_key() is potentially copying uninitialized kernel stack memory into socket buffers, since the compiler may leave a 3-byte hole at the end of `struct ovs_key_ct_tuple_ipv4` and `struct ovs_key_ct_tuple_ipv6`. Fix it by initializing `orig` with memset(). Fixes: 9dd7f89 ("openvswitch: Add original direction conntrack tuple to sw_flow_key.") Suggested-by: Dan Carpenter <[email protected]> Signed-off-by: Peilin Ye <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 038ebb1 commit 9aba6c5

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

net/openvswitch/conntrack.c

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,6 @@ void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key)
276276
ovs_ct_update_key(skb, NULL, key, false, false);
277277
}
278278

279-
#define IN6_ADDR_INITIALIZER(ADDR) \
280-
{ (ADDR).s6_addr32[0], (ADDR).s6_addr32[1], \
281-
(ADDR).s6_addr32[2], (ADDR).s6_addr32[3] }
282-
283279
int ovs_ct_put_key(const struct sw_flow_key *swkey,
284280
const struct sw_flow_key *output, struct sk_buff *skb)
285281
{
@@ -301,24 +297,30 @@ int ovs_ct_put_key(const struct sw_flow_key *swkey,
301297

302298
if (swkey->ct_orig_proto) {
303299
if (swkey->eth.type == htons(ETH_P_IP)) {
304-
struct ovs_key_ct_tuple_ipv4 orig = {
305-
output->ipv4.ct_orig.src,
306-
output->ipv4.ct_orig.dst,
307-
output->ct.orig_tp.src,
308-
output->ct.orig_tp.dst,
309-
output->ct_orig_proto,
310-
};
300+
struct ovs_key_ct_tuple_ipv4 orig;
301+
302+
memset(&orig, 0, sizeof(orig));
303+
orig.ipv4_src = output->ipv4.ct_orig.src;
304+
orig.ipv4_dst = output->ipv4.ct_orig.dst;
305+
orig.src_port = output->ct.orig_tp.src;
306+
orig.dst_port = output->ct.orig_tp.dst;
307+
orig.ipv4_proto = output->ct_orig_proto;
308+
311309
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4,
312310
sizeof(orig), &orig))
313311
return -EMSGSIZE;
314312
} else if (swkey->eth.type == htons(ETH_P_IPV6)) {
315-
struct ovs_key_ct_tuple_ipv6 orig = {
316-
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.src),
317-
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.dst),
318-
output->ct.orig_tp.src,
319-
output->ct.orig_tp.dst,
320-
output->ct_orig_proto,
321-
};
313+
struct ovs_key_ct_tuple_ipv6 orig;
314+
315+
memset(&orig, 0, sizeof(orig));
316+
memcpy(orig.ipv6_src, output->ipv6.ct_orig.src.s6_addr32,
317+
sizeof(orig.ipv6_src));
318+
memcpy(orig.ipv6_dst, output->ipv6.ct_orig.dst.s6_addr32,
319+
sizeof(orig.ipv6_dst));
320+
orig.src_port = output->ct.orig_tp.src;
321+
orig.dst_port = output->ct.orig_tp.dst;
322+
orig.ipv6_proto = output->ct_orig_proto;
323+
322324
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6,
323325
sizeof(orig), &orig))
324326
return -EMSGSIZE;

0 commit comments

Comments
 (0)