]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commit
net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
authorPeter Collingbourne <pcc@google.com>
Thu, 26 Aug 2021 19:46:01 +0000 (12:46 -0700)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 24 Sep 2021 09:58:54 +0000 (11:58 +0200)
commite0b899bbdcc63b4050f60f1c5a41dd7db38f4eca
tree3cebc457614424e0045fa35fac252bda1c346410
parenta60f80caf53bd4fef02a94b2a0d31324f65fffe3
net: don't unconditionally copy_from_user a struct ifreq for socket ioctls

BugLink: https://bugs.launchpad.net/bugs/1944610
commit d0efb16294d145d157432feda83877ae9d7cdf37 upstream.

A common implementation of isatty(3) involves calling a ioctl passing
a dummy struct argument and checking whether the syscall failed --
bionic and glibc use TCGETS (passing a struct termios), and musl uses
TIOCGWINSZ (passing a struct winsize). If the FD is a socket, we will
copy sizeof(struct ifreq) bytes of data from the argument and return
-EFAULT if that fails. The result is that the isatty implementations
may return a non-POSIX-compliant value in errno in the case where part
of the dummy struct argument is inaccessible, as both struct termios
and struct winsize are smaller than struct ifreq (at least on arm64).

Although there is usually enough stack space following the argument
on the stack that this did not present a practical problem up to now,
with MTE stack instrumentation it's more likely for the copy to fail,
as the memory following the struct may have a different tag.

Fix the problem by adding an early check for whether the ioctl is a
valid socket ioctl, and return -ENOTTY if it isn't.

Fixes: 44c02a2c3dc5 ("dev_ioctl(): move copyin/copyout to callers")
Link: https://linux-review.googlesource.com/id/I869da6cf6daabc3e4b7b82ac979683ba05e27d4d
Signed-off-by: Peter Collingbourne <pcc@google.com>
Cc: <stable@vger.kernel.org> # 4.19
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
include/linux/netdevice.h
net/socket.c