The second memcpy in lowpan_iphc_mcast_ctx_addr_compress() uses
&data[1] as destination and &ipaddr->s6_addr[11] as source, but
both should be offset by one: &data[2] and &ipaddr->s6_addr[12]
respectively.
This off-by-one has two consequences:
1. data[1] is overwritten with s6_addr[11], corrupting the RIID
field in the compressed multicast address
2. data[5] is never written, so uninitialized kernel stack memory
is transmitted over the network via lowpan_push_hc_data(),
leaking kernel stack contents
The correct inline data layout must match what the decompression
function lowpan_uncompress_multicast_ctx_daddr() expects:
data[0..1] = s6_addr[1..2] (flags/scope + RIID)
data[2..5] = s6_addr[12..15] (group ID)
Also zero-initialize the data array as a defensive measure against
similar bugs in the future.
Fixes:
|
||
|---|---|---|
| .. | ||
| 6lowpan_i.h | ||
| core.c | ||
| debugfs.c | ||
| iphc.c | ||
| Kconfig | ||
| Makefile | ||
| ndisc.c | ||
| nhc.c | ||
| nhc.h | ||
| nhc_dest.c | ||
| nhc_fragment.c | ||
| nhc_ghc_ext_dest.c | ||
| nhc_ghc_ext_frag.c | ||
| nhc_ghc_ext_hop.c | ||
| nhc_ghc_ext_route.c | ||
| nhc_ghc_icmpv6.c | ||
| nhc_ghc_udp.c | ||
| nhc_hop.c | ||
| nhc_ipv6.c | ||
| nhc_mobility.c | ||
| nhc_routing.c | ||
| nhc_udp.c | ||