[net.games.emp] killing runaway suid empires

dudek (09/28/82)

   It has not proven practical to set up a grecial group
here for maintaining the empire game (sorry - empire world). As
a result, I have had to install the game set user-id and make the files
700 mode.  As a result of this, people who gets ranaway empire processes
are unable to kill them themselves (this seems to happen when a plane
crashes, for one).
   In order to help people kill these processes, I've set up a program
to allow people to kill empire processes themselves. Naturally, 
this program is set user-id.  In case anybody else has had this 
problem, I am enclosing the program source.  The main program must
be set user-id, and I suggest the rest be unreadable to avoid
attempts at nastiness. It works my making sure
that the parent process-id is the same as the user-id of the person who
is doing the kill, or the praent is init (in case the user logged off
in desperation, and the parent is thus non-existent).  I know it's
messy, but at least it gets the job done. 
		Greg Dudek

-----empkill.c  this is what you run --- make it 6755 mode -------
main(argc, argv)
char **argv;
{
            execl("/bin/sh","/bin/sh","/usr/src/games/psl/EMP/empkill.sh",argv[1],0);
           write(2, "Can't run\n", 10);
           exit();
 }



----empkill.sh ---- this is the shell file to do the work --------
if test x$1 = x
	then
	echo "Usage: empkill empire-process-id"
	echo "You must be the real owner."
	exit
	fi

: 'This is the directory for temp files. It should NOT be generally'
: 'writable or nastly people may try replacing the file while'
: 'empkill is running to kill others empires
empf=/usr/src/games/psl/EMP

: 'Cleanup if the user hits a interrupt, etc.'
trap "/bin/rm -f $empf/kill$$ $empf/killid$$ $empf/dokill$$" 1 2 3
echo "This is slow" : 'a "ps -lax" is necessary'

: 'Get the data on parents, etc.'
/bin/ps lax > $empf/kill$$

: 'The line beginning with "setup" has the real user-id of the invoker on it'
: 'in the format: "setup process-id-to-kill invoking-user-id'
/bin/echo "setup: $1 `/u2/dudek/bin/uid`" > $empf/killid$$

: 'The awk script will print the actions to be taken, if it'
: ' validates the user.  i.e. it emits somewhing like "kill -9 32456"'
/bin/awk -f $empf/empkill.awk $empf/killid$$ $empf/kill$$ $empf/kill$$ > $empf/dokill$$
/bin/sh $empf/dokill$$

/bin/rm -f $empf/kill$$ $empf/killid$$ $empf/dokill$$


------empkill.awk --- this awk script is the workhorse
------fix the log file to be whatever you like: near the end.
BEGIN {  parent=999; PID=3; PPID=4; UID=2 }

# base awk script for empkill program.
# the line starting with "setup" has the target process-id
# and the invoking user-id on it.
/^setup:/ { killeeid = $2;
			killeruid = $3;
			print "/bin/echo process is ", killeeid," user is ",killeruid
			if (killeruid == "") exit
			print "/bin/echo Kill empire process ",killeeid
			print "/bin/echo this takes about 200 sec. -sleep time."
			}

# lines beginning with numbers are data lines from the "ps"
# they have the format: number EFFECT-UID PROC-ID PARENT-PROC-ID more stuff"
# This scan should match the file on the first run through.
# It gets the parent process-id to be used in next match.
/[09]/ {  # process entry - find parent process id.
		  # if parent is 1 (init), parent is dead. Allow kill.
          if ( killeeid == $PID ) {
			parent = $PPID
			if (parent == 1)
				killeruid = 0
				}
			}

# This pattern again matches data lines from the "ps".
# It may do nothing on the first pass through the file since the
# parent entry, set above, must be found first, and it usually appears
# before the actual process.
/[09]/ {  # on second pass, if parent was right user, kill the process
		  if ( parent == $PID )
			if ( $UID == killeruid ) {
				printf "/bin/kill -3 %d;/usr/bin/sleep 30;/bin/kill -1 %d;/usr/bin/sleep 30;/bin/kill -9 %d\n",killeeid,killeeid,killeeid
				}
		  if ( parent == $PID )
			if ( $UID != killeruid ) { 
     # THE FOLLOWING FILE NAME IS A SYSTEM
	 # DEPENDENT PARAMETER !!!!!
				printf "/bin/echo Bad kill on %d by %d >> /scr/ekills",killeeid,killeruid
				print "/bin/echo Bad Kill: Usage is empkill processid"
				}
			}

-----------end of empkill sources.