Provided by: super_3.30.1-1_amd64 bug

NAME

       super - execute commands setuid root.

SYNOPSIS

       To execute a command:
            super [ -r reqpath] command [ args ]
            super [ -r reqpath] -o path [ args ]
            command [ args ]

       To list available commands:
            super [-H|-f] [-S]

       For usage and/or version information:
            super [-h] [-V]

       For debugging and development:
            super -b
            super -c [ superfile ]
            super [-d|-D|-t] [-S] [MasqOptions] [-H|-f|command...]

            MasqOptions:
                     -F file
                     -T hh:mm/dayname
                     -G gid
                     -U uid
                     -M mach

DESCRIPTION

       Super  allows  specified users to execute scripts (or other commands) as if they were root; or it can set
       the uid, gid, and/or supplementary groups on a per-command basis before executing  the  command.   It  is
       intended  to  be a secure alternative to making scripts setuid root.  Super also allows ordinary users to
       supply commands for execution by others; these execute with the uid, gid, and groups of the user offering
       the command.

       Super  consults  a ``super.tab'' file to see if the user is allowed to execute the requested command.  If
       permission is granted, super will exec pgm [ args ], where pgm is the program  that  is  associated  with
       this  command.   (Root  is allowed execution by default, but can still be denied if a rule excludes root.
       Ordinary users are disallowed execution by default.)

       The most common sort of entry in a super.tab file pairs a simple command with a pgm path.  But  in  fact,
       the  command  in  the  super.tab file is actually treated as a pattern, and any user-entered command that
       matches this pattern causes the associated pgm to be executed.  If the listed pgm contains  an  asterisk,
       then  the  asterisk  is  replaced  with  the  command entered by the user.  One use of this is to let any
       program in a certain directory be executed by a user.  For example, if the entry contains the command/pgm
       pairs
            CommandPattern      Program
            scripts/*          /usr/local/super/*
               *               /usr/local/somedir/*
       then the translations made are
            User's Command      Executed Program
            scripts/xyz        /usr/local/super/scripts/xyz
            xyz                /usr/local/somedir/xyz

       Some  commands can only be run after the user enters his or her password.  These commands can then be run
       multiple times until some expiration time, at which point the password needs to be re-entered.  The  list
       of password-requiring commands and the password durations are set in the same file that records the valid
       users for each command.

       If command is a symbolic link (or hard link, too) to the super program, then typing
            % command args
       is equivalent to typing
            % super command args
       (The command must not be super, or super will not recognize that it's being invoked via a link.)

       Super without any arguments will display the list of commands that may be executed by the user.

       For security, the following precautions are taken before exec'ing:

       (a)    all descriptors save 0,1,2 are closed;

       (b)    all of the user's environment variables are discarded, save for TERM, LINES, and COLUMNS.  If TERM
              contains  any  characters  other  than  {-/:+._a-zA-Z0-9},  it  is discarded.  If LINES or COLUMNS
              contains any characters other than [0-9], it is discarded.  To these are added  reasonable  values
              for:

              USER and LOGNAME: both are set to the username associated with the real uid of the program running
                     under super;

              HOME: set to the login directory of the user running super;

              ORIG_USER, ORIG_LOGNAME, ORIG_HOME: the values of USER, LOGNAME, and HOME that refer to  the  user
                     who  invoked super.  (These values are computed by super, and are not the values set by the
                     caller, so they are a reliable description of the caller.   These  are  normally  the  same
                     values as USER, LOGNAME, and HOME, but they will differ if the super command changes uid or
                     gid before executing the program.);

              IFS: set to blank, tab, newline;

              PATH: set to /bin:/usr/bin.

              SUPERCMD: set to command.

              additional environment variables as specified in the super.tab file (see below).

       (c)    all signal handling is reset to the default.

       If Super is executed without arguments, it will print the commands that the user may execute, one command
       per line.  Super -H prints a long-winded description of each command that the user may execute.
       The  CmdPat  is  the command pattern, and FullPath is the full path that will be executed.  The super.tab
       file can specify initial arguments that that precede any user-supplied  arguments;  these  arguments,  if
       any, are printed after the FullPath column.

User-Defined Super.tab Files

       Ordinary  users  can  supply  their  own super files.  This lets users give well-controlled setuid/setgid
       access to their programs: the user who offers the program gets the assurance of safe IFS  settings,  safe
       environment  variable  settings,  etc;  and  the user who executes the program knows that it will execute
       under the uid and gid of the offering user.  If a command is entered in the form
              super loginname:cmd
       super looks for cmd in the file .supertab, in the home directory of account loginname.  The cmd  will  be
       executed using the uid, gid, and supplementary groups (if any) of user loginname.

       The  usual  super  options  (such  as  -H)  can be applied to a user's .supertab file.  For example, help
       information about one command can be had by using:
            super -H loginname:cmd
       Likewise, help information about all of loginname's commands can be obtained with:
            super -H loginname:

       Links to per-user commands can be created and used in a  manner  similar  to  making  symlinks  to  super
       itself.  If command is a symbolic link to a user's .supertab file, and that .supertab file is

              (a)  executable, and

              (b)  begins with
                     #! /path/to/super -o

       then the following pair are completely equivalent:
              % super loginname:command
              % command
       If  the  #!-line  would be longer than the typical Unix limit of 32 characters, you can instead start the
       .supertab file with:
              #! /bin/sh
              # Keep this backslash -> \
                   exec /long/path/to/the/super/executable -o $0 ${1+"$@"}
       (The above takes advantage of the fact that super allows comments  to  be  backslash-continued,  but  the
       shell doesn't.)

       Per-user  .supertab linking works as follows: if /path/to/xyz is a symlink to some user's .supertab file,
       and the .supertab file begins with #! /path/to/super -o, then the shell will invoke super with  arguments
       something like
              super -o /path/to/xyz [args]
       Super checks that /path/to/xyz is a link to a real .supertab file, and then always turns the last part of
       the path (here xyz) into the command to execute.

                                                ** Security Warning **
       Note that if you use symlinks to a per-user .supertab file, then you must trust that the  .supertab  file
       will  actually  execute  a super command, instead of doing something nasty.  That is because super itself
       isn't invoked until the shell has opened the .supertab file and done whatever the .supertab file tells it
       to  do.   By contrast, the direct command super loginname:cmd doesn't involve any shell processing of the
       .supertab file.

REGULAR OPTIONS

       -V     Print the super version number.

       -S     When super prompts for a password, this forces  it  to  prompt  on  stdin,  even  if  the  default
              (/dev/tty)  is  readable  and writable.  Note: This only applies to password-type authentication —
              that is, the older type of authentication wherein super  itself  prompts  for  the  password;  PAM
              authentication is handled by your system's PAM modules.

       -f     This  requests  a  list  of available commands in a terse format useful for processing by scripts.
              (-f stands for facts, as in ``just the facts, m'am'').

       -rreqpath
              Tells super to generate an error if the program associated with this command is not reqpath.  This
              helps  you write scripts that ensure that super only executes what they expect it to execute.  See
              step 4 of the section, ``Creating Super Scripts'', for an example of its use.

       -H     Causes super to print a verbose listing of the commands available to the user.  It prints both the
              command and its translation to a program pgm.  If the displayed pgm contains an asterisk, then the
              actual program executed is formed by replacing the asterisk with the command entered by the  user.
              The following examples show the kinds of lines that may be displayed with the -H option:

              Example 1.
                   super skill/usr/local/bin/skill

              Typing super skill will execute /usr/local/bin/skill.

              Example 2.
                   super {lp*}/usr/bin/*

              This  example  contains asterisks on both the left and right sides.  The left side shows the valid
              pattern you must match to execute the command shown on the right-hand side.  Usually,  the  right-
              hand  side  has  no  asterisk,  just a full path to a command to execute.  If there is an asterisk
              present, it is replaced by the command you entered, thereby forming the actual  executed  command.
              Thus, if you type super lpxxx (where xxx is any string), super will execute /usr/bin/lpxxx.

              Example 3.
                   super {co*}/usr/bin/compress

              The  asterisk on the left-hand side means you can enter super coxxx (where xxx is any string), but
              since  the  right-hand  side  doesn't   contain   an   asterisk,   coxxx   will   always   execute
              /usr/bin/compress.

       -t     This  enables  ``test''  mode.   It  does  all normal checks except for those requiring user input
              (passwords and variables that the user must enter), but doesn't execute any command.  Instead,  it
              exits with status code 0 if the command is ok to execute, else 1.  All normal error message output
              is generated in the usual way, but no special debug messages are generated.  Thus, it is a  useful
              means  for  a  script to check if a command is likely to work, and hence reasonable to exec super.
              Let's say that a script /usr/local/bin/foo wants to invoke itself using super foo (See the section
              ``Creating  Super  Scripts'' for how to avoid infinite loops when doing this!)  the script can use
              the -r option to ensure that super foo refers to the correct file, and it can  use  test  mode  to
              ensure that super foo is a valid command:
                   prog=`basename $0`
                   /usr/local/bin/super -t -r $0 $prog
                   case $? in
                   0 ) exec /usr/local/bin/super -t -r $0 $prog ;;
                   * ) echo "Super $prog doesn't work!"
                       ... So take appropriate action ...
                       ;;
                   esac

DEBUG AND DEVELOPMENT OPTIONS

       These  options  are  useful when creating and debugging super.tab files.  They have little or no value to
       the everyday user.  With the exception of the -b option, they can be combined with the  regular  options,
       above.

       -b     Print  the  names and values of built-in variables, then exit.  Useful for administrators to learn
              the values against which builtin variables can be tested.

       -c[superfile]
              Tells super to check the syntax of the entries in the superfile, but not to execute  any  command.
              If  no  superfile  is  given,  the regular super.tab is checked.  The exit code is 0 if the file's
              syntax is ok; otherwise the exit code is 1 (and an error message is printed).  After  modifying  a
              super file, you should use this option to check its integrity.

              Note  that  super -c isn't a complete check that you've correctly set up an entry, because you can
              create syntactically valid entries that don't do exactly what you  want.   Therefore,  you  should
              also  use  super  -d  cmd  to  make sure that the command you've entered will be executed with the
              correct arguments, uid, gid, umask, and so on.

       -d     This enables debug mode, in which case (a) debugging information is printed while checking a  user
              for  validity, and (b) the command isn't actually executed.  Useful to check if a new entry in the
              super.tab file (see below) has been handled properly.

       -D     Same as -d, plus prints more information about variables defined in the super.tab file.

       -Fsuperfile
              This option is only used for debugging, and lets you test a superfile before  installing  it.   No
              command  will actually be executed.  It also turns on a non-verbose debugging, showing the matched
              command names and reasons for accepting or rejecting the command.

       -Ggid  This option is also used for debugging, and tells super to act  as  if  the  caller's  groupid  or
              groupname was gid.  It carries the same restrictions and debug info as the -F option.

       -Uuid  This  option is also used for debugging, and tells super to act as if the caller's uid or username
              was uid.  It carries the same restrictions and debug info as the -F option.

       -Mmach This option is also used for debugging, and tells super to act as if the caller's  host  (machine)
              was mach.  It carries the same restrictions and debug info as the -F option.

       -Thh:mm/dayname
              This  option  is  also  used  for  debugging,  and  tells super to act as if the execution time is
              hh:mm/dayname.  This lets you check if a time specification in  the  super.tab  file  is  properly
              restricting execution.  It carries the same restrictions and debug info as the -F option.

FILES

       /etc/super.tab
              contains  the  list  of  commands  that  super may execute, along with the names of the user/group
              combinations who may execute each command.  The valid-user line can  restrict  use  to  particular
              users or groups on different hosts, so a single super.tab file can be used across a network.

       /run/superstamps/username
              is used as a timestamp for the last time that the user entered his or her password.

CREATING SUPER SCRIPTS

       You  must  be  exceedingly  careful  when  writing  scripts  for super.  A surprising variety of ordinary
       commands can, when run setuid-root, be exploited for nasty purposes.  Always  make  your  scripts  do  as
       little as possible, and give the user as few options as possible.

       Think  twice  about  side-effects  and  alternative  uses of these scripts.  For instance, make sure your
       script doesn't quietly invoke the user's .cshrc or similar file.  Or, you might write a script  to  allow
       users to mount cd-rom's by executing mount(8).  But if you don't write it carefully, a user could mount a
       floppy disk containing, say, a setuid-root shell.

       Security issues aside, here are some hints on creating super scripts:

       1.     Scripts must begin with #! interpreter-path.

       2.     Some variants of csh will not run setuid scripts unless the -b flag (force a "break"  from  option
              processing) is set:
                   #!/bin/csh -fb
              Similarly,  if your super.tab file starts a shell such as csh or tcsh, you may want to include the
              -b option in the super.tab file, so that you don't have to remember to type it on the command line
              every time; use a line like the following in the super.tab file:
                   SHELL  "/usr/bin/csh -fb"  some_priv_user
              N.B.  This is by way of example only; it's not a very good idea to really let somebody become root
              without any password check.

       3.     Better still, avoid csh scripts entirely -- they are harder  to  write  safely  than  Bourne-shell
              scripts.

       4.     It's nice to make the super call transparent to users, so that they can type
                   % cdmount args
              instead of
                   % super cdmount args
              You can make a script super itself by beginning the script in the following way:
                   #!/bin/sh
                   prog=`basename $0`
                   test "X$SUPERCMD" = "X$prog" ||
                                       exec /usr/local/bin/super -r $0 $prog ${1+"$@"}
              Here,  the  path that is exec'd should be replaced with the path at your site that leads to super.
              The option -r$0 is a sanity-check option: it tells super that it's an  error  if  ``super  $prog''
              doesn't  execute ``$0'', ie this self-same program.  (Also, see the -t option for how a script can
              check that super $prog will work before doing an exec super.)

       5.     Some programs need certain  directories  in  the  path.   Your  super  scripts  may  have  to  add
              directories  like  /etc or /usr/etc to make commands work.  For instance, SunOS 4.1 needs /usr/etc
              in the path before it can mount filesystems of type ``hsfs''.

       6.     By default, super only changes the effective uid.  Some programs (e.g. exportfs under SunOS 4.1.x)
              require  the  real  uid  to  be root.  In that case, you should put an option like ``uid=root'' or
              ``u+g=root'' into the super.tab file.

SEE ALSO

       super.tab(5).

AUTHOR

       Will Deich
       will@ucolick.org

NOTES

       If the super.tab file isn't owned by root, or if it is group- or world-writable, super won't run  setuid-
       root.   (If  the user's real uid is root, super won't run at all; otherwise, the effective uid reverts to
       real uid.)

       There is a race condition when using password-requiring commands, but it doesn't affect  security:  if  a
       user  is running two copies of super simultaneously, and both processes try to update the user's password
       timestamp file at the same time, then it is possible for one of the super commands to fail.   Workaround:
       a single user shouldn't execute two password-requiring super programs simultaneously.

                                                      local                                             SUPER(1)