linux-stable/block
Paolo Bonzini 4d6fe88a64 block: fail SCSI passthrough ioctls on partition devices
commit 0bfc96cb77 upstream.

[ Changes with respect to 3.3: return -ENOTTY from scsi_verify_blk_ioctl
  and -ENOIOCTLCMD from sd_compat_ioctl. ]

Linux allows executing the SG_IO ioctl on a partition or LVM volume, and
will pass the command to the underlying block device.  This is
well-known, but it is also a large security problem when (via Unix
permissions, ACLs, SELinux or a combination thereof) a program or user
needs to be granted access only to part of the disk.

This patch lets partitions forward a small set of harmless ioctls;
others are logged with printk so that we can see which ioctls are
actually sent.  In my tests only CDROM_GET_CAPABILITY actually occurred.
Of course it was being sent to a (partition on a) hard disk, so it would
have failed with ENOTTY and the patch isn't changing anything in
practice.  Still, I'm treating it specially to avoid spamming the logs.

In principle, this restriction should include programs running with
CAP_SYS_RAWIO.  If for example I let a program access /dev/sda2 and
/dev/sdb, it still should not be able to read/write outside the
boundaries of /dev/sda2 independent of the capabilities.  However, for
now programs with CAP_SYS_RAWIO will still be allowed to send the
ioctls.  Their actions will still be logged.

This patch does not affect the non-libata IDE driver.  That driver
however already tests for bd != bd->bd_contains before issuing some
ioctl; it could be restricted further to forbid these ioctls even for
programs running with CAP_SYS_ADMIN/CAP_SYS_RAWIO.

Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Cc: James Bottomley <JBottomley@parallels.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
[ Make it also print the command name when warning - Linus ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
[bwh: Backport to 2.6.32 - ENOIOCTLCMD does not get converted to
 ENOTTY, so we must return ENOTTY directly]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Willy Tarreau <w@1wt.eu>
2012-02-11 15:40:55 +01:00
..
as-iosched.c Use WARN() in block/ 2008-07-26 12:00:07 -07:00
blk-barrier.c block: remove remaining __FUNCTION__ occurrences 2008-05-01 08:04:02 -07:00
blk-core.c block: move cmdfilter from gendisk to request_queue 2008-08-27 09:50:19 +02:00
blk-exec.c block: unexport blk_end_sync_rq 2008-07-15 21:21:45 +02:00
blk-integrity.c block: integrity flags can't use bit ops on unsigned short 2008-07-03 13:21:15 +02:00
blk-ioc.c cfq-iosched: fix RCU race in the cfq io_context destructor handling 2008-05-07 09:28:57 +02:00
blk-map.c block: check for proper length of iov entries in blk_rq_map_user_iov() 2010-12-09 13:24:15 -08:00
blk-merge.c block: fix nr_phys_segments miscalculation bug 2008-11-20 14:54:47 -08:00
blk-settings.c block: add blk_queue_update_dma_pad 2008-07-04 09:52:13 +02:00
blk-sysfs.c block: sysfs store function needs to grab queue_lock and use queue_flag_*() 2008-05-07 09:09:39 +02:00
blk-tag.c block: remove unused ->busy part of the block queue tag map 2008-08-27 09:50:19 +02:00
blk.h block: Block layer data integrity support 2008-07-03 13:21:13 +02:00
blktrace.c Added in user-injected messages into blk traces 2008-07-03 13:21:12 +02:00
bsg.c bsg: fix incorrect device_status value 2010-10-28 21:04:16 -07:00
cfq-iosched.c cfq-iosched: fix a rcu warning 2012-02-11 15:37:32 +01:00
cmd-filter.c block: disable sysfs parts of the disk command filter 2008-09-11 14:20:23 +02:00
compat_ioctl.c Fix misuses of bdevname() 2008-05-13 08:02:26 -07:00
deadline-iosched.c block: let elv_register() return void 2007-12-18 08:29:28 +01:00
elevator.c block: add proper state guards to __elv_next_request 2012-02-11 15:38:37 +01:00
genhd.c block: restore original behavior of /proc/partition when there's no partition 2008-09-01 08:55:10 +02:00
ioctl.c block/ioctl.c and fs/partition/check.c: check value returned by add_partition() 2008-07-25 10:53:44 -07:00
Kconfig Make SCSI SG v4 driver enabled by default and remove EXPERIMENTAL dependency, since udev depends on BSG 2009-08-16 14:26:33 -07:00
Kconfig.iosched update I/O sched Kconfig help texts - CFQ is now default, not AS. 2007-02-17 20:08:22 +01:00
Makefile allow userspace to modify scsi command filter on per device basis 2008-07-03 13:21:14 +02:00
noop-iosched.c block: let elv_register() return void 2007-12-18 08:29:28 +01:00
scsi_ioctl.c block: fail SCSI passthrough ioctls on partition devices 2012-02-11 15:40:55 +01:00