* cd burning with plextor drives. @ 2006-07-29 4:52 Dave Jones 2006-07-29 11:12 ` Jens Axboe 0 siblings, 1 reply; 35+ messages in thread From: Dave Jones @ 2006-07-29 4:52 UTC (permalink / raw) To: linux-scsi AFAICT, this has been broken since the code to sanitise scsi commands was added circa 2.6.8 or so. It seems cdrecord tries to send some vendor specific commands to Plextor drives, and fails miserably as can be seen here.. https://bugzilla.redhat.com/bugzilla/attachment.cgi?id=124267 I'm not that familiar with this code, but would adding exceptions on a per-vendor basis in sg_allow_access() be the way forward here? If not, what is the right answer ? Dave -- http://www.codemonkey.org.uk ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 4:52 cd burning with plextor drives Dave Jones @ 2006-07-29 11:12 ` Jens Axboe 2006-07-29 13:40 ` James Bottomley 2006-07-29 17:04 ` Linus Torvalds 0 siblings, 2 replies; 35+ messages in thread From: Jens Axboe @ 2006-07-29 11:12 UTC (permalink / raw) To: Dave Jones; +Cc: linux-scsi, torvalds On Sat, Jul 29 2006, Dave Jones wrote: > AFAICT, this has been broken since the code to sanitise scsi commands > was added circa 2.6.8 or so. > > It seems cdrecord tries to send some vendor specific commands to Plextor > drives, and fails miserably as can be seen here.. > https://bugzilla.redhat.com/bugzilla/attachment.cgi?id=124267 > > I'm not that familiar with this code, but would adding exceptions > on a per-vendor basis in sg_allow_access() be the way forward here? > > If not, what is the right answer ? I'd greatly prefer just ripping the entire command access table out, it was a mistake to begin with and still just a horrible solution. In fact, I think we should decide soon what to do about it. At the storage summit, there was general consensus on just killing it as well. -- Jens Axboe ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 11:12 ` Jens Axboe @ 2006-07-29 13:40 ` James Bottomley 2006-07-29 15:39 ` Christer Weinigel 2006-07-29 17:06 ` Linus Torvalds 2006-07-29 17:04 ` Linus Torvalds 1 sibling, 2 replies; 35+ messages in thread From: James Bottomley @ 2006-07-29 13:40 UTC (permalink / raw) To: Jens Axboe; +Cc: Dave Jones, linux-scsi, torvalds On Sat, 2006-07-29 at 13:12 +0200, Jens Axboe wrote: > > I'm not that familiar with this code, but would adding exceptions > > on a per-vendor basis in sg_allow_access() be the way forward here? > > > > If not, what is the right answer ? > > I'd greatly prefer just ripping the entire command access table out, it > was a mistake to begin with and still just a horrible solution. > > In fact, I think we should decide soon what to do about it. At the > storage summit, there was general consensus on just killing it as well. I concur. If we're going to allow users access to burn CDs, it's impossible to police them with certainty as this case indicates. If we allow vendor specific commands down, there are bound to be some that format the drive or destroy the firmware ... So I think ripping the table out and acknowledging we have no security is better than giving the illusion of having it. James ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 13:40 ` James Bottomley @ 2006-07-29 15:39 ` Christer Weinigel 2006-07-29 17:06 ` Linus Torvalds 1 sibling, 0 replies; 35+ messages in thread From: Christer Weinigel @ 2006-07-29 15:39 UTC (permalink / raw) To: James Bottomley; +Cc: Jens Axboe, Dave Jones, linux-scsi, torvalds James Bottomley <James.Bottomley@SteelEye.com> writes: > On Sat, 2006-07-29 at 13:12 +0200, Jens Axboe wrote: > > > I'm not that familiar with this code, but would adding exceptions > > > on a per-vendor basis in sg_allow_access() be the way forward here? > > > > > > If not, what is the right answer ? > > > > I'd greatly prefer just ripping the entire command access table out, it > > was a mistake to begin with and still just a horrible solution. > > > > In fact, I think we should decide soon what to do about it. At the > > storage summit, there was general consensus on just killing it as well. > > I concur. If we're going to allow users access to burn CDs, it's > impossible to police them with certainty as this case indicates. If we > allow vendor specific commands down, there are bound to be some that > format the drive or destroy the firmware ... > > So I think ripping the table out and acknowledging we have no security > is better than giving the illusion of having it. How about making cmd_type a per device variable and adding an ioctl to set cmd_type? Let cmd_type default to letting everything through. That way a distribution can add filters if it wants to. /Christer -- "Just how much can I get away with and still go to heaven?" Freelance consultant specializing in device driver programming for Linux Christer Weinigel <christer@weinigel.se> http://www.weinigel.se ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 13:40 ` James Bottomley 2006-07-29 15:39 ` Christer Weinigel @ 2006-07-29 17:06 ` Linus Torvalds 2006-07-29 17:30 ` James Bottomley 2006-07-29 18:39 ` Douglas Gilbert 1 sibling, 2 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 17:06 UTC (permalink / raw) To: James Bottomley; +Cc: Jens Axboe, Dave Jones, linux-scsi On Sat, 29 Jul 2006, James Bottomley wrote: > > I concur. If we're going to allow users access to burn CDs, it's > impossible to police them with certainty as this case indicates. Not so. I can (and have) written tons of CD's as a normal user, with perfect security. No, the kernel shouldn't allow device-specific commands. That goes without saying. Whether this is a sg.c problem, or a cdrecord problem is unclear, I suspect it's the latter. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:06 ` Linus Torvalds @ 2006-07-29 17:30 ` James Bottomley 2006-07-29 17:49 ` Linus Torvalds 2006-07-29 18:39 ` Douglas Gilbert 1 sibling, 1 reply; 35+ messages in thread From: James Bottomley @ 2006-07-29 17:30 UTC (permalink / raw) To: Linus Torvalds; +Cc: Jens Axboe, Dave Jones, linux-scsi On Sat, 2006-07-29 at 10:06 -0700, Linus Torvalds wrote: > Not so. I can (and have) written tons of CD's as a normal user, with > perfect security. But not for every CD burner ... that's the point. The heuristics we have now work for a large subset. For the rest, we get a stream of "my CD won't burn as a user like it's supposed to" bug reports. In the old days, the gnome/kde stuff simply gave the user ownership of the cd device and we allowed any command through and so all CDs worked, if not very safely. Suddenly with the new "are you root, if not I consult my allowed tables" method we get this list of CDs that can't burn as a user. > No, the kernel shouldn't allow device-specific commands. That goes without > saying. Whether this is a sg.c problem, or a cdrecord problem is > unclear, > I suspect it's the latter. There are certain CDs that just require vendor specific magic to work ... even cdrecord has no choice but to do this. In general, this allowed command list is solidifying policy in the kernel, which is the problem. If we merely put the ability to enforce policy in the kernel (without actually having any by default and allow the distros to set it via sysfs as we do now for the SCSI blacklist) then we'll go back to the old days (of every CD just works) and if there's a problem it will be a distro issue because they got their policy wrong (they're the ones who can scan a computer, see a plextor on /dev/sdc and allow certain vendor specific commands to /dev/sdc only) James ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:30 ` James Bottomley @ 2006-07-29 17:49 ` Linus Torvalds 2006-07-30 16:02 ` Christer Weinigel 0 siblings, 1 reply; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 17:49 UTC (permalink / raw) To: James Bottomley; +Cc: Jens Axboe, Dave Jones, linux-scsi On Sat, 29 Jul 2006, James Bottomley wrote: > > But not for every CD burner ... that's the point. The heuristics we > have now work for a large subset. For the rest, we get a stream of "my > CD won't burn as a user like it's supposed to" bug reports. That's not _our_ problem. That's likely the problem of "cdrecord" _thinking_ that it needs to do something smart, when it really really doesn't need to. I have yet to hear anything that implies anything else than "cdrecord is just buggy". > There are certain CDs that just require vendor specific magic to > work ... even cdrecord has no choice but to do this. IF that is actually true (and if you were told this by Joerg, I would double- and triple-check it from some other source), then in the end you do end up having to have a per-device translation table, and it probably shouldn't be in the kernel. It probably _should_ be in a suid-root thing that validates the commands. People used to make cdrecord suid, but that thing really isn't written to be done that way. That doesn't mean that something else couldn't be done properly. There's no way the kernel should do this. In a hotplug environment in particular (which is not _that_ common with CD-ROM's but certainly not unheard of), you don't want to have the kernel know about every quirk of every device anyway. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:49 ` Linus Torvalds @ 2006-07-30 16:02 ` Christer Weinigel 2006-07-30 19:57 ` Linus Torvalds 0 siblings, 1 reply; 35+ messages in thread From: Christer Weinigel @ 2006-07-30 16:02 UTC (permalink / raw) To: Linus Torvalds; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi Linus Torvalds <torvalds@osdl.org> writes: > On Sat, 29 Jul 2006, James Bottomley wrote: > > There are certain CDs that just require vendor specific magic to > > work ... even cdrecord has no choice but to do this. > > IF that is actually true (and if you were told this by Joerg, I would > double- and triple-check it from some other source), then in the end you > do end up having to have a per-device translation table, and it probably > shouldn't be in the kernel. Joerg is correct about this. I just went through the cdrecord sources (from Fedora Core 5 with a DVD patch) and took a quick look at what commands and mode pages were used by the different files. I've probably missed a few things, but this ought to give you and idea about what is needed to burn a CD: drv_philips.c -- Philips/Yamaha/Ricoh/Plasmon Commands: 0xE2 -- Philips First Writeable Address 0xE4 -- Philips Reserve Track 0xE6 -- Philips Write Track 0xE7 -- Philips Medium Load/Unload 0xE9 -- Philips Fixation 0xEC -- Philips Recover? 0xEE -- Philips Read Session Info Mode pages: 0x21 -- Philips Write Track Info? 0x23 -- Philips speed select 0x31 -- Yamaha speed select scsi_mmc.c - MMC-3 Commands: 0x46 -- MMC Get Configuration drv_7501.c -- Masushita CW-7501 Commands: 0x01 - Rezero Unit 0xE2 -- Set Mode? 0xE3 -- Fixate/Finalize 0xE6 -- Write DAO 0xE7 -- Reserve Track 0xE9 -- Read Trackinfo Mode pages: 0x20 -- Speed control 0x21 -- MCN? 0x22 -- ISRC 0x23 -- Dummy / Write information 0x24 -- CD-R Disk Information scsi_cdr.c -- pre-MMC standard functions up to MMC-2 Commands: 0x00 -- Test Unit Ready 0x01 -- Rezero Unit 0x03 -- Request Sense 0x04 -- Format Unit 0x08 -- Read 6 0x0B -- Seek 6 0x0D -- Qic02 Sysgen SC4000? 0x0a -- Write 6 0x12 -- Inquiry 0x15 -- Mode Select 10 0x1B -- Start/Stop Unit 0x1E -- Prevent/Allow Medium Removal 0x1a -- Mode Sense 10 0x25 -- Read Capacity 0x28 -- Read 10 0x2B -- Seek 10 0x2a -- Write 10 0x35 -- Flush Cache 0x3B -- Write Buffer 0x3C -- Read Buffer 0x42 -- Read Subchannel 0x43 -- Read TOC 0x44 -- Read Header 0x51 -- Read Disk Info 0x52 -- Read Track Info 0x53 -- Reserve Track 0x54 -- Send OPC 0x55 -- Mode Select 10 0x59 -- Read Master Cue Sheet 0x5A -- Mode Sense 10 0x5B -- Close Track/Session 0x5C -- Read Buffer Cap(acity?) 0x5D -- Send Cue Sheet 0xA1 -- Blank Unit 0xA6 -- Medium Load/Unload 0xAA -- Write XG5? 0xAD -- Read DVD Structure 0xB6 -- Set Streaming? 0xBB -- Set CD Speed 0xBF -- Send DVD Structure 0xE5 -- Read Track Info Philips Except for 0x0D and the last bunch these commands are probably pretty generic for all CDROM drives. drv_jvc.c -- JVR/TEAC Commands: 0x2A -- Write 10 0xB3 -- Set Limits 0xC4 -- Read PMA 0xC7 -- Read Disk Info 0xE0 -- Buffer Inquiry 0xE1 -- Write PMA 0xE3 -- Freeze 0xE4 -- Clear Subcode 0xE6 -- Next Write Address 0xEC -- Optimize Power 0xEF -- Read Peak Buffer Capacity Commands 0xC1, 0xC3, 0xC6, 0xCE, 0xCF and 0xDF are also in the code but are never used. Mode Pages: 0x00 -- Select Sector Size 0x21 -- Dummy Selection 0x31 -- Speed Selection drv_mmc.c -- SCSI-3/mmc conforming drives Commands: 0x3B -- Yamaha Write Buffer With Parameter 0xBB -- Yamaha Force Speed 0xE9 -- Plextor Drive Mode 0xEB -- Plextor Get Speed List 0xED -- Plextor Drive Mode 2 0xF5 -- Plextor Read BPC Mode Pages: 0x05 -- CD/DVD Write Parameters, Speed Select 0x2A -- MMC mode page 0x30 -- Ricoh Mode Page (burn-free and read speed control) 0x31 -- Yamaha Tattoo Page drv_sony.c -- Sony Commands: 0xE0 -- Write Start 0xE1 -- Write Continue 0xE2 -- Discontinue 0xEC -- Read Buffer Capacity 0xF0 -- Close Track 0xF1 -- Finalize 0xF2 -- Flush 0xF3 -- Reserve Track 0xF5 -- Write Track 0xF6 -- Recover 0xF8 -- Set Write Parameter Mode Pages: 0x20 -- Mastering Information 0x22 -- Disk Information 0x23 -- Track Information 0x31 -- Drive Speed /Christer -- "Just how much can I get away with and still go to heaven?" Freelance consultant specializing in device driver programming for Linux Christer Weinigel <christer@weinigel.se> http://www.weinigel.se ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 16:02 ` Christer Weinigel @ 2006-07-30 19:57 ` Linus Torvalds 2006-07-30 20:18 ` Christian Iversen 2006-07-31 0:12 ` Christer Weinigel 0 siblings, 2 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-30 19:57 UTC (permalink / raw) To: Christer Weinigel; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sun, 30 Jul 2006, Christer Weinigel wrote: > > Joerg is correct about this. I just went through the cdrecord sources > (from Fedora Core 5 with a DVD patch) and took a quick look at what > commands and mode pages were used by the different files. I've > probably missed a few things, but this ought to give you and idea > about what is needed to burn a CD: Umm. I suspect you are either looking at the really old drives (like over a decade ago), when there were indeed lots of CD-burners that had very specific commands because the standard was new or nonexistent. Or you're looking at some extended commands that cdrecord _knows_ about and can use, but that aren't necessarily standard or supported on all CD-ROM drives. I really _would_ be pretty surprised if you can't do standard CD-ROM (and DVD) burning with the standard MMC commands with just about _any_ drive that is more recent than ten years old. One reason? I don't think Windows supports those out of the box either. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 19:57 ` Linus Torvalds @ 2006-07-30 20:18 ` Christian Iversen 2006-07-31 0:12 ` Christer Weinigel 1 sibling, 0 replies; 35+ messages in thread From: Christian Iversen @ 2006-07-30 20:18 UTC (permalink / raw) To: Linus Torvalds Cc: Christer Weinigel, James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sunday 30 July 2006 21:57, Linus Torvalds wrote: > On Sun, 30 Jul 2006, Christer Weinigel wrote: > > Joerg is correct about this. I just went through the cdrecord sources > > (from Fedora Core 5 with a DVD patch) and took a quick look at what > > commands and mode pages were used by the different files. I've > > probably missed a few things, but this ought to give you and idea > > about what is needed to burn a CD: > > Umm. I suspect you are either looking at the really old drives (like over > a decade ago), when there were indeed lots of CD-burners that had very > specific commands because the standard was new or nonexistent. > > Or you're looking at some extended commands that cdrecord _knows_ about > and can use, but that aren't necessarily standard or supported on all > CD-ROM drives. > > I really _would_ be pretty surprised if you can't do standard CD-ROM (and > DVD) burning with the standard MMC commands with just about _any_ drive > that is more recent than ten years old. That was my impression as well - perhaps this could be solved by making the MMC-commands valid for any CD-writer device, and making LightScribe, BurnProff, etc available only to root? or, by a special vendor->permission table like suggested previously? That would change the bug reports to simply "my drive can't do BurnProof unless I'm root", instead of "my drive can't burn unless I'm root". That's clearly more manageable, right? -- Regards, Christian Iversen ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 19:57 ` Linus Torvalds 2006-07-30 20:18 ` Christian Iversen @ 2006-07-31 0:12 ` Christer Weinigel 2006-07-31 20:32 ` Linus Torvalds 1 sibling, 1 reply; 35+ messages in thread From: Christer Weinigel @ 2006-07-31 0:12 UTC (permalink / raw) To: Linus Torvalds Cc: Christer Weinigel, James Bottomley, Jens Axboe, Dave Jones, linux-scsi Linus Torvalds <torvalds@osdl.org> writes: > On Sun, 30 Jul 2006, Christer Weinigel wrote: > > > > Joerg is correct about this. I just went through the cdrecord sources > > (from Fedora Core 5 with a DVD patch) and took a quick look at what > > commands and mode pages were used by the different files. I've > > probably missed a few things, but this ought to give you and idea > > about what is needed to burn a CD: > > Umm. I suspect you are either looking at the really old drives (like over > a decade ago), when there were indeed lots of CD-burners that had very > specific commands because the standard was new or nonexistent. > > Or you're looking at some extended commands that cdrecord _knows_ about > and can use, but that aren't necessarily standard or supported on all > CD-ROM drives. Yes, a lot of those CD burners are ancient. But I like the fact that Linux supports a lot of ancient hardware. :-) IMHO, those extenend commands shoule be available to unprivileged userspace, because setting the burn speed is a rather basic operation. A lot of people who do backups to CDROM burn CDs at 4x even if the burner supports 24x, because CDs burned at lower speeds are often more realiable than CDs burned at the higher speeds. Still, cdrecord could warn and say "I couldn't set the drive speed, but do you want me to continue anyway" instead of failing unconditionally. What I think we ought to to is to follow Christian Iversen's suggestion and default to allowing the MMC command set for CD-players. Then add some kind of syscall/sysctl to modify the list of allowed commands such as the patch Peter Jones posted. Did you look at it? http://www.uwsg.iu.edu/hypermail/linux/kernel/0409.1/2109.html I've forward ported and compile tested Peter Jones' patch to 2.6.17.7, if you want to try it out. No guarantees that it works though. I also think that the filer has to be extended to filter MODE_SELECT /MODE_SELECT_10 too, since the burn-proof/speed settings usually are selected via vendor mode pages (although not on the Plextors which started this thread) but there are some other mode pages that should definitely not be user accessible. If you think Peter Jones' patch is acceptable in principle, it could be extended to support mode pages too. Another extension may be to add a bitmap for "used commands/mode pages" that records what commands have been used by an application. That way a distribution maker could have a simple script that enables all commands, runs the offending program, and then looks at the commands used and creates a rc-script that enables those commands (and preferably also gives the user the option to mail the program name, list of commands and /proc/ide/hdc/identify to the distribution maker). /Christer No signed-off-by line because this is Peter Jones work originally, I've just done a trivial forward port. Index: linux-2.6.17.7/block/Makefile =================================================================== --- linux-2.6.17.7.orig/block/Makefile +++ linux-2.6.17.7/block/Makefile @@ -2,7 +2,7 @@ # Makefile for the kernel block layer # -obj-y := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o +obj-y := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o rcf.o obj-$(CONFIG_IOSCHED_NOOP) += noop-iosched.o obj-$(CONFIG_IOSCHED_AS) += as-iosched.o Index: linux-2.6.17.7/block/genhd.c =================================================================== --- linux-2.6.17.7.orig/block/genhd.c +++ linux-2.6.17.7/block/genhd.c @@ -187,6 +187,7 @@ void add_disk(struct gendisk *disk) disk->minors, NULL, exact_match, exact_lock, disk); register_disk(disk); blk_register_queue(disk); + blk_register_filter(disk); } EXPORT_SYMBOL(add_disk); @@ -194,6 +195,7 @@ EXPORT_SYMBOL(del_gendisk); /* in partit void unlink_gendisk(struct gendisk *disk) { + blk_unregister_filter(disk); blk_unregister_queue(disk); blk_unregister_region(MKDEV(disk->major, disk->first_minor), disk->minors); @@ -389,6 +391,12 @@ static ssize_t disk_stats_read(struct ge jiffies_to_msecs(disk_stat_read(disk, io_ticks)), jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); } + +static ssize_t disk_driver_read(struct gendisk * disk, char *page) +{ + return sprintf(page, "%s\n", disk->disk_name); +} + static struct disk_attribute disk_attr_uevent = { .attr = {.name = "uevent", .mode = S_IWUSR }, .store = disk_uevent_store @@ -413,6 +421,10 @@ static struct disk_attribute disk_attr_s .attr = {.name = "stat", .mode = S_IRUGO }, .show = disk_stats_read }; +static struct disk_attribute disk_attr_driver = { + .attr = {.name = "driver", .mode = S_IRUGO }, + .show = disk_driver_read +}; static struct attribute * default_attrs[] = { &disk_attr_uevent.attr, @@ -421,6 +433,7 @@ static struct attribute * default_attrs[ &disk_attr_removable.attr, &disk_attr_size.attr, &disk_attr_stat.attr, + &disk_attr_driver.attr, NULL, }; Index: linux-2.6.17.7/block/rcf.c =================================================================== --- /dev/null +++ linux-2.6.17.7/block/rcf.c @@ -0,0 +1,322 @@ +/* + * Copyright 2004 Peter M. Jones <pjones@redhat.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Licens + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- + * + */ + +#include <linux/list.h> +#include <linux/genhd.h> +#include <linux/spinlock.h> +#include <linux/parser.h> +#include <asm/bitops.h> + +#include <scsi/scsi.h> +#include <linux/cdrom.h> + +int rcf_verify_command(struct file *file, unsigned char *cmd) +{ + struct rawio_cmd_filter *rcf; + struct inode *inode; + + inode = file->f_dentry->d_inode; + if (!inode) + return -EINVAL; + + rcf = &inode->i_bdev->bd_disk->filter; + + /* root can do any command. */ + if (capable(CAP_SYS_RAWIO)) + return 0; + + /* if there's no filter allocated, bail out. */ + if (unlikely(!rcf)) + return -EPERM; + + /* Anybody who can open the device can do a read-safe command */ + if (test_bit(cmd[0], rcf->read_ok)) + return 0; + + /* Write-safe commands require a writable open */ + if (test_bit(cmd[0], rcf->write_ok)) + if (file->f_mode & FMODE_WRITE) + return 0; + + /* Or else the user has no perms */ + return -EPERM; +} + +EXPORT_SYMBOL(rcf_verify_command); + +/* and now, the sysfs stuff */ +static ssize_t rcf_readcmds_show(struct rawio_cmd_filter *rcf, char *page) +{ + char *npage = page; + int x; + + for (x=0; x < RCF_MAX_NR_CMDS; x++) + if (test_bit(x, rcf->read_ok)) { + sprintf(npage, "%02x", x); + npage += 2; + if (x < RCF_MAX_NR_CMDS-1) + sprintf(npage++, " "); + } + if (npage != page) + npage += sprintf(npage, "\n"); + + return (npage - page); +} + +static ssize_t rcf_writecmds_show(struct rawio_cmd_filter *rcf, char *page) +{ + char *npage = page; + int x; + + for (x=0; x < RCF_MAX_NR_CMDS; x++) + if (test_bit(x, rcf->write_ok)) { + sprintf(npage, "%02x", x); + npage += 2; + if (x < RCF_MAX_NR_CMDS-1) + sprintf(npage++, " "); + } + if (npage != page) + npage += sprintf(npage, "\n"); + + return (npage - page); +} + +#define RCF_ADD 0 +#define RCF_DEL 1 + +static ssize_t rcf_store(struct rawio_cmd_filter *rcf, const char *page, + size_t count) +{ + ssize_t ret=0; + int ad,rw; + int cmd, status; + + substring_t ss; + + if (!strncmp(page+ret, "add", 3)) { + ret += 3; + ad = RCF_ADD; + } else if (!strncmp(page+ret, "del", 3)) { + ret += 3; + ad = RCF_DEL; + } else + return -EINVAL; + if (page[ret++] == 0) + return -EINVAL; + + if (!strncmp(page+ret, "read", 4)) { + ret += 4; + rw = READ; + } else if (!strncmp(page+ret, "write", 5)) { + ret += 5; + rw = WRITE; + } else + return -EINVAL; + if (page[ret++] == 0) + return -EINVAL; + + ss.from = (char *)page+ret; + ss.to = ss.from + count - ret; + ret += count - ret; + + status = match_hex(&ss, &cmd); + if (status) + return status; + if (cmd > 256) + return -EINVAL; + + if (ad == RCF_ADD) { + if (rw == READ) + set_bit(cmd, rcf->read_ok); + else + set_bit(cmd, rcf->write_ok); + } else { + if (rw == READ) + clear_bit(cmd, rcf->read_ok); + else + clear_bit(cmd, rcf->write_ok); + } + + return count; +} + +struct rcf_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct rawio_cmd_filter *, char *); + ssize_t (*store)(struct rawio_cmd_filter *, const char *, size_t); +}; + +static struct rcf_sysfs_entry rcf_readcmds_entry = { + .attr = {.name = "ok_read_commands", .mode = S_IRUGO | S_IWUSR }, + .show = rcf_readcmds_show, + .store = rcf_store, +}; + +static struct rcf_sysfs_entry rcf_writecmds_entry = { + .attr = {.name = "ok_write_commands", .mode = S_IRUGO | S_IWUSR }, + .show = rcf_writecmds_show, + .store = rcf_store, +}; + +static struct attribute *default_attrs[] = { + &rcf_readcmds_entry.attr, + &rcf_writecmds_entry.attr, + NULL, +}; + +#define to_rcf(atr) container_of((atr), struct rcf_sysfs_entry, attr) + +static ssize_t +rcf_attr_show(struct kobject *kobj, struct attribute *attr, char *page) +{ + struct rcf_sysfs_entry *entry = to_rcf(attr); + struct rawio_cmd_filter *rcf; + + rcf = container_of(kobj, struct rawio_cmd_filter, kobj); + if (!entry->show) + return 0; + + return entry->show(rcf, page); +} + +static ssize_t +rcf_attr_store(struct kobject *kobj, struct attribute *attr, + const char *page, size_t length) +{ + struct rcf_sysfs_entry *entry = to_rcf(attr); + struct rawio_cmd_filter *rcf; + + rcf = container_of(kobj, struct rawio_cmd_filter, kobj); + if (!entry->store) + return -EINVAL; + + return entry->store(rcf, page, length); +} + +static struct sysfs_ops rcf_sysfs_ops = { + .show = rcf_attr_show, + .store = rcf_attr_store, +}; + +static struct kobj_type rcf_ktype = { + .sysfs_ops = &rcf_sysfs_ops, + .default_attrs = default_attrs, +}; + +static void rcf_set_defaults(struct rawio_cmd_filter *rcf) +{ + /* Basic read-only commands */ + set_bit(TEST_UNIT_READY, rcf->read_ok); + set_bit(REQUEST_SENSE, rcf->read_ok); + set_bit(READ_6, rcf->read_ok); + set_bit(READ_10, rcf->read_ok); + set_bit(READ_12, rcf->read_ok); + set_bit(READ_16, rcf->read_ok); + set_bit(READ_BUFFER, rcf->read_ok); + set_bit(READ_LONG, rcf->read_ok); + set_bit(INQUIRY, rcf->read_ok); + set_bit(MODE_SENSE, rcf->read_ok); + set_bit(MODE_SENSE_10, rcf->read_ok); + set_bit(START_STOP, rcf->read_ok); + set_bit(GPCMD_VERIFY_10, rcf->read_ok); + set_bit(VERIFY_16, rcf->read_ok); + set_bit(READ_BUFFER, rcf->read_ok); + + /* Audio CD commands */ + set_bit(GPCMD_PLAY_CD, rcf->read_ok); + set_bit(GPCMD_PLAY_AUDIO_10, rcf->read_ok); + set_bit(GPCMD_PLAY_AUDIO_MSF, rcf->read_ok); + set_bit(GPCMD_PLAY_AUDIO_TI, rcf->read_ok); + set_bit(GPCMD_PAUSE_RESUME, rcf->read_ok); + + /* CD/DVD data reading */ + set_bit(GPCMD_READ_CD, rcf->read_ok); + set_bit(GPCMD_READ_CD_MSF, rcf->read_ok); + set_bit(GPCMD_READ_DISC_INFO, rcf->read_ok); + set_bit(GPCMD_READ_CDVD_CAPACITY, rcf->read_ok); + set_bit(GPCMD_READ_DVD_STRUCTURE, rcf->read_ok); + set_bit(GPCMD_READ_HEADER, rcf->read_ok); + set_bit(GPCMD_READ_TRACK_RZONE_INFO, rcf->read_ok); + set_bit(GPCMD_READ_SUBCHANNEL, rcf->read_ok); + set_bit(GPCMD_READ_TOC_PMA_ATIP, rcf->read_ok); + set_bit(GPCMD_REPORT_KEY, rcf->read_ok); + set_bit(GPCMD_SCAN, rcf->read_ok); + set_bit(GPCMD_GET_CONFIGURATION, rcf->read_ok); + set_bit(GPCMD_READ_FORMAT_CAPACITIES, rcf->read_ok); + set_bit(GPCMD_GET_EVENT_STATUS_NOTIFICATION, rcf->read_ok); + set_bit(GPCMD_GET_PERFORMANCE, rcf->read_ok); + set_bit(GPCMD_SEEK, rcf->read_ok); + set_bit(GPCMD_STOP_PLAY_SCAN, rcf->read_ok); + + /* Basic writing commands */ + set_bit(WRITE_6, rcf->write_ok); + set_bit(WRITE_10, rcf->write_ok); + set_bit(WRITE_VERIFY, rcf->write_ok); + set_bit(WRITE_12, rcf->write_ok); + set_bit(WRITE_VERIFY_12, rcf->write_ok); + set_bit(WRITE_16, rcf->write_ok); + set_bit(WRITE_LONG, rcf->write_ok); + set_bit(ERASE, rcf->write_ok); + set_bit(GPCMD_MODE_SELECT_10, rcf->write_ok); + set_bit(MODE_SELECT, rcf->write_ok); + set_bit(GPCMD_BLANK, rcf->write_ok); + set_bit(GPCMD_CLOSE_TRACK, rcf->write_ok); + set_bit(GPCMD_FLUSH_CACHE, rcf->write_ok); + set_bit(GPCMD_FORMAT_UNIT, rcf->write_ok); + set_bit(GPCMD_REPAIR_RZONE_TRACK, rcf->write_ok); + set_bit(GPCMD_RESERVE_RZONE_TRACK, rcf->write_ok); + set_bit(GPCMD_SEND_DVD_STRUCTURE, rcf->write_ok); + set_bit(GPCMD_SEND_EVENT, rcf->write_ok); + set_bit(GPCMD_SEND_KEY, rcf->write_ok); + set_bit(GPCMD_SEND_OPC, rcf->write_ok); + set_bit(GPCMD_SEND_CUE_SHEET, rcf->write_ok); + set_bit(GPCMD_SET_SPEED, rcf->write_ok); + set_bit(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, rcf->write_ok); + set_bit(GPCMD_LOAD_UNLOAD, rcf->write_ok); + set_bit(GPCMD_SET_STREAMING, rcf->write_ok); +} + +int blk_register_filter(struct gendisk *disk) +{ + int ret; + struct rawio_cmd_filter *rcf = &disk->filter; + + rcf->kobj.parent = kobject_get(&disk->kobj); + if (!rcf->kobj.parent) + return -EBUSY; + + snprintf(rcf->kobj.name, KOBJ_NAME_LEN, "%s", "filter"); + rcf->kobj.ktype = &rcf_ktype; + + ret = kobject_register(&rcf->kobj); + if (ret < 0) + return ret; + + rcf_set_defaults(&disk->filter); + + return 0; +} + +void blk_unregister_filter(struct gendisk *disk) +{ + struct rawio_cmd_filter *rcf = &disk->filter; + + kobject_unregister(&rcf->kobj); + kobject_put(&disk->kobj); +} Index: linux-2.6.17.7/block/scsi_ioctl.c =================================================================== --- linux-2.6.17.7.orig/block/scsi_ioctl.c +++ linux-2.6.17.7/block/scsi_ioctl.c @@ -106,120 +106,6 @@ static int sg_emulated_host(request_queu return put_user(1, p); } -#define CMD_READ_SAFE 0x01 -#define CMD_WRITE_SAFE 0x02 -#define CMD_WARNED 0x04 -#define safe_for_read(cmd) [cmd] = CMD_READ_SAFE -#define safe_for_write(cmd) [cmd] = CMD_WRITE_SAFE - -static int verify_command(struct file *file, unsigned char *cmd) -{ - static unsigned char cmd_type[256] = { - - /* Basic read-only commands */ - safe_for_read(TEST_UNIT_READY), - safe_for_read(REQUEST_SENSE), - safe_for_read(READ_6), - safe_for_read(READ_10), - safe_for_read(READ_12), - safe_for_read(READ_16), - safe_for_read(READ_BUFFER), - safe_for_read(READ_DEFECT_DATA), - safe_for_read(READ_LONG), - safe_for_read(INQUIRY), - safe_for_read(MODE_SENSE), - safe_for_read(MODE_SENSE_10), - safe_for_read(LOG_SENSE), - safe_for_read(START_STOP), - safe_for_read(GPCMD_VERIFY_10), - safe_for_read(VERIFY_16), - - /* Audio CD commands */ - safe_for_read(GPCMD_PLAY_CD), - safe_for_read(GPCMD_PLAY_AUDIO_10), - safe_for_read(GPCMD_PLAY_AUDIO_MSF), - safe_for_read(GPCMD_PLAY_AUDIO_TI), - safe_for_read(GPCMD_PAUSE_RESUME), - - /* CD/DVD data reading */ - safe_for_read(GPCMD_READ_BUFFER_CAPACITY), - safe_for_read(GPCMD_READ_CD), - safe_for_read(GPCMD_READ_CD_MSF), - safe_for_read(GPCMD_READ_DISC_INFO), - safe_for_read(GPCMD_READ_CDVD_CAPACITY), - safe_for_read(GPCMD_READ_DVD_STRUCTURE), - safe_for_read(GPCMD_READ_HEADER), - safe_for_read(GPCMD_READ_TRACK_RZONE_INFO), - safe_for_read(GPCMD_READ_SUBCHANNEL), - safe_for_read(GPCMD_READ_TOC_PMA_ATIP), - safe_for_read(GPCMD_REPORT_KEY), - safe_for_read(GPCMD_SCAN), - safe_for_read(GPCMD_GET_CONFIGURATION), - safe_for_read(GPCMD_READ_FORMAT_CAPACITIES), - safe_for_read(GPCMD_GET_EVENT_STATUS_NOTIFICATION), - safe_for_read(GPCMD_GET_PERFORMANCE), - safe_for_read(GPCMD_SEEK), - safe_for_read(GPCMD_STOP_PLAY_SCAN), - - /* Basic writing commands */ - safe_for_write(WRITE_6), - safe_for_write(WRITE_10), - safe_for_write(WRITE_VERIFY), - safe_for_write(WRITE_12), - safe_for_write(WRITE_VERIFY_12), - safe_for_write(WRITE_16), - safe_for_write(WRITE_LONG), - safe_for_write(WRITE_LONG_2), - safe_for_write(ERASE), - safe_for_write(GPCMD_MODE_SELECT_10), - safe_for_write(MODE_SELECT), - safe_for_write(LOG_SELECT), - safe_for_write(GPCMD_BLANK), - safe_for_write(GPCMD_CLOSE_TRACK), - safe_for_write(GPCMD_FLUSH_CACHE), - safe_for_write(GPCMD_FORMAT_UNIT), - safe_for_write(GPCMD_REPAIR_RZONE_TRACK), - safe_for_write(GPCMD_RESERVE_RZONE_TRACK), - safe_for_write(GPCMD_SEND_DVD_STRUCTURE), - safe_for_write(GPCMD_SEND_EVENT), - safe_for_write(GPCMD_SEND_KEY), - safe_for_write(GPCMD_SEND_OPC), - safe_for_write(GPCMD_SEND_CUE_SHEET), - safe_for_write(GPCMD_SET_SPEED), - safe_for_write(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL), - safe_for_write(GPCMD_LOAD_UNLOAD), - safe_for_write(GPCMD_SET_STREAMING), - }; - unsigned char type = cmd_type[cmd[0]]; - int has_write_perm = 0; - - /* Anybody who can open the device can do a read-safe command */ - if (type & CMD_READ_SAFE) - return 0; - - /* - * file can be NULL from ioctl_by_bdev()... - */ - if (file) - has_write_perm = file->f_mode & FMODE_WRITE; - - /* Write-safe commands just require a writable open.. */ - if ((type & CMD_WRITE_SAFE) && has_write_perm) - return 0; - - /* And root can do any command.. */ - if (capable(CAP_SYS_RAWIO)) - return 0; - - if (!type) { - cmd_type[cmd[0]] = CMD_WARNED; - printk(KERN_WARNING "scsi: unknown opcode 0x%02x\n", cmd[0]); - } - - /* Otherwise fail it with an "Operation not permitted" */ - return -EPERM; -} - static int sg_io(struct file *file, request_queue_t *q, struct gendisk *bd_disk, struct sg_io_hdr *hdr) { @@ -236,7 +122,7 @@ static int sg_io(struct file *file, requ return -EINVAL; if (copy_from_user(cmd, hdr->cmdp, hdr->cmd_len)) return -EFAULT; - if (verify_command(file, cmd)) + if (rcf_verify_command(file, cmd)) return -EPERM; if (hdr->dxfer_len > (q->max_hw_sectors << 9)) @@ -431,7 +317,7 @@ int sg_scsi_ioctl(struct file *file, str if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) goto error; - err = verify_command(file, rq->cmd); + err = rcf_verify_command(file, rq->cmd); if (err) goto error; Index: linux-2.6.17.7/include/linux/blkdev.h =================================================================== --- linux-2.6.17.7.orig/include/linux/blkdev.h +++ linux-2.6.17.7/include/linux/blkdev.h @@ -599,6 +599,9 @@ struct sec_size { unsigned block_size_bits; }; +extern int blk_register_filter(struct gendisk *disk); +extern void blk_unregister_filter(struct gendisk *disk); +extern int rcf_verify_command(struct file *file, unsigned char *cmd); extern int blk_register_queue(struct gendisk *disk); extern void blk_unregister_queue(struct gendisk *disk); extern void register_disk(struct gendisk *dev); Index: linux-2.6.17.7/include/linux/genhd.h =================================================================== --- linux-2.6.17.7.orig/include/linux/genhd.h +++ linux-2.6.17.7/include/linux/genhd.h @@ -97,6 +97,15 @@ struct disk_stats { unsigned long io_ticks; unsigned long time_in_queue; }; + +#define RCF_MAX_NR_CMDS 256 +#define RCF_CMD_BYTES (RCF_MAX_NR_CMDS / (sizeof (unsigned long) * 8)) + +struct rawio_cmd_filter { + unsigned long read_ok[RCF_CMD_BYTES]; + unsigned long write_ok[RCF_CMD_BYTES]; + struct kobject kobj; +}; struct gendisk { int major; /* major number of driver */ @@ -108,6 +117,7 @@ struct gendisk { int part_uevent_suppress; struct block_device_operations *fops; struct request_queue *queue; + struct rawio_cmd_filter filter; void *private_data; sector_t capacity; -- "Just how much can I get away with and still go to heaven?" Freelance consultant specializing in device driver programming for Linux Christer Weinigel <christer@weinigel.se> http://www.weinigel.se ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-31 0:12 ` Christer Weinigel @ 2006-07-31 20:32 ` Linus Torvalds 2006-07-31 20:38 ` Dave Jones 2006-07-31 20:41 ` Jens Axboe 0 siblings, 2 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-31 20:32 UTC (permalink / raw) To: Christer Weinigel; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sun, 31 Jul 2006, Christer Weinigel wrote: > > Yes, a lot of those CD burners are ancient. But I like the fact that > Linux supports a lot of ancient hardware. :-) Sure. But I don't think we should necessarily design any new code for it. It's not like this has _ever_ worked differently from what it does now, so if you have one of the pre-MMC drives, the right answer right now (and always has been, I think) is that you need to be root to burn them. I seriously doubt anybody _really_ cares. That said, I don't think Peter Jones' patch is wrong. I don't have any strong feelings about it - if people actually want this adn feels it improves the situation, why not? Although to actually make _sense_, we'd want to have distros that actually want to use the interface to auto-populate the command things or something.. In the absense of interest from distros, I don't think it is worth it. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-31 20:32 ` Linus Torvalds @ 2006-07-31 20:38 ` Dave Jones 2006-07-31 20:41 ` Jens Axboe 1 sibling, 0 replies; 35+ messages in thread From: Dave Jones @ 2006-07-31 20:38 UTC (permalink / raw) To: Linus Torvalds; +Cc: Christer Weinigel, James Bottomley, Jens Axboe, linux-scsi On Mon, Jul 31, 2006 at 01:32:53PM -0700, Linus Torvalds wrote: > > > On Sun, 31 Jul 2006, Christer Weinigel wrote: > > > > Yes, a lot of those CD burners are ancient. But I like the fact that > > Linux supports a lot of ancient hardware. :-) > > Sure. But I don't think we should necessarily design any new code for it. > It's not like this has _ever_ worked differently from what it does now, so > if you have one of the pre-MMC drives, the right answer right now (and > always has been, I think) is that you need to be root to burn them. > > I seriously doubt anybody _really_ cares. > > That said, I don't think Peter Jones' patch is wrong. I don't have any > strong feelings about it - if people actually want this adn feels it > improves the situation, why not? Although to actually make _sense_, we'd > want to have distros that actually want to use the interface to > auto-populate the command things or something.. In the absense of interest > from distros, I don't think it is worth it. With my distro vendor hat on, I'm interested in anything that makes these bug reports go away. I don't particularly care on the mechanism, but we need *something*. Should his patch be accepted, Peter would likely be the poor soul who gets to implement the userspace bits for Fedora anyway, and I doubt he would've hacked up the patch if he hadn't intended to do so :) Dave -- http://www.codemonkey.org.uk ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-31 20:32 ` Linus Torvalds 2006-07-31 20:38 ` Dave Jones @ 2006-07-31 20:41 ` Jens Axboe 2006-07-31 20:46 ` Linus Torvalds 1 sibling, 1 reply; 35+ messages in thread From: Jens Axboe @ 2006-07-31 20:41 UTC (permalink / raw) To: Linus Torvalds; +Cc: Christer Weinigel, James Bottomley, Dave Jones, linux-scsi On Mon, Jul 31 2006, Linus Torvalds wrote: > > > On Sun, 31 Jul 2006, Christer Weinigel wrote: > > > > Yes, a lot of those CD burners are ancient. But I like the fact that > > Linux supports a lot of ancient hardware. :-) > > Sure. But I don't think we should necessarily design any new code for it. > It's not like this has _ever_ worked differently from what it does now, so > if you have one of the pre-MMC drives, the right answer right now (and > always has been, I think) is that you need to be root to burn them. > > I seriously doubt anybody _really_ cares. Probably not for the ancient ones, except the odd person still using them :-) There are, however, new uses of vendor specific commands that you need access to for fully utilizing your drive. As mentioned, Plextor is one of these. And they do make current and very good burners, yet we cannot add their opcodes to the table because they (sanely) used the vendor specific range for that. > That said, I don't think Peter Jones' patch is wrong. I don't have any > strong feelings about it - if people actually want this adn feels it > improves the situation, why not? Although to actually make _sense_, we'd > want to have distros that actually want to use the interface to > auto-populate the command things or something.. In the absense of interest > from distros, I don't think it is worth it. The default table will be the same as know, distros can leave it alone for now. It at least enables the user to add the vendor opcodes if need be. I'll test and mangle the patch for 2.6.19. -- Jens Axboe ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-31 20:41 ` Jens Axboe @ 2006-07-31 20:46 ` Linus Torvalds 2006-08-01 6:54 ` Jens Axboe 0 siblings, 1 reply; 35+ messages in thread From: Linus Torvalds @ 2006-07-31 20:46 UTC (permalink / raw) To: Jens Axboe; +Cc: Christer Weinigel, James Bottomley, Dave Jones, linux-scsi On Mon, 31 Jul 2006, Jens Axboe wrote: > > There are, however, new uses of vendor specific commands that you need > access to for fully utilizing your drive. As mentioned, Plextor is one > of these. And they do make current and very good burners, yet we cannot > add their opcodes to the table because they (sanely) used the vendor > specific range for that. However, before we do that, can somebody actially just FIX that stupid cdrecord bug. It shouldn't say it can't write the drive, if it's just that it's not allowed to use one of the vendor-specific extensions. As mentioned, I bet burning _does_ actually work. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-31 20:46 ` Linus Torvalds @ 2006-08-01 6:54 ` Jens Axboe 0 siblings, 0 replies; 35+ messages in thread From: Jens Axboe @ 2006-08-01 6:54 UTC (permalink / raw) To: Linus Torvalds; +Cc: Christer Weinigel, James Bottomley, Dave Jones, linux-scsi On Mon, Jul 31 2006, Linus Torvalds wrote: > > > On Mon, 31 Jul 2006, Jens Axboe wrote: > > > > There are, however, new uses of vendor specific commands that you need > > access to for fully utilizing your drive. As mentioned, Plextor is one > > of these. And they do make current and very good burners, yet we cannot > > add their opcodes to the table because they (sanely) used the vendor > > specific range for that. > > However, before we do that, can somebody actially just FIX that stupid > cdrecord bug. It shouldn't say it can't write the drive, if it's just that > it's not allowed to use one of the vendor-specific extensions. > > As mentioned, I bet burning _does_ actually work. Oh yeah, I think so too. It's for other features on the Plextor, like disc quality scans. So it's not critical as such for burning, but it is something that we do want to work. I don't think you disagree that we need to support the vendor unique range of opcodes. And I don't think you disagree that we cannot safely put these in the global table. So that leaves one sane option - per device cmd filter table. I've kept Peter's original patch somewhat uptodate, I'll bring it to 2.6.18-rc3 and test+submit for 2.6.19. -- Jens Axboe ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:06 ` Linus Torvalds 2006-07-29 17:30 ` James Bottomley @ 2006-07-29 18:39 ` Douglas Gilbert 2006-07-29 18:54 ` Linus Torvalds 1 sibling, 1 reply; 35+ messages in thread From: Douglas Gilbert @ 2006-07-29 18:39 UTC (permalink / raw) To: Linus Torvalds; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi Linus Torvalds wrote: > > On Sat, 29 Jul 2006, James Bottomley wrote: >> I concur. If we're going to allow users access to burn CDs, it's >> impossible to police them with certainty as this case indicates. > > Not so. I can (and have) written tons of CD's as a normal user, with > perfect security. > > No, the kernel shouldn't allow device-specific commands. That goes without > saying. Whether this is a sg.c problem, or a cdrecord problem is unclear, > I suspect it's the latter. Command filtering has always been dubious. The sg driver takes the approach of allowing through a small number of "safe" (often mandatory) SCSI _Primary_ Commands (SPC). It takes no special account of the Multimedia Commands (MMC), cdrecord or the SCSI Block Commands (SBC). The sg driver filter does lean a little towards SBC by allowing the READ CAPACITY command to be accessed O_RDONLY. The block layer SG_IO filter bends over backwards to support MMC and hence cdrecord. So it supports one device _type_ specific class. Due to vendor specific commands (e.g. from plextor) it cannot keep cdrecord completely happy. For a comparison of the two filters see table 3 in: http://www.torque.net/sg/sg_io.html That table highlights another difference between the two filters: - sg: allow some commands to be accessed O_RDONLY and let all commands to be accessed O_RDWR - block SG_IO: has three states: allow some commands to be accessed O_RDONLY, a larger set O_RDWR and the rest with CAP_SYS_RAW_IO The latter approach is harder to keep correct. Two glaring faults are REPORT LUNS (mandatory since SPC-3) and READ CAPACITY(16); both are "safe" but need CAP_SYS_RAW_IO capability (usually root permissions). This may not annoy cdrecord but it would peeve other pass through users. If a user has read write permissions on a full device (not just a partition in it) why shouldn't they be able to send any (SCSI/ATA/...) pass through command to it? When the sg driver was used to burn cd and dvds in lk 2.4 series the window manager needed to arrange for the GUI owner to have write permissions on cd and dvd writing devices. No root permissions or CAP_SYS_RAW_IO capability was needed. Doug Gilbert ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 18:39 ` Douglas Gilbert @ 2006-07-29 18:54 ` Linus Torvalds 2006-07-29 20:12 ` Douglas Gilbert 2006-07-29 21:40 ` Christer Weinigel 0 siblings, 2 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 18:54 UTC (permalink / raw) To: Douglas Gilbert; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sat, 29 Jul 2006, Douglas Gilbert wrote: > > Command filtering has always been dubious. No it has not. Command filtering falls under the _very_ non-dubious heading of "of _course_ we have to do it". There is absolutely zero doubt about it at all. You literally have two choices: - you can filter commands - you can disallow all command access for non-specific-capability users. Those are the two choices. There really is no third choice. The only question is the details of _how_ you do the filtering and/or disallowing. > If a user has read write permissions on > a full device (not just a partition in it) why shouldn't > they be able to send any (SCSI/ATA/...) pass through > command to it? They have read-write access to the PLATTER. The fact that you may have access to write data to a disk does _not_ mean that you must necessarily be able to set the password on the disk so that nobody else can ever read or write data to that disk without your permission. Quite frankly, if you don't see that as an "obvious", and that I'm 100% right when I say that you have the above _two_ choices, and that your choice simply is not a choice at all, but total idiocy, then I don't know what to say. Put another way: you will remove that command filtering in block/scsi_ioctl.c only in a kernel that I don't maintain, or by disabling it in some way that is so hidden that I won't notice. Because I'm not so stupid as to think that it's ok for normal users to set driver passwords or rewrite the disk firmware just because they have write permissions to the device. That's pretty damn final. But you can try to _improve_ the filtering. We've certainly done that before. Quite frankly, I don't think there's a lot there that can be improved upon any more, but it's certainly an option that we could change that filtering to be (a) per-device and (b) allow root to explicitly change it on a per-machine and per-device setting, with the current filtering rules being just the "default rules". Then you could encode any additional rules you want in a /sbin/hotplug script or something. But the filtering isn't going _anywhere_, and what you suggest is just totally and utterly insane. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 18:54 ` Linus Torvalds @ 2006-07-29 20:12 ` Douglas Gilbert 2006-07-29 20:33 ` Linus Torvalds 2006-07-29 21:40 ` Christer Weinigel 1 sibling, 1 reply; 35+ messages in thread From: Douglas Gilbert @ 2006-07-29 20:12 UTC (permalink / raw) To: Linus Torvalds; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi Linus Torvalds wrote: > > On Sat, 29 Jul 2006, Douglas Gilbert wrote: >> Command filtering has always been dubious. > > No it has not. > > Command filtering falls under the _very_ non-dubious heading of "of > _course_ we have to do it". There is absolutely zero doubt about it at > all. > > You literally have two choices: > - you can filter commands > - you can disallow all command access for non-specific-capability users. > > Those are the two choices. There really is no third choice. The only > question is the details of _how_ you do the filtering and/or disallowing. > >> If a user has read write permissions on >> a full device (not just a partition in it) why shouldn't >> they be able to send any (SCSI/ATA/...) pass through >> command to it? > > They have read-write access to the PLATTER. > > The fact that you may have access to write data to a disk does _not_ mean > that you must necessarily be able to set the password on the disk so that > nobody else can ever read or write data to that disk without your > permission. See below. Non-root users do not usually have read or write permissions to a _disk_. We were talking about a different class of devices: cd/dvd drives. > Quite frankly, if you don't see that as an "obvious", and that I'm 100% > right when I say that you have the above _two_ choices, and that your > choice simply is not a choice at all, but total idiocy, then I don't know > what to say. Well if you want to filter, I'll be happy to find flaws, both over and under filtering. Are you sure SCSI commands are being sent through the pass through? How about ATA commands tunnelled in SCSI commands (already supported by libata). There was recent talk of tunnelling SAS SMP functions through SCSI (SSP) to name another (ab)use. > Put another way: you will remove that command filtering in > block/scsi_ioctl.c only in a kernel that I don't maintain, or by disabling > it in some way that is so hidden that I won't notice. Because I'm not so > stupid as to think that it's ok for normal users to set driver passwords > or rewrite the disk firmware just because they have write permissions to > the device. That's pretty damn final. You weren't at the storage summit. As stated in other posts to this thread it was concluded that command filtering is a flawed strategy. With that consensus that leaves the "disallow all command access for non-specific-capability users" option. > But you can try to _improve_ the filtering. We've certainly done that > before. Quite frankly, I don't think there's a lot there that can be > improved upon any more, but it's certainly an option that we could change > that filtering to be (a) per-device and (b) allow root to explicitly > change it on a per-machine and per-device setting, with the current > filtering rules being just the "default rules". By current rules I suppose you mean the block SG_IO rules. Do you really mean "per-device" as in /dev/hdc or "per-device-type" as in disk versus cd/dvd drive? The current rules are skewed towards MMC so far that they are broken in that some SBC (i.e. hard disk) modifying commands can slip through in the guise of innocent MMC commands. > Then you could encode any additional rules you want in a /sbin/hotplug > script or something. But the filtering isn't going _anywhere_, and what > you suggest is just totally and utterly insane. Sounds like you are playing the man and not the ball. Why didn't you jump on either of these posts: http://marc.theaimsgroup.com/?l=linux-scsi&m=115417174425242&w=2 http://marc.theaimsgroup.com/?l=linux-scsi&m=115418046812126&w=2 Hmm? As you are no doubt aware, disk permissions and cd/dvd drive permissions are set up differently: $ df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/hda2 ext3 19G 15G 3.4G 82% / $ ls -l /dev/hda /dev/hda2 brw-r----- 1 root disk 3, 0 Jul 29 05:14 /dev/hda brw-r----- 1 root disk 3, 2 Jul 29 09:14 /dev/hda2 This email has been saved on /dev/hda2 but I don't have permissions on it. I can't send any pass through commands to /dev/hda or /dev/hda2 as a non-root user (unless my user is in group 'disk' and the command only needs O_RDONLY which rules out the SCSI WRITE command). Here is my cd/dvd combo drive: $ ls -l /dev/hdc brw------- 1 dougg disk 22, 0 Jul 29 09:14 /dev/hdc The GUI (kde of FC5) was started as user 'dougg' but I'm writing this email as user 'torque' so I can't access that cd/dvd drive at the pass through level. There is another class of commands that the sg driver does require CAP_SYS_RAW_IO capability for. Those are the ones that do collateral damage. A bus reset command comes to mind (also ATA soft resets on PATA can take out the other device on the cable). IMO collateral damage is something the OS should take special care with. Doug Gilbert ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 20:12 ` Douglas Gilbert @ 2006-07-29 20:33 ` Linus Torvalds 2006-07-29 20:53 ` Linus Torvalds ` (2 more replies) 0 siblings, 3 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 20:33 UTC (permalink / raw) To: Douglas Gilbert; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sat, 29 Jul 2006, Douglas Gilbert wrote: > > See below. Non-root users do not usually have read > or write permissions to a _disk_. We were talking > about a different class of devices: cd/dvd drives. What has that got to do with _anything_? What do you think is the difference between a disk and a CD drive? And do you really think that it's the _medium_ that looks at the commands? I don't think so. Regardless of whether it's a disk or a CD-ROM, it's the controller in the _drive_ that looks and acts on those commands. And that CD drive (that you have write access to) also has things like firmware. And how do you think that firmware is updated? By magic? Or by SCSI commands sent to the drive? (Yeah, I realize that it's also possible that the firmware update could happen by the drive just reading a disk, since the controller will do various things on its own anyway. I don't actually know if that is ever the case, or possibly even the _common_ case, but my wild guess would be that it's a lot more common to have a firmware update SCSI command than to have the drive able to update its own firmware). Are you _really_ suggesting that people who happen to log in to the console should automatically also be allowed to rewrite the CD-ROM drive firmware, just because they are supposed to be able to write to the CD-ROM media in that drive? Or do other random things that the kernel really doesn't know what they do? For all we know, every single vendor-specific command might be a "please self-descruct now" command. That would be a pretty stupid vendor, but hey, nothing is impossible. If you really think that normal people should be able to send arbitrary SCSI commands to their CD-ROM unit, just because they should be able to write to the _platter_ that happens to have been inserted into that unit, then you really are crazy. By updating the firmware on the CD-ROM drive, you can basically make it be nonfunctional. Or do you know what all those vendor-specific commands do? In that case, we could just say "ok, for this particular device, we know this command is safe, so we can let it through". > You weren't at the storage summit. As stated in other > posts to this thread it was concluded that command > filtering is a flawed strategy. With that consensus > that leaves the "disallow all command access for > non-specific-capability users" option. Apparently it was good that I wasn't at that storage summit, because you guys clearly don't care about users or sanity, and I'd just have been frustrated. We _do_ want to allow users to write their own disks without SUID programs if at all possible, and if for no other reason than the fact that people expect it to work, and so far every SUID program to do so has been a disaster (I'm not saying that it necessarily _always_ is a disaster, and I'm not saying it's wrong, but at least historically it has been). And that BY DEFINITION means that we need to do filtering. No ifs, buts or maybes about it. > By current rules I suppose you mean the block SG_IO rules. Do you really > mean "per-device" as in /dev/hdc or "per-device-type" as in disk versus > cd/dvd drive? Per-device as in /dev/hdc. Every device node would need to have its own filtering rule. > Why didn't you jump on either of these posts: Because I don't read linux-scsi? I replied when I was Cc'd and noticed (and hey, I sometimes get too much personal email too, so that "and noticed" is actually important. The fact that I don't reply to everything doesn't mean that I read it, understood it, and agreed with it). Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 20:33 ` Linus Torvalds @ 2006-07-29 20:53 ` Linus Torvalds 2006-07-29 22:13 ` Arjan van de Ven 2006-07-30 9:38 ` Rogier Wolff 2006-07-30 18:02 ` Douglas Gilbert 2 siblings, 1 reply; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 20:53 UTC (permalink / raw) To: Douglas Gilbert; +Cc: James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sat, 29 Jul 2006, Linus Torvalds wrote: > > Are you _really_ suggesting that people who happen to log in to the > console should automatically also be allowed to rewrite the CD-ROM drive > firmware, just because they are supposed to be able to write to the CD-ROM > media in that drive? Or do other random things that the kernel really > doesn't know what they do? Btw, in the name of full disclosure, I should probably admit that when I did some of the block/scsi_ioctl.c reorganizations and tried to push people to realize that it was much better to do "cdrecord dev=/dev/hda" than by going through sg.c and the ide-scsi emulation thing, the code not only only first missed the CAP_SYS_RAWIO check entirely, I also then made the decision that only root could do any SCSI command ioctl's, and that I thought it was reasonable. I was disabused of that notion fairly quickly. People _really_ didn't like the "if (!capable(CAP_SYS_RAWIO)) return -EPERM;" approach, and "verify_command()" was written pretty quickly. So I have been disabused of that notion myself, the same way I now hope to pass on that wisdom to the next generation of abusees ;) Anyway, the kernel _has_ gone both ways in the past - not having any access checks at all, and only allowing root. We tried it, and neither really worked. And no, to my knowledge, nobody _actually_ ever fried their CD-ROM by a bad user overwriting the firmware, but quite frankly, I don't want to risk it. (As a historical oddity - there _was_ this bug in some drive that would corrupt the firmware by mistake, though - I think we _did_ actually fry some drives by sending it a "cache flush" command that it wasn't expecting, and that it turned into firmware reload thing or something. I think Alan Cox knows all the gruesome details, but that we could definitely blame on bad hardware.. I think that actually happened to be a CD-ROM drive, but it wasn't even a user-generated command at all, it was the kernel doing the cache-flush all on its sorry own.. Somebody who remembers the exact details can fill us in just for completeness) Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 20:53 ` Linus Torvalds @ 2006-07-29 22:13 ` Arjan van de Ven 2006-07-30 5:57 ` Matthew Wilcox 0 siblings, 1 reply; 35+ messages in thread From: Arjan van de Ven @ 2006-07-29 22:13 UTC (permalink / raw) To: Linus Torvalds Cc: linux-scsi, Dave Jones, Jens Axboe, James Bottomley, Douglas Gilbert > (As a historical oddity - there _was_ this bug in some drive that would > corrupt the firmware by mistake, though - I think we _did_ actually fry > some drives by sending it a "cache flush" command that it wasn't > expecting, and that it turned into firmware reload thing or something. I > think Alan Cox knows all the gruesome details, but that we could > definitely blame on bad hardware.. since you asked for it... a certain distribution shipped a preproduction version of a packet writing patch or it was some barrier thing, I forgot, which would end up sending an *ATA* "cache flush" command to ATAPI drives that didn't claim to understand that command range. A certain model of cdrom drive (LG?) actually had that same command byte code as "flash firmware". Arguably it's a very stupid value to pick, but it's also not technically a drive bug; the drive explicitly claimed to not understand the command set in question, and that distro kernel sent it anyway. -- if you want to mail me at work (you don't), use arjan (at) linux.intel.com ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 22:13 ` Arjan van de Ven @ 2006-07-30 5:57 ` Matthew Wilcox 0 siblings, 0 replies; 35+ messages in thread From: Matthew Wilcox @ 2006-07-30 5:57 UTC (permalink / raw) To: Arjan van de Ven Cc: Linus Torvalds, linux-scsi, Dave Jones, Jens Axboe, James Bottomley, Douglas Gilbert On Sun, Jul 30, 2006 at 12:13:06AM +0200, Arjan van de Ven wrote: > > > (As a historical oddity - there _was_ this bug in some drive that would > > corrupt the firmware by mistake, though - I think we _did_ actually fry > > some drives by sending it a "cache flush" command that it wasn't > > expecting, and that it turned into firmware reload thing or something. I > > think Alan Cox knows all the gruesome details, but that we could > > definitely blame on bad hardware.. > > since you asked for it... > > a certain distribution shipped a preproduction version of a packet > writing patch or it was some barrier thing, I forgot, which would end up > sending an *ATA* "cache flush" command to ATAPI drives that didn't claim > to understand that command range. A certain model of cdrom drive (LG?) > actually had that same command byte code as "flash firmware". > > Arguably it's a very stupid value to pick, but it's also not technically > a drive bug; the drive explicitly claimed to not understand the command > set in question, and that distro kernel sent it anyway. Actually, the standard does prohibit these command values from being reused for different purposes. http://lwn.net/Articles/55815/ ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 20:33 ` Linus Torvalds 2006-07-29 20:53 ` Linus Torvalds @ 2006-07-30 9:38 ` Rogier Wolff 2006-07-30 18:02 ` Douglas Gilbert 2 siblings, 0 replies; 35+ messages in thread From: Rogier Wolff @ 2006-07-30 9:38 UTC (permalink / raw) To: Linus Torvalds Cc: Douglas Gilbert, James Bottomley, Jens Axboe, Dave Jones, linux-scsi On Sat, Jul 29, 2006 at 01:33:42PM -0700, Linus Torvalds wrote: > (Yeah, I realize that it's also possible that the firmware update > could happen by the drive just reading a disk, since the controller > will do various things on its own anyway. I don't actually know if > that is ever the case, or possibly even the _common_ case, but my > wild guess would be that it's a lot more common to have a firmware > update SCSI command than to have the drive able to update its own > firmware). Just for the record: we've upgraded CD burner firmware, and it works by running some silly little program on DOS. No media involved. We've updated/modified harddisk drive firmware. Same procedure: vendor specific commands, and voila! (We're currently banging the hardware to do this, possibly we might port to some passtrhough thingy later on) I have vendor confirmation that turning on some consumer electronics while holding a specific key combo will make the device boot (some stage-2 boot) from the inserted CD instead of the firmware inside. They use this to boot the "diagnostics" CD, but an "update firmware" CD could obviously be made. Roger. -- ** R.E.Wolff@BitWizard.nl ** http://www.BitWizard.nl/ ** +31-15-2600998 ** *-- BitWizard writes Linux device drivers for any device you may have! --* Q: It doesn't work. A: Look buddy, doesn't work is an ambiguous statement. Does it sit on the couch all day? Is it unemployed? Please be specific! Define 'it' and what it isn't doing. --------- Adapted from lxrbot FAQ ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 20:33 ` Linus Torvalds 2006-07-29 20:53 ` Linus Torvalds 2006-07-30 9:38 ` Rogier Wolff @ 2006-07-30 18:02 ` Douglas Gilbert 2006-07-30 20:06 ` Linus Torvalds 2 siblings, 1 reply; 35+ messages in thread From: Douglas Gilbert @ 2006-07-30 18:02 UTC (permalink / raw) To: Linus Torvalds; +Cc: linux-scsi Linus Torvalds wrote: > > On Sat, 29 Jul 2006, Douglas Gilbert wrote: >> See below. Non-root users do not usually have read >> or write permissions to a _disk_. We were talking >> about a different class of devices: cd/dvd drives. > > What has that got to do with _anything_? > > What do you think is the difference between a disk and a CD drive? > > And do you really think that it's the _medium_ that looks at the commands? > I don't think so. Regardless of whether it's a disk or a CD-ROM, it's the > controller in the _drive_ that looks and acts on those commands. > > And that CD drive (that you have write access to) also has things like > firmware. And how do you think that firmware is updated? By magic? Or by > SCSI commands sent to the drive? <snip> Hard disks and CD/DVD drives are quite different from a command set point of view. Both have high level read operations that map very cleanly to the block layer. The write side is very different. Disks have a high level write operation that is symmetric with the read operation and the write can be called many times on the same lba with provision for multi user access (locking). Writes and reads can be interspersed in rapid succession. OTOH CD/DVD drive media are written once (leaving aside the "-RW" hack) and that write is done at a much lower level (command set wise) than the read. The application writing the cd/dvd media is assumed to have exclusive access for the duration of the write operation (which may be some time). During a write operation the rest of the cd/dvd media is unavailable for reading. That low level write operation assumes the application knows a lot more about the drive and the media than the OS would ever want to know. Another difference is that the cd/dvd media is not only removable but that a user expects to be able to read it 5 or 10 years after it was burnt on a drive from another manufacturer. To cope with the lower level write once operation of a cd/dvd drive, we need applications like cdrecord and nero and they need a pass through interface. Just like you, I have been abused by Joerg Schilling but there was some technical merit in what he was saying and it is reflected in the SG_IO ioctl design. Actually the idea of the SG_IO ioctl itself came from Joerg Schilling. I have pointed out that the block layer SG_IO ioctl is broken in various ways. Here is an example chosen because it will be very difficult to exploit. The MMC command set must not use opcodes (the first byte of a SCSI cdb) that are used by the SCSI Primary Commands (SPC) but it can overlap with other device specific command sets. A quite important device specific command set is SBC (for block devices including hard disks). The GET PERFORMANCE MMC command is set for O_RDONLY access by the block layer SG_IO filter and O_RDWR by the sg driver. That command uses opcode 0xac . From a MMC point of view that opcode is "safe". Now checking my references I observe that for the optical block memory device type (covered by SBC) that is an ERASE(12) operation. Choose your poison! Also be aware that we have been in a world of multiple command sets (and multiple transports) for some time. Take ATAPI devices: one can send many SPC and MMC (SCSI) commands to such a device. One can also send certain (transport and identification related) ATA commands. The most obvious example of the latter is the IDENTIFY PACKET DEVICE (ATA) command. As of lk 2.6.15 one can send that ATA command two ways: - via the long standing ATA specific ioctls (e.g. the HDIO_GET_IDENTITY ioctl **) - if the device is libata connected (or any other SAT compliant layer), via the ATA PASS THROUGH SCSI command The IDENTIFY PACKET DEVICE (ATA) command is "safe" and should be allowed O_RDONLY but not all ATA commands that can be sent to ATAPI device (e.g. SET FEATURES) could be considered "safe". Once we move lower into the transport domain, things can become even murkier with ATAPI possibly conveyed across SATA (S-ATAPI) which in turn may be conveyed across STP in SAS. Sometimes transport characteristics can be tweaked "in-band", that is, down the same path that commands are sent. The point I'm trying to make is that opcode based filtering may have been sufficient in 1992 (circa SCSI-2) but 14 years later it most certainly ain't. Doug Gilbert ** Last time I looked the HDIO_GET_IDENTITY ioctl returned cached information. IMO that is incorrect, it should go out to the command each time. ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 18:02 ` Douglas Gilbert @ 2006-07-30 20:06 ` Linus Torvalds 0 siblings, 0 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-30 20:06 UTC (permalink / raw) To: Douglas Gilbert; +Cc: linux-scsi On Sun, 30 Jul 2006, Douglas Gilbert wrote: > > The point I'm trying to make is that opcode based filtering > may have been sufficient in 1992 (circa SCSI-2) but 14 > years later it most certainly ain't. Nobody has ever contested that we might not make it smarter. The point I was makign was that _not_ filtering is insane. The filters could possibly be made smarter, but REMOVING THEM IS NOT AN OPTION. It's also not an option to make it root-only, because making cdrecord suid root simply isn't acceptable as things are now. And that _is_ what you and Jens were talking about. And that is also what you claimed that the storage summit decided was the sane approach. So can we _please_ agree that the storage summit was just being stupid and incompetent, and hadn't thought it through? That filtering isn't going away, but it migt be extended. Oh, btw, I'm perfectly fine with removing the filtering from "sg.c", and making _that_ interface be root-only. Anything that doesn't use the block/scsi_ioctl.c version of the interface is not worth supporting any more, since it hasn't _ever_ worked reliably with IDE-CD's, and quite frankly, IDE-CD's is pretty much 95+% of the market. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 18:54 ` Linus Torvalds 2006-07-29 20:12 ` Douglas Gilbert @ 2006-07-29 21:40 ` Christer Weinigel 2006-07-30 5:56 ` Linus Torvalds 1 sibling, 1 reply; 35+ messages in thread From: Christer Weinigel @ 2006-07-29 21:40 UTC (permalink / raw) To: Linus Torvalds Cc: Douglas Gilbert, James Bottomley, Jens Axboe, Dave Jones, linux-scsi Linus Torvalds <torvalds@osdl.org> writes: > But you can try to _improve_ the filtering. We've certainly done that > before. Quite frankly, I don't think there's a lot there that can be > improved upon any more, but it's certainly an option that we could change > that filtering to be (a) per-device and (b) allow root to explicitly > change it on a per-machine and per-device setting, with the current > filtering rules being just the "default rules". The filtering can definitely be improved. Today sg_io filters on SCSI commands only, but it really ought to have a filter for mode pages[1] too. The burn proof setting for a drive could be in a vendor specific mode page and cdrecord should be able to write to it. Another page controls the SCSI bus timings and shold definitely not be writable by cdrecord. Or we could just do as Jörg Schilling says: trust him and just make cdrecord suid root. /Christer [1] http://en.wikipedia.org/wiki/SCSI_mode_pages -- "Just how much can I get away with and still go to heaven?" Freelance consultant specializing in device driver programming for Linux Christer Weinigel <christer@weinigel.se> http://www.weinigel.se - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 21:40 ` Christer Weinigel @ 2006-07-30 5:56 ` Linus Torvalds 0 siblings, 0 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-30 5:56 UTC (permalink / raw) To: Christer Weinigel Cc: Douglas Gilbert, James Bottomley, Jens Axboe, Dave Jones, linux-scsi [-- Attachment #1: Type: TEXT/PLAIN, Size: 228 bytes --] On Sat, 29 Jul 2006, Christer Weinigel wrote: > > Or we could just do as Jörg Schilling says: trust him and just make > cdrecord suid root. Mwhahhahhaaah.. [ Wiping tears of laughter off my face ] That was funny. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 11:12 ` Jens Axboe 2006-07-29 13:40 ` James Bottomley @ 2006-07-29 17:04 ` Linus Torvalds 2006-07-29 17:22 ` Dave Jones 2006-07-31 9:32 ` Jens Axboe 1 sibling, 2 replies; 35+ messages in thread From: Linus Torvalds @ 2006-07-29 17:04 UTC (permalink / raw) To: Jens Axboe; +Cc: Dave Jones, linux-scsi [-- Attachment #1: Type: TEXT/PLAIN, Size: 2639 bytes --] On Sat, 29 Jul 2006, Jens Axboe wrote: > > I'd greatly prefer just ripping the entire command access table out, it > was a mistake to begin with and still just a horrible solution. Well, I don't think the _notion_ of a command access table is the problem per se. I just think that "sg.c" is badly done. We do it _correctly_ in the sane paths (ie we really have the "same table" in "verify_command()" in block/scsi_ioctl.c), and the thing is, when done correctly, the command access table is a perfectly fine idea. And the thing is, that "verify_command()" is absolutely _required_. As root, you can send any command you want, but we really _do_ want normal users to be able to send a sane subset, without allowing them to do other things just because they have write access to the medium. > In fact, I think we should decide soon what to do about it. At the > storage summit, there was general consensus on just killing it as well. I don't think there's any point to killing it. The fact is, anybody who works with a known storage device simply SHOULD NOT USE THE sg.c INTERFACES. Only totally insane people (ie Jörg Schilling) think that it's even remotely sane. If you know it's a storage device, you should use the proper block interfaces, and instad of doing cdrecord -dev=ATA:1,0,0 the person should really have done cdrecord -dev=/dev/hdc or something sane, and gone through the proper channels, instead of going through the nightmare that is Schillings "brain"). In fact, I would seriously suggest that distributions should disallow the insane interfaces to cdrecord. "sg.c" makes sense for SCSI laser range fingers and other strange stuff. It does _not_ make sense for CD-ROM access. Btw, it's entirely possible that you might hit the same problem with /dev/hdc too. But at that point it should be 100% obvious that - only root can ever be allowed to generate commands that the kernel has no clue what they are doing. NO WAY can we allow a user to generate postentially hardware-changing special commands just because he can access the CD-ROM (ie how would the kernel know that it's not a command that says "rewrite the firmware with something that always reads goatse off the disk"?) - if cdrecord tries to do some device-specific setup, and is upset that it can't do it because the user isn't root, then it's obviously a cdrecord bug. Which wouldn't surprise me at all - can we _please_ not rely on code that has been written by a certified nut-case? And in either case, I don't think this is a kernel bug, unless it also happens as root, of course. Linus ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:04 ` Linus Torvalds @ 2006-07-29 17:22 ` Dave Jones 2006-07-30 10:21 ` Rogier Wolff 2006-07-31 9:33 ` Jens Axboe 2006-07-31 9:32 ` Jens Axboe 1 sibling, 2 replies; 35+ messages in thread From: Dave Jones @ 2006-07-29 17:22 UTC (permalink / raw) To: Linus Torvalds; +Cc: Jens Axboe, linux-scsi On Sat, Jul 29, 2006 at 10:04:46AM -0700, Linus Torvalds wrote: > We do it _correctly_ in the sane paths (ie we really have the "same table" > in "verify_command()" in block/scsi_ioctl.c), and the thing is, when done > correctly, the command access table is a perfectly fine idea. Ah, that's what I was hunting for. I must have poked through every file in drivers/scsi/ looking for that ioctl. It never occured to me to even look in block/ I've not looked too closely at exactly which method cdrecord was using in the numerous bug reports we've had on this, but .. > Btw, it's entirely possible that you might hit the same problem with > /dev/hdc too. This may be the case. > - only root can ever be allowed to generate commands that the kernel has > no clue what they are doing. NO WAY can we allow a user to generate > postentially hardware-changing special commands just because he can > access the CD-ROM (ie how would the kernel know that it's not a command > that says "rewrite the firmware with something that always reads goatse > off the disk"?) I had visions of extending verify_command() to be of the form.. if (devicevendor==PLEXTOR) { safe_for_write(ENABLE_BURN_PROOF); safe_for_write(ENABLE_FROBNICATOR); } etc.. > - if cdrecord tries to do some device-specific setup, and is upset that > it can't do it because the user isn't root, then it's obviously a > cdrecord bug. Which wouldn't surprise me at all I concur it shouldn't fail completely. But at the same time, if a user splashed out his pennies to get a modern writer with shiny features, it's a bit crappy of us to make him be root to use them. > - can we _please_ not > rely on code that has been written by a certified nut-case? It's a mystery to me why nothing better has come along over the years. Dave -- http://www.codemonkey.org.uk ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:22 ` Dave Jones @ 2006-07-30 10:21 ` Rogier Wolff 2006-07-30 10:31 ` Arjan van de Ven 2006-07-30 11:09 ` Steve McIntyre 2006-07-31 9:33 ` Jens Axboe 1 sibling, 2 replies; 35+ messages in thread From: Rogier Wolff @ 2006-07-30 10:21 UTC (permalink / raw) To: Dave Jones; +Cc: Linus Torvalds, Jens Axboe, linux-scsi On Sat, Jul 29, 2006 at 01:22:05PM -0400, Dave Jones wrote: > I had visions of extending verify_command() to be of the form.. > > if (devicevendor==PLEXTOR) { > safe_for_write(ENABLE_BURN_PROOF); > safe_for_write(ENABLE_FROBNICATOR); > } > etc.. Almost there.... Instead it should walk a (device-specific (*)) table, that specifies what is "safe". The table has masks to specify which bits are important and what values are expected and allowed etc etc. This table could be initialized "empty". Next a simple interface should allow root to modify the table. I expect that after doing this, the code above the suggestion could be deleted, and that the currently-hardcoded policy could move into the default table, instead of having the table start out empty. This might be a performance tradeoff (i.e. even though it reduces code size, the hardcoded version may be much quicker than walking the table every time). Now distributions/users/sysadmins can chose: A) leave as is: The ACME DVDwriter's new SuperDVDProof feature will only work as root once implemented in cdrecord. B) insert a table entry: "everything allowed". This will allow users to shoot themselves in the foot. C) Be smart about it, and provide a mechanism to detect ACME drives with the feature, select the appropriate config file and upload the corresponding table. Everybody happy? Roger. (*) /dev/hdc, not "Plextor". -- ** R.E.Wolff@BitWizard.nl ** http://www.BitWizard.nl/ ** +31-15-2600998 ** *-- BitWizard writes Linux device drivers for any device you may have! --* Q: It doesn't work. A: Look buddy, doesn't work is an ambiguous statement. Does it sit on the couch all day? Is it unemployed? Please be specific! Define 'it' and what it isn't doing. --------- Adapted from lxrbot FAQ ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 10:21 ` Rogier Wolff @ 2006-07-30 10:31 ` Arjan van de Ven 2006-07-30 11:09 ` Steve McIntyre 1 sibling, 0 replies; 35+ messages in thread From: Arjan van de Ven @ 2006-07-30 10:31 UTC (permalink / raw) To: Rogier Wolff; +Cc: Dave Jones, Linus Torvalds, Jens Axboe, linux-scsi > This table could be initialized "empty". > > Next a simple interface should allow root to modify the table. this got coded quite a while ago http://www.uwsg.iu.edu/hypermail/linux/kernel/0409.1/2109.html ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-30 10:21 ` Rogier Wolff 2006-07-30 10:31 ` Arjan van de Ven @ 2006-07-30 11:09 ` Steve McIntyre 1 sibling, 0 replies; 35+ messages in thread From: Steve McIntyre @ 2006-07-30 11:09 UTC (permalink / raw) To: linux-scsi Rogier Wolff writes: >On Sat, Jul 29, 2006 at 01:22:05PM -0400, Dave Jones wrote: >> I had visions of extending verify_command() to be of the form.. >> >> if (devicevendor==PLEXTOR) { >> safe_for_write(ENABLE_BURN_PROOF); >> safe_for_write(ENABLE_FROBNICATOR); >> } >> etc.. > >Almost there.... > >Instead it should walk a (device-specific (*)) table, that specifies >what is "safe". The table has masks to specify which bits are >important and what values are expected and allowed etc etc. > >This table could be initialized "empty". > >Next a simple interface should allow root to modify the table. Yup. I proposed a proof-of-concept patch to allow this a while back - let root define policy per-device: http://marc.theaimsgroup.com/?l=linux-scsi&m=113214433405637&w=2 -- Steve McIntyre, Cambridge, UK. steve@einval.com Into the distance, a ribbon of black Stretched to the point of no turning back ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:22 ` Dave Jones 2006-07-30 10:21 ` Rogier Wolff @ 2006-07-31 9:33 ` Jens Axboe 1 sibling, 0 replies; 35+ messages in thread From: Jens Axboe @ 2006-07-31 9:33 UTC (permalink / raw) To: Dave Jones; +Cc: Linus Torvalds, linux-scsi On Sat, Jul 29 2006, Dave Jones wrote: > > - only root can ever be allowed to generate commands that the kernel has > > no clue what they are doing. NO WAY can we allow a user to generate > > postentially hardware-changing special commands just because he can > > access the CD-ROM (ie how would the kernel know that it's not a command > > that says "rewrite the firmware with something that always reads goatse > > off the disk"?) > > I had visions of extending verify_command() to be of the form.. > > if (devicevendor==PLEXTOR) { > safe_for_write(ENABLE_BURN_PROOF); > safe_for_write(ENABLE_FROBNICATOR); > } > etc.. God Dave, that's horrible and completely unmaintanable! The main problem with the device table right now is that it's completely kernel controlled, thus burdening everybody with this policy. Lets get it fixed instead of adding more warts to it. -- Jens Axboe ^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: cd burning with plextor drives. 2006-07-29 17:04 ` Linus Torvalds 2006-07-29 17:22 ` Dave Jones @ 2006-07-31 9:32 ` Jens Axboe 1 sibling, 0 replies; 35+ messages in thread From: Jens Axboe @ 2006-07-31 9:32 UTC (permalink / raw) To: Linus Torvalds; +Cc: Dave Jones, linux-scsi On Sat, Jul 29 2006, Linus Torvalds wrote: > > > On Sat, 29 Jul 2006, Jens Axboe wrote: > > > > I'd greatly prefer just ripping the entire command access table out, it > > was a mistake to begin with and still just a horrible solution. > > Well, I don't think the _notion_ of a command access table is the problem > per se. > > I just think that "sg.c" is badly done. > > We do it _correctly_ in the sane paths (ie we really have the "same table" > in "verify_command()" in block/scsi_ioctl.c), and the thing is, when done > correctly, the command access table is a perfectly fine idea. > > And the thing is, that "verify_command()" is absolutely _required_. As > root, you can send any command you want, but we really _do_ want normal > users to be able to send a sane subset, without allowing them to do other > things just because they have write access to the medium. If you feel that the command screening is required, then I'd suggest we start adding some flexibility to it. As Doug pointed out, it's very MMC centric right now. And you have have the problem of wanting to allow some commands for certain devices, some for others, but not have perfect overlap. Vendor specific commands is another problem, some of them are required for functionality on newer Plextor (not making this up or got it from Joerg, it's a fact) drives. We can never add vendor specific commands right now though, as they are device specific. One possible approach is this: http://git.kernel.dk/?p=linux-2.6-block.git;a=commitdiff;h=63bfd0060d0feb5f3ba161c2c1e6e8082fe2f68d exposing the command table to user space through a filter in the queue directory of that request queue. What do you think of that approach? > > In fact, I think we should decide soon what to do about it. At the > > storage summit, there was general consensus on just killing it as well. > > I don't think there's any point to killing it. > > The fact is, anybody who works with a known storage device simply SHOULD > NOT USE THE sg.c INTERFACES. Only totally insane people (ie Jörg > Schilling) think that it's even remotely sane. If you know it's a storage > device, you should use the proper block interfaces, and instad of doing > > cdrecord -dev=ATA:1,0,0 > > the person should really have done > > cdrecord -dev=/dev/hdc > > or something sane, and gone through the proper channels, instead of going > through the nightmare that is Schillings "brain"). > > In fact, I would seriously suggest that distributions should disallow the > insane interfaces to cdrecord. > > "sg.c" makes sense for SCSI laser range fingers and other strange stuff. > It does _not_ make sense for CD-ROM access. > > Btw, it's entirely possible that you might hit the same problem with > /dev/hdc too. But at that point it should be 100% obvious that > > - only root can ever be allowed to generate commands that the kernel has > no clue what they are doing. NO WAY can we allow a user to generate > postentially hardware-changing special commands just because he can > access the CD-ROM (ie how would the kernel know that it's not a command > that says "rewrite the firmware with something that always reads goatse > off the disk"?) > > - if cdrecord tries to do some device-specific setup, and is upset that > it can't do it because the user isn't root, then it's obviously a > cdrecord bug. Which wouldn't surprise me at all - can we _please_ not > rely on code that has been written by a certified nut-case? > > And in either case, I don't think this is a kernel bug, unless it also > happens as root, of course. Forget sg.c vs scsi_ioctl.c, that is a separate issue that bsg should unify in the future. The command table affects them all though, and the fact that we have differing access limitation in scsi_ioctl vs sg right now is a little sad. But a separate issue. -- Jens Axboe - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 35+ messages in thread
end of thread, other threads:[~2006-08-01 6:54 UTC | newest] Thread overview: 35+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-07-29 4:52 cd burning with plextor drives Dave Jones 2006-07-29 11:12 ` Jens Axboe 2006-07-29 13:40 ` James Bottomley 2006-07-29 15:39 ` Christer Weinigel 2006-07-29 17:06 ` Linus Torvalds 2006-07-29 17:30 ` James Bottomley 2006-07-29 17:49 ` Linus Torvalds 2006-07-30 16:02 ` Christer Weinigel 2006-07-30 19:57 ` Linus Torvalds 2006-07-30 20:18 ` Christian Iversen 2006-07-31 0:12 ` Christer Weinigel 2006-07-31 20:32 ` Linus Torvalds 2006-07-31 20:38 ` Dave Jones 2006-07-31 20:41 ` Jens Axboe 2006-07-31 20:46 ` Linus Torvalds 2006-08-01 6:54 ` Jens Axboe 2006-07-29 18:39 ` Douglas Gilbert 2006-07-29 18:54 ` Linus Torvalds 2006-07-29 20:12 ` Douglas Gilbert 2006-07-29 20:33 ` Linus Torvalds 2006-07-29 20:53 ` Linus Torvalds 2006-07-29 22:13 ` Arjan van de Ven 2006-07-30 5:57 ` Matthew Wilcox 2006-07-30 9:38 ` Rogier Wolff 2006-07-30 18:02 ` Douglas Gilbert 2006-07-30 20:06 ` Linus Torvalds 2006-07-29 21:40 ` Christer Weinigel 2006-07-30 5:56 ` Linus Torvalds 2006-07-29 17:04 ` Linus Torvalds 2006-07-29 17:22 ` Dave Jones 2006-07-30 10:21 ` Rogier Wolff 2006-07-30 10:31 ` Arjan van de Ven 2006-07-30 11:09 ` Steve McIntyre 2006-07-31 9:33 ` Jens Axboe 2006-07-31 9:32 ` Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox