linux-uconsole/drivers/md
Alasdair G Kergon 1cf819361e dm ioctl: prevent unsafe change to dm_ioctl data_size
commit e910d7ebec 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-01-17 08:43:56 -08:00
..
bitmap.c md/bitmap: prevent bitmap_daemon_work running while initialising bitmap 2012-04-22 16:21:44 -07:00
bitmap.h md/bitmap: remove unused fields from struct bitmap 2011-06-09 11:43:01 +10:00
dm-bio-record.h
dm-crypt.c dm crypt: add missing error handling 2012-04-02 09:27:19 -07:00
dm-delay.c dm: convert workqueues to alloc_ordered 2011-01-13 19:59:57 +00:00
dm-exception-store.c dm exception store: fix init error path 2012-04-02 09:27:19 -07:00
dm-exception-store.h dm snapshot: test chunk size against both origin and snapshot 2010-08-12 04:13:51 +01:00
dm-flakey.c dm: do not forward ioctls from logical volumes to the underlying device 2012-01-25 17:24:54 -08:00
dm-io.c dm io: fix discard support 2012-03-12 10:33:01 -07:00
dm-ioctl.c dm ioctl: prevent unsafe change to dm_ioctl data_size 2013-01-17 08:43:56 -08:00
dm-kcopyd.c dm kcopyd: return client directly and not through a pointer 2011-05-29 13:03:13 +01:00
dm-linear.c dm: do not forward ioctls from logical volumes to the underlying device 2012-01-25 17:24:54 -08:00
dm-log-userspace-base.c dm log userspace: add version number to comms 2011-01-13 19:59:52 +00:00
dm-log-userspace-transfer.c netlink: kill eff_cap from struct netlink_skb_parms 2011-03-03 13:32:07 -08:00
dm-log-userspace-transfer.h dm log: userspace add luid to distinguish between concurrent log instances 2009-09-04 20:40:34 +01:00
dm-log.c dm io: use fixed initial mempool size 2011-05-29 13:03:09 +01:00
dm-mpath.c dm: do not forward ioctls from logical volumes to the underlying device 2012-01-25 17:24:54 -08:00
dm-mpath.h
dm-path-selector.c
dm-path-selector.h
dm-queue-length.c dm mpath: add queue length load balancer 2009-06-22 10:12:27 +01:00
dm-raid.c dm raid: fix flush support 2012-03-12 10:33:01 -07:00
dm-raid1.c dm raid1: fix crash with mirror recovery and discard 2012-08-01 12:26:54 -07:00
dm-region-hash.c dm raid1: fix crash with mirror recovery and discard 2012-08-01 12:26:54 -07:00
dm-round-robin.c
dm-service-time.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
dm-snap-persistent.c dm snapshot: flush disk cache when merging 2011-08-04 21:58:42 -07:00
dm-snap-transient.c dm snapshot: move cow ref from exception store to snap core 2009-12-10 23:52:12 +00:00
dm-snap.c dm kcopyd: return client directly and not through a pointer 2011-05-29 13:03:13 +01:00
dm-stripe.c dm stripe: implement merge method 2011-03-24 13:54:35 +00:00
dm-sysfs.c Driver core: Constify struct sysfs_ops in struct kobj_type 2010-03-07 17:04:49 -08:00
dm-table.c dm table: avoid crash if integrity profile changes 2011-10-16 14:14:53 -07:00
dm-target.c dm: error return error for discards 2010-08-12 04:14:14 +01:00
dm-uevent.c dm table: remove dm_get from dm_table_get_md 2010-03-06 02:29:52 +00:00
dm-uevent.h
dm-zero.c dm: zero silently drop discards 2010-08-12 04:14:12 +01:00
dm.c dm: fix deadlock with request based dm and queue request_fn recursion 2012-12-03 12:59:14 -08:00
dm.h block: Require subsystems to explicitly allocate bio_set integrity mempool 2011-03-17 11:11:05 +01:00
faulty.c Fix common misspellings 2011-03-31 11:26:23 -03:00
Kconfig dm: add flakey target 2011-03-24 13:54:24 +00:00
linear.c block: Require subsystems to explicitly allocate bio_set integrity mempool 2011-03-17 11:11:05 +01:00
linear.h md/linear: avoid corrupting structure while waiting for rcu_free to complete. 2011-10-03 11:40:03 -07:00
Makefile dm: add flakey target 2011-03-24 13:54:24 +00:00
md.c md: Don't truncate size at 4TB for RAID0 and Linear 2012-10-02 09:47:25 -07:00
md.h md: Avoid waking up a thread after it has been freed. 2011-10-16 14:14:53 -07:00
multipath.c md: Avoid waking up a thread after it has been freed. 2011-10-16 14:14:53 -07:00
multipath.h md/multipath: discard ->working_disks in favour of ->degraded 2011-05-11 14:38:02 +10:00
raid0.c block: Require subsystems to explicitly allocate bio_set integrity mempool 2011-03-17 11:11:05 +01:00
raid0.h md: fix handling of array level takeover that re-arranges devices. 2010-06-24 13:33:24 +10:00
raid1.c md/raid1,raid10: avoid deadlock during resync/recovery. 2012-04-02 09:27:11 -07:00
raid1.h MD: raid1 changes to allow use by device mapper 2011-06-08 15:11:31 +10:00
raid5.c md/raid5: Do not add data_offset before call to is_badblock 2012-07-16 08:47:51 -07:00
raid5.h md - remove old plugging code. 2011-04-18 18:25:42 +10:00
raid10.c md/raid10: Don't try to recovery unmatched (and unused) chunks. 2012-07-16 08:47:52 -07:00
raid10.h Fix common misspellings 2011-03-31 11:26:23 -03:00