* SG_IO permissions
@ 2008-07-02 13:20 Arne Wiebalck
2008-07-02 14:51 ` James Bottomley
0 siblings, 1 reply; 9+ messages in thread
From: Arne Wiebalck @ 2008-07-02 13:20 UTC (permalink / raw)
To: linux-scsi
Hi all,
I am trying to replace some read/write calls in our application
by SG_IO commands in order to have access to the sense bytes in
case of an error. The underlying devices are tape drives.
Part of our application, such as positioning or reading labels
from the tape, are run as root. This seems to work fine, I get
the data I expect and the sense bytes in case of an error.
However, the actual data transfer from and to the device is run
under a user's ID. This part does not work anymore when switching
from read/write to SG_IO: 'Operation not permitted'.
Does a user need some special rights to issue SG_IO (read) commands
(on a file descriptor that he opened for reading and that he
can use without problems for read() calls)?
The device node that the processes are accessing is a char special
file owned by the user and with all user bits set. This special file
is created on a per tape request basis. I also tried to use /dev/nst0
instead, but that made no difference.
I am running a relatively old kernel (2.6.9 based), could that cause
any problem?
BTW, why does it say "except st" on the permission requirements table on
http://sg.torque.net/sg/sg_io.html ? :)
Any hints appreciated.
TIA,
Arne
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SG_IO permissions
2008-07-02 13:20 SG_IO permissions Arne Wiebalck
@ 2008-07-02 14:51 ` James Bottomley
2008-07-02 18:00 ` Arne Wiebalck
0 siblings, 1 reply; 9+ messages in thread
From: James Bottomley @ 2008-07-02 14:51 UTC (permalink / raw)
To: Arne Wiebalck; +Cc: linux-scsi
On Wed, 2008-07-02 at 15:20 +0200, Arne Wiebalck wrote:
> Hi all,
>
> I am trying to replace some read/write calls in our application
> by SG_IO commands in order to have access to the sense bytes in
> case of an error. The underlying devices are tape drives.
>
> Part of our application, such as positioning or reading labels
> from the tape, are run as root. This seems to work fine, I get
> the data I expect and the sense bytes in case of an error.
>
> However, the actual data transfer from and to the device is run
> under a user's ID. This part does not work anymore when switching
> from read/write to SG_IO: 'Operation not permitted'.
>
> Does a user need some special rights to issue SG_IO (read) commands
> (on a file descriptor that he opened for reading and that he
> can use without problems for read() calls)?
>
> The device node that the processes are accessing is a char special
> file owned by the user and with all user bits set. This special file
> is created on a per tape request basis. I also tried to use /dev/nst0
> instead, but that made no difference.
>
> I am running a relatively old kernel (2.6.9 based), could that cause
> any problem?
>
> BTW, why does it say "except st" on the permission requirements table on
> http://sg.torque.net/sg/sg_io.html ? :)
>
>
> Any hints appreciated.
SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
James
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: SG_IO permissions
2008-07-02 14:51 ` James Bottomley
@ 2008-07-02 18:00 ` Arne Wiebalck
2008-07-02 18:40 ` Arne Wiebalck
0 siblings, 1 reply; 9+ messages in thread
From: Arne Wiebalck @ 2008-07-02 18:00 UTC (permalink / raw)
To: James Bottomley; +Cc: linux-scsi
>> Hi all,
>>
>> I am trying to replace some read/write calls in our application
>> by SG_IO commands in order to have access to the sense bytes in
>> case of an error. The underlying devices are tape drives.
>>
>> Part of our application, such as positioning or reading labels
>> from the tape, are run as root. This seems to work fine, I get
>> the data I expect and the sense bytes in case of an error.
>>
>> However, the actual data transfer from and to the device is run
>> under a user's ID. This part does not work anymore when switching
>> from read/write to SG_IO: 'Operation not permitted'.
>>
>> Does a user need some special rights to issue SG_IO (read) commands
>> (on a file descriptor that he opened for reading and that he
>> can use without problems for read() calls)?
>>
>> The device node that the processes are accessing is a char special
>> file owned by the user and with all user bits set. This special file
>> is created on a per tape request basis. I also tried to use /dev/nst0
>> instead, but that made no difference.
>>
>> I am running a relatively old kernel (2.6.9 based), could that cause
>> any problem?
>>
>> BTW, why does it say "except st" on the permission requirements table on
>> http://sg.torque.net/sg/sg_io.html ? :)
>>
>>
>> Any hints appreciated.
>
>SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
>
Thanks for the quick reply, James.
We're talking about this snippet of code from st.c, I guess?
---
switch (cmd_in) {
case SCSI_IOCTL_GET_IDLUN:
case SCSI_IOCTL_GET_BUS_NUMBER:
break;
default:
if ((cmd_in == SG_IO ||
cmd_in == SCSI_IOCTL_SEND_COMMAND ||
cmd_in == CDROM_SEND_PACKET) &&
!capable(CAP_SYS_RAWIO))
i = -EPERM;
else
i = scsi_cmd_ioctl(file, STp->disk->queue,
STp->disk, cmd_in, p);
if (i != -ENOTTY)
return i;
break;
}
---
Obviously. (I just found the discussion about this dating from
April '05).
What's the way to go then in order to access a tape as a user, when
the user would like to get the sense bytes in case of problems?
Should the user process get CAP_SYS_RAWIO?
TIA,
Arne
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: SG_IO permissions
2008-07-02 18:00 ` Arne Wiebalck
@ 2008-07-02 18:40 ` Arne Wiebalck
2008-07-02 20:28 ` James Bottomley
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Arne Wiebalck @ 2008-07-02 18:40 UTC (permalink / raw)
To: Arne Wiebalck, James Bottomley; +Cc: linux-scsi
>>> Hi all,
>>>
>>> I am trying to replace some read/write calls in our application
>>> by SG_IO commands in order to have access to the sense bytes in
>>> case of an error. The underlying devices are tape drives.
>>>
>>> Part of our application, such as positioning or reading labels
>>> from the tape, are run as root. This seems to work fine, I get
>>> the data I expect and the sense bytes in case of an error.
>>>
>>> However, the actual data transfer from and to the device is run
>>> under a user's ID. This part does not work anymore when switching
>>> from read/write to SG_IO: 'Operation not permitted'.
>>>
>>> Does a user need some special rights to issue SG_IO (read) commands
>>> (on a file descriptor that he opened for reading and that he
>>> can use without problems for read() calls)?
>>>
>>> The device node that the processes are accessing is a char special
>>> file owned by the user and with all user bits set. This special file
>>> is created on a per tape request basis. I also tried to use /dev/nst0
>>> instead, but that made no difference.
>>>
>>> I am running a relatively old kernel (2.6.9 based), could that cause
>>> any problem?
>>>
>>> BTW, why does it say "except st" on the permission requirements table on
>>> http://sg.torque.net/sg/sg_io.html ? :)
>>>
>>>
>>> Any hints appreciated.
>>
>>SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
>>
>
>Thanks for the quick reply, James.
>
>We're talking about this snippet of code from st.c, I guess?
>
>---
>switch (cmd_in) {
> case SCSI_IOCTL_GET_IDLUN:
> case SCSI_IOCTL_GET_BUS_NUMBER:
> break;
> default:
> if ((cmd_in == SG_IO ||
> cmd_in == SCSI_IOCTL_SEND_COMMAND ||
> cmd_in == CDROM_SEND_PACKET) &&
> !capable(CAP_SYS_RAWIO))
> i = -EPERM;
> else
> i = scsi_cmd_ioctl(file, STp->disk->queue,
> STp->disk, cmd_in, p);
> if (i != -ENOTTY)
> return i;
> break;
>}
>---
>
>Obviously. (I just found the discussion about this dating from
>April '05).
>
>What's the way to go then in order to access a tape as a user, when
>the user would like to get the sense bytes in case of problems?
>
>Should the user process get CAP_SYS_RAWIO?
The user process in my case is forked by another process which runs
as root. But since this process does not have CAP_SETPCAP it cannot
set the child's capabilities (which is how I naively thought one could
implement this).
What options are left? Running a patched kernel where the "SG_IO in st
requires CAP_SYS_RAWIO" is taken out?
Cheers,
Arne
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: SG_IO permissions
2008-07-02 18:40 ` Arne Wiebalck
@ 2008-07-02 20:28 ` James Bottomley
2008-07-03 9:15 ` Arne Wiebalck
2008-07-03 17:57 ` KELEMEN Peter
2008-07-04 8:13 ` Arne Wiebalck
2 siblings, 1 reply; 9+ messages in thread
From: James Bottomley @ 2008-07-02 20:28 UTC (permalink / raw)
To: Arne Wiebalck; +Cc: linux-scsi
On Wed, 2008-07-02 at 20:40 +0200, Arne Wiebalck wrote:
> >>> Hi all,
> >>>
> >>> I am trying to replace some read/write calls in our application
> >>> by SG_IO commands in order to have access to the sense bytes in
> >>> case of an error. The underlying devices are tape drives.
> >>>
> >>> Part of our application, such as positioning or reading labels
> >>> from the tape, are run as root. This seems to work fine, I get
> >>> the data I expect and the sense bytes in case of an error.
> >>>
> >>> However, the actual data transfer from and to the device is run
> >>> under a user's ID. This part does not work anymore when switching
> >>> from read/write to SG_IO: 'Operation not permitted'.
> >>>
> >>> Does a user need some special rights to issue SG_IO (read) commands
> >>> (on a file descriptor that he opened for reading and that he
> >>> can use without problems for read() calls)?
> >>>
> >>> The device node that the processes are accessing is a char special
> >>> file owned by the user and with all user bits set. This special file
> >>> is created on a per tape request basis. I also tried to use /dev/nst0
> >>> instead, but that made no difference.
> >>>
> >>> I am running a relatively old kernel (2.6.9 based), could that cause
> >>> any problem?
> >>>
> >>> BTW, why does it say "except st" on the permission requirements table on
> >>> http://sg.torque.net/sg/sg_io.html ? :)
> >>>
> >>>
> >>> Any hints appreciated.
> >>
> >>SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
> >>
> >
> >Thanks for the quick reply, James.
> >
> >We're talking about this snippet of code from st.c, I guess?
> >
> >---
> >switch (cmd_in) {
> > case SCSI_IOCTL_GET_IDLUN:
> > case SCSI_IOCTL_GET_BUS_NUMBER:
> > break;
> > default:
> > if ((cmd_in == SG_IO ||
> > cmd_in == SCSI_IOCTL_SEND_COMMAND ||
> > cmd_in == CDROM_SEND_PACKET) &&
> > !capable(CAP_SYS_RAWIO))
> > i = -EPERM;
> > else
> > i = scsi_cmd_ioctl(file, STp->disk->queue,
> > STp->disk, cmd_in, p);
> > if (i != -ENOTTY)
> > return i;
> > break;
> >}
> >---
> >
> >Obviously. (I just found the discussion about this dating from
> >April '05).
> >
> >What's the way to go then in order to access a tape as a user, when
> >the user would like to get the sense bytes in case of problems?
> >
> >Should the user process get CAP_SYS_RAWIO?
>
> The user process in my case is forked by another process which runs
> as root. But since this process does not have CAP_SETPCAP it cannot
> set the child's capabilities (which is how I naively thought one could
> implement this).
>
> What options are left? Running a patched kernel where the "SG_IO in st
> requires CAP_SYS_RAWIO" is taken out?
Erm, well capabilities are designed to be malleable, especially with
things like sucap and execap, which root should be able to use.
I'm not really an expert on the best way to use capabilites, but there's
a nice faq on kernel.org.
James
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: SG_IO permissions
2008-07-02 20:28 ` James Bottomley
@ 2008-07-03 9:15 ` Arne Wiebalck
2008-07-03 15:06 ` James Bottomley
0 siblings, 1 reply; 9+ messages in thread
From: Arne Wiebalck @ 2008-07-03 9:15 UTC (permalink / raw)
To: James Bottomley; +Cc: linux-scsi
On Wed, 2008-07-02 at 15:28 -0500, James Bottomley wrote:
> On Wed, 2008-07-02 at 20:40 +0200, Arne Wiebalck wrote:
> > >>> Hi all,
> > >>>
> > >>> I am trying to replace some read/write calls in our application
> > >>> by SG_IO commands in order to have access to the sense bytes in
> > >>> case of an error. The underlying devices are tape drives.
> > >>>
> > >>> Part of our application, such as positioning or reading labels
> > >>> from the tape, are run as root. This seems to work fine, I get
> > >>> the data I expect and the sense bytes in case of an error.
> > >>>
> > >>> However, the actual data transfer from and to the device is run
> > >>> under a user's ID. This part does not work anymore when switching
> > >>> from read/write to SG_IO: 'Operation not permitted'.
> > >>>
> > >>> Does a user need some special rights to issue SG_IO (read) commands
> > >>> (on a file descriptor that he opened for reading and that he
> > >>> can use without problems for read() calls)?
> > >>>
> > >>> The device node that the processes are accessing is a char special
> > >>> file owned by the user and with all user bits set. This special file
> > >>> is created on a per tape request basis. I also tried to use /dev/nst0
> > >>> instead, but that made no difference.
> > >>>
> > >>> I am running a relatively old kernel (2.6.9 based), could that cause
> > >>> any problem?
> > >>>
> > >>> BTW, why does it say "except st" on the permission requirements table on
> > >>> http://sg.torque.net/sg/sg_io.html ? :)
> > >>>
> > >>>
> > >>> Any hints appreciated.
> > >>
> > >>SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
> > >>
> > >
> > >Thanks for the quick reply, James.
> > >
> > >We're talking about this snippet of code from st.c, I guess?
> > >
> > >---
> > >switch (cmd_in) {
> > > case SCSI_IOCTL_GET_IDLUN:
> > > case SCSI_IOCTL_GET_BUS_NUMBER:
> > > break;
> > > default:
> > > if ((cmd_in == SG_IO ||
> > > cmd_in == SCSI_IOCTL_SEND_COMMAND ||
> > > cmd_in == CDROM_SEND_PACKET) &&
> > > !capable(CAP_SYS_RAWIO))
> > > i = -EPERM;
> > > else
> > > i = scsi_cmd_ioctl(file, STp->disk->queue,
> > > STp->disk, cmd_in, p);
> > > if (i != -ENOTTY)
> > > return i;
> > > break;
> > >}
> > >---
> > >
> > >Obviously. (I just found the discussion about this dating from
> > >April '05).
> > >
> > >What's the way to go then in order to access a tape as a user, when
> > >the user would like to get the sense bytes in case of problems?
> > >
> > >Should the user process get CAP_SYS_RAWIO?
> >
> > The user process in my case is forked by another process which runs
> > as root. But since this process does not have CAP_SETPCAP it cannot
> > set the child's capabilities (which is how I naively thought one could
> > implement this).
> >
> > What options are left? Running a patched kernel where the "SG_IO in st
> > requires CAP_SYS_RAWIO" is taken out?
>
> Erm, well capabilities are designed to be malleable, especially with
> things like sucap and execap, which root should be able to use.
But you need to change and recompile your kernel to use that, as init
needs CAP_SETPCAP to be set, no?
Cheers,
Arne
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: SG_IO permissions
2008-07-03 9:15 ` Arne Wiebalck
@ 2008-07-03 15:06 ` James Bottomley
0 siblings, 0 replies; 9+ messages in thread
From: James Bottomley @ 2008-07-03 15:06 UTC (permalink / raw)
To: Arne Wiebalck; +Cc: linux-scsi
On Thu, 2008-07-03 at 11:15 +0200, Arne Wiebalck wrote:
> > > >Should the user process get CAP_SYS_RAWIO?
> > >
> > > The user process in my case is forked by another process which runs
> > > as root. But since this process does not have CAP_SETPCAP it cannot
> > > set the child's capabilities (which is how I naively thought one could
> > > implement this).
> > >
> > > What options are left? Running a patched kernel where the "SG_IO in st
> > > requires CAP_SYS_RAWIO" is taken out?
> >
> > Erm, well capabilities are designed to be malleable, especially with
> > things like sucap and execap, which root should be able to use.
>
> But you need to change and recompile your kernel to use that, as init
> needs CAP_SETPCAP to be set, no?
Well .. how you do that isn't really a SCSI problem. The FAQ has one
solution. I suppose rebuilding your kernel is another possible but
inelegant one.
James
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SG_IO permissions
2008-07-02 18:40 ` Arne Wiebalck
2008-07-02 20:28 ` James Bottomley
@ 2008-07-03 17:57 ` KELEMEN Peter
2008-07-04 8:13 ` Arne Wiebalck
2 siblings, 0 replies; 9+ messages in thread
From: KELEMEN Peter @ 2008-07-03 17:57 UTC (permalink / raw)
To: linux-scsi
* Arne Wiebalck (arne.wiebalck@cern.ch) [20080702 20:40]:
> The user process in my case is forked by another process which
> runs as root. But since this process does not have CAP_SETPCAP
> it cannot set the child's capabilities (which is how I naively
> thought one could implement this).
There is no need. Your problem is that setuid() clears the
permissible capability set. This should do the trick:
/* ...in child after fork()... */
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
setuid(...);
cap_set_proc(cap_from_text("cap_sys_rawio+ep"));
HTH,
Peter
--
.+'''+. .+'''+. .+'''+. .+'''+. .+''
Kelemen Péter / \ / \ Peter.Kelemen@cern.ch
.+' `+...+' `+...+' `+...+' `+...+'
--
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] 9+ messages in thread
* RE: SG_IO permissions
2008-07-02 18:40 ` Arne Wiebalck
2008-07-02 20:28 ` James Bottomley
2008-07-03 17:57 ` KELEMEN Peter
@ 2008-07-04 8:13 ` Arne Wiebalck
2 siblings, 0 replies; 9+ messages in thread
From: Arne Wiebalck @ 2008-07-04 8:13 UTC (permalink / raw)
To: James Bottomley; +Cc: linux-scsi
On Wed, 2008-07-02 at 20:40 +0200, Arne Wiebalck wrote:
> >>> Hi all,
> >>>
> >>> I am trying to replace some read/write calls in our application
> >>> by SG_IO commands in order to have access to the sense bytes in
> >>> case of an error. The underlying devices are tape drives.
> >>>
> >>> Part of our application, such as positioning or reading labels
> >>> from the tape, are run as root. This seems to work fine, I get
> >>> the data I expect and the sense bytes in case of an error.
> >>>
> >>> However, the actual data transfer from and to the device is run
> >>> under a user's ID. This part does not work anymore when switching
> >>> from read/write to SG_IO: 'Operation not permitted'.
> >>>
> >>> Does a user need some special rights to issue SG_IO (read)
> commands
> >>> (on a file descriptor that he opened for reading and that he
> >>> can use without problems for read() calls)?
> >>>
> >>> The device node that the processes are accessing is a char special
> >>> file owned by the user and with all user bits set. This special
> file
> >>> is created on a per tape request basis. I also tried to
> use /dev/nst0
> >>> instead, but that made no difference.
> >>>
> >>> I am running a relatively old kernel (2.6.9 based), could that
> cause
> >>> any problem?
> >>>
> >>> BTW, why does it say "except st" on the permission requirements
> table on
> >>> http://sg.torque.net/sg/sg_io.html ? :)
> >>>
> >>>
> >>> Any hints appreciated.
> >>
> >>SG_IO access requires CAP_SYS_RAWIO to defeat the command verifier.
> >>
> >
> >Thanks for the quick reply, James.
> >
> >We're talking about this snippet of code from st.c, I guess?
> >
> >---
> >switch (cmd_in) {
> > case SCSI_IOCTL_GET_IDLUN:
> > case SCSI_IOCTL_GET_BUS_NUMBER:
> > break;
> > default:
> > if ((cmd_in == SG_IO ||
> > cmd_in == SCSI_IOCTL_SEND_COMMAND ||
> > cmd_in == CDROM_SEND_PACKET) &&
> > !capable(CAP_SYS_RAWIO))
> > i = -EPERM;
> > else
> > i = scsi_cmd_ioctl(file, STp->disk->queue,
> > STp->disk, cmd_in, p);
> > if (i != -ENOTTY)
> > return i;
> > break;
> >}
> >---
> >
> >Obviously. (I just found the discussion about this dating from
> >April '05).
> >
> >What's the way to go then in order to access a tape as a user, when
> >the user would like to get the sense bytes in case of problems?
> >
> >Should the user process get CAP_SYS_RAWIO?
>
> The user process in my case is forked by another process which runs
> as root. But since this process does not have CAP_SETPCAP it cannot
> set the child's capabilities (which is how I naively thought one could
> implement this).
Just to close this thread (and in case someone else comes across
a similar problem):
A solution that seems to work in this specific scenario is to use
prctl(2) before the setuid call to keep the capabilities in the
permitted set and to raise CAP_SYS_RAWIO afterwards using
cap_set_proc(3).
This way, the user process can again use SG_IO commands for st.
(Thanks to Peter Kelemen for suggesting that.)
Arne
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-07-04 8:13 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-02 13:20 SG_IO permissions Arne Wiebalck
2008-07-02 14:51 ` James Bottomley
2008-07-02 18:00 ` Arne Wiebalck
2008-07-02 18:40 ` Arne Wiebalck
2008-07-02 20:28 ` James Bottomley
2008-07-03 9:15 ` Arne Wiebalck
2008-07-03 15:06 ` James Bottomley
2008-07-03 17:57 ` KELEMEN Peter
2008-07-04 8:13 ` Arne Wiebalck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox