|
Message-ID: <205969c0-ee68-4f6b-1549-058c46f02f47@virtuozzo.com> Date: Mon, 25 Jun 2018 13:03:48 +0300 From: Vasily Averin <vvs@...tuozzo.com> To: Solar Designer <solar@...nwall.com>, owl-dev@...ts.openwall.com Subject: Re: 32-bit syscall breakage in -431 kernel with KAISER Dear Alexander, did you tried to reproduce the problem on original -431.el5 kernel? On 2018-06-24 22:18, Solar Designer wrote: > Hi, > > So we got reported this bug (or maybe several bugs, but luckily they all > look related to me so far): > > http://www.openwall.com/lists/owl-users/2018/06/21/2 > > I'm not sure if it's worth our time with so few users left (and > interested in upgrading the kernel for security fixes), but it is indeed > weird to release a kernel update with those regressions and then do > nothing about them. So I finally looked into this today. > > My preliminary analysis suggests that maybe the KAISER backport broke > the pt_regs ABI for 32-bit syscalls in x86_64 kernels. Specifically, > SIOCGIFCONF might be failing with EFAULT because fs/compat_ioctl.c: > dev_ifconf() uses compat_alloc_user_space(): > > static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg) > { > struct ifconf32 ifc32; > struct ifconf ifc; > struct ifconf __user *uifc; > struct ifreq32 __user *ifr32; > struct ifreq __user *ifr; > unsigned int i, j; > int err; > > if (copy_from_user(&ifc32, compat_ptr(arg), sizeof(struct ifconf32))) > return -EFAULT; > > if (ifc32.ifcbuf == 0) { > ifc32.ifc_len = 0; > ifc.ifc_len = 0; > ifc.ifc_req = NULL; > uifc = compat_alloc_user_space(sizeof(struct ifconf)); > } else { > size_t len =((ifc32.ifc_len / sizeof (struct ifreq32)) + 1) * > sizeof (struct ifreq); > uifc = compat_alloc_user_space(sizeof(struct ifconf) + len); > > which in turn relies on pt_regs: > > static __inline__ void __user *arch_compat_alloc_user_space(long len) > { > struct pt_regs *regs = task_pt_regs(current); > return (void __user *)regs->rsp - len; > } > > Searching for other uses of compat_alloc_user_space(), I find there are > not a lot overall, but this includes many uses in ipc/compat.c. This > led me to test the ipcs(1) command, and indeed it's partially broken: > > root@...32:/ # ipcs > > kernel not configured for shared memory > > ------ Semaphore Arrays -------- > key semid owner perms nsems > > ------ Message Queues -------- > key msqid owner perms used-bytes messages > > The "kernel not configured for shared memory" line appears in a 32-bit > container now, but not in 64-bit. > > I also took a look at the 32-bit syscall entry code changes, but don't > immediately see any breakage of the pt_regs ABI. So maybe my guess is > wrong, or maybe I just don't see how it's right. > > The bug might have come from the RHEL5 ELS changes, or it might have > been introduced in the merging with OpenVZ, or it might have been > introduced in Owl (such as with our different kernel config and our > different gcc, whereas our patch is too small and unrelated to be a > likely culprit). It doesn't have to be with KAISER - it could also be > with RETPOLINE, which is disabled in this build but it does make many > invasive changes anyway (even if no-op'ish for security). > > I tried searching whether this is possibly a known issue for RHEL5 ELS, > but couldn't find anything. I guess not many systems use RHEL5 ELS and > its rebuilds, and those who do are possibly 64-bit only. > > Alexander >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.