| From stable-bounces@linux.kernel.org Tue Apr 12 10:45:24 2005 |
| To: foo.foo.org |
| From: Kai.Makisara@kolumbus.fi |
| Date: Tue, 12 Apr 2005 19:52:08 +0200 |
| Cc: James.Bottomley@SteelEye.com |
| Subject: [PATCH] SCSI tape security: require CAP_ADMIN for SG_IO etc. |
| |
| The kernel currently allows any user permitted to access the tape device file |
| to send the tape drive commands that may either make the tape drivers internal |
| state inconsistent or to change the drive parameters so that other users find |
| the drive to be unusable. This patch changes ioctl handling so that SG_IO, |
| SCSI_IOCTL_COMMAND, etc. require CAP_ADMIN. This solves the consistency |
| problems for SCSI tapes. The st driver provides user-accessible commands to |
| change the drive parameters that users may need to access. |
| |
| The SCSI command permissions were discussed widely on the linux lists but this |
| did not result in any useful refinement of the permissions. It may very well |
| be that the tape drives are the only devices that users are sometimes given |
| permissions to access and that have security problems with the current command |
| filtering. This patch solves the problem for tapes and no more elaborate |
| patches are needed. |
| |
| Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi> |
| Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| |
| diff -Naru a/drivers/scsi/st.c b/drivers/scsi/st.c |
| --- a/drivers/scsi/st.c 2005-04-27 09:50:24 -07:00 |
| +++ b/drivers/scsi/st.c 2005-04-27 09:50:24 -07:00 |
| @@ -3461,11 +3461,17 @@ |
| case SCSI_IOCTL_GET_BUS_NUMBER: |
| break; |
| default: |
| - i = scsi_cmd_ioctl(file, STp->disk, cmd_in, p); |
| + if (!capable(CAP_SYS_ADMIN)) |
| + i = -EPERM; |
| + else |
| + i = scsi_cmd_ioctl(file, STp->disk, cmd_in, p); |
| if (i != -ENOTTY) |
| return i; |
| break; |
| } |
| + if (!capable(CAP_SYS_ADMIN) && |
| + (cmd_in == SCSI_IOCTL_START_UNIT || cmd_in == SCSI_IOCTL_STOP_UNIT)) |
| + return -EPERM; |
| return scsi_ioctl(STp->device, cmd_in, p); |
| |
| out: |