Skip to content

Commit 65eea8e

Browse files
Andy Whitcroftaxboe
authored andcommitted
floppy: Do not copy a kernel pointer to user memory in FDGETPRM ioctl
The final field of a floppy_struct is the field "name", which is a pointer to a string in kernel memory. The kernel pointer should not be copied to user memory. The FDGETPRM ioctl copies a floppy_struct to user memory, including this "name" field. This pointer cannot be used by the user and it will leak a kernel address to user-space, which will reveal the location of kernel code and data and undermine KASLR protection. Model this code after the compat ioctl which copies the returned data to a previously cleared temporary structure on the stack (excluding the name pointer) and copy out to userspace from there. As we already have an inparam union with an appropriate member and that memory is already cleared even for read only calls make use of that as a temporary store. Based on an initial patch by Brian Belleville. CVE-2018-7755 Signed-off-by: Andy Whitcroft <apw@canonical.com> Broke up long line. Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 7ce5c8c commit 65eea8e

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/block/floppy.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3467,6 +3467,9 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
34673467
(struct floppy_struct **)&outparam);
34683468
if (ret)
34693469
return ret;
3470+
memcpy(&inparam.g, outparam,
3471+
offsetof(struct floppy_struct, name));
3472+
outparam = &inparam.g;
34703473
break;
34713474
case FDMSGON:
34723475
UDP->flags |= FTD_MSG;

0 commit comments

Comments
 (0)