how to make an executable run as another user

Matthew Seaman m.seaman at infracaninophile.co.uk
Sat Sep 18 04:31:59 PDT 2004


On Fri, Sep 17, 2004 at 04:53:31PM -0400, mailing lists at MacTutor wrote:

> QUOTE: "In most UNIX kernels there exists what is called a 'race  
> condition' when executing scripts. Scripts are pieces of code which are  
> interpreted by, strangely enough, interpreters. Common examples of  
> interpreters are perl, sed, and awk. So when you have in your perl code  
> #!/usr/local/bin/perl it tells the operating system to start executing  
> the perl interpreter with the current script as input. Between the time  
> that the perl interpreter starts executing and the time that it reads  
> in your script the 'race condition' exists. At this time, a mischievous  
> person could 'win the race' and be able to replace your script with  
> another. And if your script is running as setuid, that person's script  
> would run as your user! So their script could do anything that you  
> could do from the command line. As a result, most UNIX kernels will  
> disable users from running scripts as setuid. The most common way  
> around this is to create a wrapper program around your script. A  
> wrapper, in this context, is a small program, possibly written in C,  
> that when executed will simply run your script. The 'race condition'  
> does not exist for real executables and so you won't be thwarted by the  
> kernel itself."

Actually, this should no longer be a problem in any up to date version
of Unix.  The race condition between the kernel reading the script to
find what interpreter to invoke, and the interpreter then to read and
interpret the script was solved by having the kernel pass an open
filedescriptor on the script file to the interpreter.  One way of
testing if your OS supports this is the presence of 'file descriptor'
devices under /dev -- eg. under FreeBSD you get:

    happy-idiot-talk:/usr/local/etc:% ls -la /dev/fd/*
    crw-rw-rw-  1 root  wheel   22,   0 Jul  5 17:08 /dev/fd/0
    crw-rw-rw-  1 root  wheel   22,   1 Jul  5 17:08 /dev/fd/1
    crw-rw-rw-  1 root  wheel   22,   2 Jul  5 17:08 /dev/fd/2
    crw-rw-rw-  1 root  wheel   22,   3 Jul  5 17:08 /dev/fd/3
    crw-rw-rw-  1 root  wheel   22,   4 Jul  5 17:08 /dev/fd/4
    crw-rw-rw-  1 root  wheel   22,   5 Jul  5 17:08 /dev/fd/5
    crw-rw-rw-  1 root  wheel   22,   6 Jul  5 17:08 /dev/fd/6
    crw-rw-rw-  1 root  wheel   22,   7 Jul  5 17:08 /dev/fd/7
    crw-rw-rw-  1 root  wheel   22,   8 Jul  5 17:08 /dev/fd/8
    crw-rw-rw-  1 root  wheel   22,   9 Jul  5 17:08 /dev/fd/9
    [...]

However, the horror has been so beaten into the collective unconscious
inherited from earlier days of Unix that shell scripts are still
automatically stripped of any setuid or setgid bits by default on most
Unix variants.  I did see a setuid 'lp' script as a standard part of
the lp system on a Solaris 8 box once -- took me a long time to
convince myself it was actually safe.

	Cheers,

	Matthew

-- 
Dr Matthew J Seaman MA, D.Phil.                       26 The Paddocks
                                                      Savill Way
PGP: http://www.infracaninophile.co.uk/pgpkey         Marlow
Tel: +44 1628 476614                                  Bucks., SL7 1TH UK
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-questions/attachments/20040918/62997c4f/attachment.bin


More information about the freebsd-questions mailing list