]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
dm ioctl: prevent unsafe change to dm_ioctl data_size
authorAlasdair G Kergon <agk@redhat.com>
Fri, 21 Dec 2012 20:23:30 +0000 (20:23 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 3 Jan 2013 03:33:47 +0000 (03:33 +0000)
commitd25ade997c12e108732c8c6d3c8bc63b4c6ec94e
tree8f54402cc5bba529337abd5c3ca7f3e5d68e519d
parent3d4adaa4374fef55014b1306fd5def3f5bb6d548
dm ioctl: prevent unsafe change to dm_ioctl data_size

commit e910d7ebecd1aac43125944a8641b6cb1a0dfabe upstream.

Abort dm ioctl processing if userspace changes the data_size parameter
after we validated it but before we finished copying the data buffer
from userspace.

The dm ioctl parameters are processed in the following sequence:
 1. ctl_ioctl() calls copy_params();
 2. copy_params() makes a first copy of the fixed-sized portion of the
    userspace parameters into the local variable "tmp";
 3. copy_params() then validates tmp.data_size and allocates a new
    structure big enough to hold the complete data and copies the whole
    userspace buffer there;
 4. ctl_ioctl() reads userspace data the second time and copies the whole
    buffer into the pointer "param";
 5. ctl_ioctl() reads param->data_size without any validation and stores it
    in the variable "input_param_size";
 6. "input_param_size" is further used as the authoritative size of the
    kernel buffer.

The problem is that userspace code could change the contents of user
memory between steps 2 and 4.  In particular, the data_size parameter
can be changed to an invalid value after the kernel has validated it.
This lets userspace force the kernel to access invalid kernel memory.

The fix is to ensure that the size has not changed at step 4.

This patch shouldn't have a security impact because CAP_SYS_ADMIN is
required to run this code, but it should be fixed anyway.

Reported-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/md/dm-ioctl.c