
ADDED: * Convenience functions to determine if a process is running in an elevated/dropped privileges context
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package sysutils
|
|
|
|
import (
|
|
`fmt`
|
|
`os`
|
|
|
|
`golang.org/x/sys/unix`
|
|
`r00t2.io/sysutils/envs`
|
|
)
|
|
|
|
// GetIDState returns current ID/elevation information. An IDState should *not* be explicitly created/defined.
|
|
func GetIDState() (ids IDState) {
|
|
|
|
var err error
|
|
|
|
ids.RUID, ids.EUID, ids.SUID = unix.Getresuid()
|
|
ids.uidsChecked = true
|
|
ids.RGID, ids.EGID, ids.SGID = unix.Getresgid()
|
|
ids.gidsChecked = true
|
|
|
|
ids.SudoEnvCmd = envs.HasEnv("SUDO_COMMAND")
|
|
ids.SudoEnvHome = envs.HasEnv("SUDO_HOME")
|
|
ids.SudoEnvGroup = envs.HasEnv("SUDO_GID")
|
|
ids.SudoEnvUser = envs.HasEnv("SUDO_UID") || envs.HasEnv("SUDO_USER")
|
|
if ids.SudoEnvCmd || ids.SudoEnvHome || ids.SudoEnvGroup || ids.SudoEnvUser {
|
|
ids.SudoEnvVars = true
|
|
}
|
|
ids.sudoChecked = true
|
|
|
|
// PID 1 will *always* be root, so that can return a false positive for sudo.
|
|
if os.Getppid() != 1 {
|
|
ids.stat = new(unix.Stat_t)
|
|
if err = unix.Stat(
|
|
fmt.Sprintf("/proc/%d/stat", os.Getppid()),
|
|
ids.stat,
|
|
); err != nil {
|
|
err = nil
|
|
} else {
|
|
ids.PPIDUidMatch = ids.RUID == int(ids.stat.Uid)
|
|
ids.ppidUidChecked = true
|
|
ids.PPIDGidMatch = ids.RGID == int(ids.stat.Gid)
|
|
ids.ppidGidChecked = true
|
|
}
|
|
} else {
|
|
ids.ppidUidChecked = true
|
|
ids.ppidGidChecked = true
|
|
}
|
|
|
|
return
|
|
}
|