Subject: Re: weird setuid behavior
To: David Laight <david@l8s.co.uk>
From: Greg A. Woods <woods@weird.com>
List: tech-kern
Date: 01/26/2004 03:23:44
[ On Sunday, January 25, 2004 at 20:47:48 (+0000), David Laight wrote: ]
> Subject: Re: weird setuid behavior
>
> you now try to call setuid(100), the man page clearly states:
>
> The setuid() function is permitted if the specified ID is equal to the
> real user ID of the process, or if the effective user ID is that of the
> super user.
>
> So the request fails.
However POISX 2001 says the following about setuid():
If the process does not have appropriate privileges, but uid is
equal to the real user ID or the saved set-user-ID, setuid() shall
set the effective user ID to uid; the real user ID and saved
set-user-ID shall remain unchanged.
and so in the one case Niels hinted at (in his first reply to me),
namely when the state is:
real_uid = 100, effective_uid = 100, saved_uid = 0
i.e. the program is set-user-ID to zero and seteuid(100) has been
called, then a further call to setuid(100) _should_ succeed since the
real_uid is still 100, but in my experiments it doesn't succeed even
though getruid() confirms the value of real_uid.
(of course in my experiments I had to use a set-user-ID:1 binary and
thus had a saved_uid==1, since on my machines if euid==0 then both
setuid(100) and seteuid(100) change all three credentials to 100 right
away and there's no going back :-)
That reminds me: I keep meaning to implement getsuid() so that a
process can examine its own saved_uid....
--
Greg A. Woods
+1 416 218-0098 VE3TCP RoboHack <woods@robohack.ca>
Planix, Inc. <woods@planix.com> Secrets of the Weird <woods@weird.com>