xsk: Fix missing validation for skb and unaligned mode
authorMagnus Karlsson <magnus.karlsson@intel.com>
Thu, 17 Jun 2021 09:22:55 +0000 (11:22 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 18 Jun 2021 14:57:19 +0000 (16:57 +0200)
commit2f99619820c2269534eb2c0cde44870313c6d353
tree4b3a52f786b38c8d401189fee8ab93e600880e40
parent1c200f832e14420fa770193f9871f4ce2df00d07
xsk: Fix missing validation for skb and unaligned mode

Fix a missing validation of a Tx descriptor when executing in skb mode
and the umem is in unaligned mode. A descriptor could point to a
buffer straddling the end of the umem, thus effectively tricking the
kernel to read outside the allowed umem region. This could lead to a
kernel crash if that part of memory is not mapped.

In zero-copy mode, the descriptor validation code rejects such
descriptors by checking a bit in the DMA address that tells us if the
next page is physically contiguous or not. For the last page in the
umem, this bit is not set, therefore any descriptor pointing to a
packet straddling this last page boundary will be rejected. However,
the skb path does not use this bit since it copies out data and can do
so to two different pages. (It also does not have the array of DMA
address, so it cannot even store this bit.) The code just returned
that the packet is always physically contiguous. But this is
unfortunately also returned for the last page in the umem, which means
that packets that cross the end of the umem are being allowed, which
they should not be.

Fix this by introducing a check for this in the SKB path only, not
penalizing the zero-copy path.

Fixes: 2b43470add8c ("xsk: Introduce AF_XDP buffer allocation API")
Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Björn Töpel <bjorn@kernel.org>
Link: https://lore.kernel.org/bpf/20210617092255.3487-1-magnus.karlsson@gmail.com
include/net/xsk_buff_pool.h