#!/bin/bash
# vim:expandtab:tabstop=4
#
# author:    chris friedhoff - chris@friedhoff.org
# version:   pcaps4suid0  3  Tue Mar 11 2008
#
#
# changelog:
# 1 - initial release suid02pcaps
# 2 - renamend to pcaps4suid0
#      implement idea of change between permitted/effective set
#      or iherited/effective set (pam_cap.so)
# 3 - changed 'attr -S -r' to 'setcap -r' and removed attr code
#
#
#
# change different suid-0 binaries away from suid-0 to using
# POSIX Capabilities through their Permitted and Effective Set
# --> legacy support
# --> use SET=pe
#
# 
# OR change different suid-0 binaries away from suid-0 to using
# POSIX Capabilities through their Inherited and Effective Set
# --> PAM support to set Inheritance set through pam_cap.so
# --> use SET=ie
#
# 
#
#
###############################################################
# for example use this find call:
# find {,/usr}{/bin,/sbin} -perm -4000 -uid 0 -exec ls -l {} \;
###############################################################



##HERE WE ADD APPS
##################

## these apps uses their POSIX Caps
###################################
# see /usr/include/linux/capability.h
#ping=cap_net_raw
ping=13
#traceroute=cap_net_raw
traceroute=13
chsh=0,2,4,7
chfn=0,2,4,7
Xorg=1,6,7,17,21,26
chage=2
#passwd=0,2,4,7
#passwd 0,1
passwd=0,1,3 #PAM
unix_chkpwd=1
mount=1,21
umount=1,21

# this apps were converted/reverted
###################################
APPSARRAY=( ping traceroute chsh chfn Xorg chage passwd unix_chkpwd mount umount )


# we put it into this set
#########################
#SET=pe
SET=ie


##FROM HERE ONLY LOGIC
######################

#save assumption!?
export PATH=/sbin:/bin:/usr/sbin:/usr/bin/:usr/local/sbin:/usr/local/bin

p4s_test(){
    # are we sane?
    WICH=`which which 2>/dev/null`
    if [ $WICH == "" ]; then
        # thats bad
        echo "Sorry, I haven't found which"
        exit
    fi

    # we needt his apps
    CHMOD=`which chmod 2>/dev/null`
    SETCAP=`which setcap 2>/dev/null`
    if [ "$CHMOD" == "" -o "$SETCAP" == "" ]; then
        echo "Sorry, I'm missing chmod or setcap !"
        exit
    fi

    # checking setcap for SET_SETFCAP PCap ?
    # for now we stick to root
    if [ "$( id -u )" != "0" ]; then
        echo "Sorry, you must be root !"
        exit 1
    fi
}



p4s_app_convert(){
    # convert a single app
    # $1 is app name; $2 is POSIX Caps
    # well symlinks to apps, so we use -a ...
    APP=`which -a $1 2>/dev/null`
    if [ "$APP" != "" ]; then
        FOUND=no
        for i in $APP; do
            # ... and are looking for symlinks
            if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
                echo "converting $i"
                chmod u-s $i
                setcap $2=$SET $i
                FOUND=yes
            fi
        done
        if [ "$FOUND" == "no" ]; then
            # 'which' found only symlinks
            echo "1 haven't found $1"
        fi
    else
        # 'which' hasn't anything given back
        echo "haven't found $1"
    fi
}



p4s_app_revert(){
    # revert a singel app
    # $1 is app name
    APP=`which -a $1 2>/dev/null`
    if [ "$APP" != "" ]; then
        FOUND=no
        for i in $APP; do
            if [ -f "$i" -a ! -L $i -a "$FOUND"=="no" ]; then
                echo "reverting $i"
                chmod u+s $i
                setcap -r $i 2>/dev/null
                FOUND=yes
            fi
        done
        if [ "$FOUND" == "no" ]; then
            echo "1 haven't found $1"
        fi
    else
        echo "haven't found $1"
    fi
}



p4s_convert(){
    # we go throug the APPSARRAY and call s2p_app_convert to do the job
    COUNTER=0
    let UPPER=${#APPSARRAY[*]}-1
    until [ $COUNTER == $UPPER ]; do
        p4s_app_convert ${APPSARRAY[$COUNTER]} ${!APPSARRAY[$COUNTER]}
        let COUNTER+=1
    done
}



p4s_revert(){
    COUNTER=0
    let UPPER=${#APPSARRAY[*]}-1
    until [ $COUNTER == $UPPER ]; do
        p4s_app_revert ${APPSARRAY[$COUNTER]}
        let COUNTER+=1
    done

}



p4s_usage(){
    echo
    echo "pcaps4suid0"
    echo
    echo "pcaps4suid0 changes the file system entry of binaries from using setuid-0"
    echo "to using POSIX Capabilities by granting the necessary Privileges"
    echo "This is done by storing the needed POSIX Capabilities into the extended"
    echo "attribute capability through setcap."
    echo "Following the idea of setuid - granting a binary the privilege regardless"
    echo "of the user, the POSIX Capabilities are stored into the Permitted and"
    echo "Effective set."
    echo "If you are using pam_cap.so, you might want to change the set into the"
    echo "Inherited and Effective set (check for the SET var)."
    echo
    echo "You need and I will check fot the utilities which, chmod and setcap."
    echo
    echo "Your Filesystem has to support extended attributes and your kernel must have"
    echo "support for POSIX File Capabilities (CONFIG_SECURITY_FILE_CAPABILITIES)."
    echo
    echo "Usage:  pcaps4suid0 [con(vert)|rev(ert)|help]"
    echo
    echo "         con|convert - from setuid0 to POSIX Capabilities"
    echo "         rev|revert  - from POSIX Capabilities back to setui0"
    echo "         help        - this help message"
    echo
}



case "$1" in
    con|convert)
        p4s_test
        p4s_convert
        exit 0
        ;;
    rev|revert)
        p4s_test
        p4s_revert
        exit 0
        ;;
    help)
        p4s_usage
        exit 0
        ;;
    *)
        echo "Try 'pcaps4suid0 help' for more information"
        exit 1
        ;;
esac
