/
usr
/
sbin
/
/usr/sbin
mkdir
upload
Name
Size
Mode
Actions
cagefsctl-user
15925
0755
edit
dl
rm
cagefs_enter_site
1877
0755
edit
dl
rm
chroot
40504
0755
edit
dl
rm
cloudlinux-selector
654
0755
edit
dl
rm
consoletype
15488
0755
edit
dl
rm
cracklib-check
15472
0755
edit
dl
rm
cracklib-format
255
0755
edit
dl
rm
cracklib-packer
15472
0755
edit
dl
rm
cracklib-unpacker
15464
0755
edit
dl
rm
create-cracklib-dict
994
0755
edit
dl
rm
ddns-confgen
27912
0755
edit
dl
rm
exim
6013
0755
edit
dl
rm
faillock
23736
0755
edit
dl
rm
ip
792904
0755
edit
dl
rm
isolatectl
11435
0755
edit
dl
rm
ldconfig
1176464
0755
edit
dl
rm
lvdctl
683
0755
edit
dl
rm
mkhomedir_helper
23768
0755
edit
dl
rm
named-checkzone
40288
0755
edit
dl
rm
named-compilezone
40288
0755
edit
dl
rm
named-nzd2nzf
15480
0755
edit
dl
rm
nsec3hash
15560
0755
edit
dl
rm
pam_console_apply
44552
0755
edit
dl
rm
pam_namespace_helper
471
0755
edit
dl
rm
pam_timestamp_check
15496
0755
edit
dl
rm
pluginviewer
19856
0755
edit
dl
rm
proxyexec
24584
0555
edit
dl
rm
pwhistory_helper
19656
0755
edit
dl
rm
saslauthd
90448
0755
edit
dl
rm
sasldblistusers2
15640
0755
edit
dl
rm
saslpasswd2
15608
0755
edit
dl
rm
sendmail
6021
0755
edit
dl
rm
snmpd
36064
0755
edit
dl
rm
snmptrapd
36176
0755
edit
dl
rm
testsaslauthd
15528
0755
edit
dl
rm
tmpwatch
36896
0755
edit
dl
rm
tsig-keygen
27912
0755
edit
dl
rm
unix_chkpwd
23848
0755
edit
dl
rm
unix_update
32080
0700
edit
dl
rm
Edit:
/usr/sbin/sendmail
(6021B)
#!/usr/bin/bash ##CageFS proxyexec wrapper - ver 18 if [[ $EUID -eq 0 ]]; then echo 'Cannot be run as root' exit 1 fi # POSIX single-quote escaping for values embedded in the ssh remote # command. Unlike `printf %q`, single-quoted output re-parses correctly # under any POSIX shell (the origin login shell need not be bash) and is # lossless for arbitrary bytes. Each embedded ' becomes the '\'' sequence. sq() { local s=${1//\'/\'\\\'\'} printf "'%s'" "$s" } USR=`/usr/bin/whoami` USER_TOKEN_PATH="/var/.cagefs/.cagefs.token" WEBSITE_ISOLATION_FLAG="/opt/cloudlinux/flags/enabled-flags.d/website-isolation.flag" # Trust boundary for the website-isolation token path: it must point # directly at the regular file that create_website_token_directory() # creates inside its root-owned per-user storage area. That area is # /var/cagefs/<prefix>/<user>/.cagefs/website/... on the host and is # bind-mounted into the cage at /var/.cagefs/website/... — both views # are accepted because libenter.enter_site() picks one or the other # depending on whether it runs inside or outside the cage. The file # itself is never a symlink, so we reject symlinks outright rather # than canonicalizing with realpath. Without this gate the attacker # controls both the env var WEBSITE_TOKEN_PATH and the file contents # at that path; the file contents land in $TOKEN, which is embedded # into the ssh remote command argv below and re-parsed by the remote # shell — so shell metacharacters in the file would execute on the # origin host. (Slite #7 / CLOS-4490) if [[ -f "$WEBSITE_ISOLATION_FLAG" && -n "$WEBSITE_TOKEN_PATH" ]]; then if [[ -L "$WEBSITE_TOKEN_PATH" ]]; then echo "cagefs.proxy: WEBSITE_TOKEN_PATH '$WEBSITE_TOKEN_PATH' must not be a symlink" >&2 exit 1 fi if [[ ! -f "$WEBSITE_TOKEN_PATH" ]]; then echo "cagefs.proxy: WEBSITE_TOKEN_PATH '$WEBSITE_TOKEN_PATH' is not an existing regular file" >&2 exit 1 fi # Reject `..` as a path component so the prefix check below cannot # be bypassed via traversal (e.g. /var/cagefs/../etc/passwd matches # the /var/cagefs/* glob but resolves outside the trusted area). case "$WEBSITE_TOKEN_PATH" in */../*|*/..) echo "cagefs.proxy: WEBSITE_TOKEN_PATH '$WEBSITE_TOKEN_PATH' must not contain '..' path components" >&2 exit 1 ;; esac case "$WEBSITE_TOKEN_PATH" in /var/cagefs/*|/var/.cagefs/*) ;; *) echo "cagefs.proxy: WEBSITE_TOKEN_PATH must be under /var/cagefs/ or /var/.cagefs/ (got '$WEBSITE_TOKEN_PATH')" >&2 exit 1 ;; esac USER_TOKEN_PATH="$WEBSITE_TOKEN_PATH" fi # The -L/-f/prefix gate above is defense-in-depth, TOCTOU is not exploitable because the # forwarded $TOKEN must still equal the legit on-disk bytes that the # origin's cagefs.server reads with open(..., O_NOFOLLOW) from a # uid-derived path (see find_website_by_token() in # proxyexec/cagefs.server.c) — a swapped symlink redirects what we # cat, never what the server reads, so a TOCTOU substitution can only # replace the forwarded bytes with something that fails the server's # constant-time comparison. TOKEN=`/bin/cat ${USER_TOKEN_PATH}` # Tokens are generated as fixed-length alphanumerics by # _generate_password() in py/clcagefslib/webisolation/jail_utils.py and # by the corresponding C helper. Any non-alphanumeric byte means the # token file was tampered with — refuse to forward it into the ssh # remote command, where the remote shell would re-parse metacharacters. # Use POSIX `case` rather than `[[ =~ ]]` because the wrapper is also # invoked through `sh` (e.g. jenkins_tests/rpm_tests/p_cagefs/ # 939-environment_var-check.sh), and dash treats `[[` as a missing # command — the regex form would falsely trip and exit the script. case "$TOKEN" in "" | *[!A-Za-z0-9]*) echo "cagefs.proxy: refusing to forward malformed token from $USER_TOKEN_PATH" >&2 exit 1 ;; esac # It's user's tmp directory and write to it is secure procedure # because this script is running only under usual user PIDFILE="/tmp/.cagefs.proxy.$$" USER_INTERRUPT=13 CWD=`pwd` ctrl_c_handler() { if [[ -f "$PIDFILE" ]]; then pid=`/bin/cat $PIDFILE` /bin/rm -f $PIDFILE > /dev/null 2>&1 /bin/kill -s SIGINT "$pid" > /dev/null 2>&1 fi exit $USER_INTERRUPT } if [[ -e /var/.cagefs/origin ]]; then ORIGIN=`/bin/cat /var/.cagefs/origin` # ssh(1) joins the remote-command argv with single spaces and ships # the result for the origin user's login shell to re-parse. The local # bash double-quotes around "$CWD" and "$@" only protect parsing on # THIS host — once ssh has taken the argv, the quoting is gone and # any shell metacharacter embedded in $CWD (`pwd`, attacker controls # via mkdir+cd inside the cage) or in any "$@" element (caller argv # for sendmail/crontab/etc.) is interpreted by the remote shell. # CLOS-4490 hardened $TOKEN by content validation; that approach # does not work for $CWD or $@ (legitimate paths/args may contain # spaces, parens, ampersands), so we single-quote each caller- # controlled element with sq() before composing the remote command. # ssh re-parses the command only once (the origin login shell), so a # single quoting pass per value is enough here. $USR is `whoami` so # it cannot contain metacharacters in any sane account database, but # we quote it too for defense in depth. (CLOS-4596) Q_ARGS= for _arg in "$@"; do Q_ARGS="$Q_ARGS $(sq "$_arg")" done /usr/bin/ssh -F /etc/ssh/cagefs-rexec_config "$USR@$ORIGIN" \ "CAGEFS_TOKEN=$TOKEN /usr/sbin/proxyexec -c cagefs.sock $(sq "$USR") $(sq "$CWD") SENDMAIL $$$Q_ARGS" RETVAL=$? else trap 'ctrl_c_handler' 2 CAGEFS_TOKEN="$TOKEN" /usr/sbin/proxyexec -c cagefs.sock "$USR" "$CWD" SENDMAIL $$ "$@" RETVAL=$? /bin/rm -f $PIDFILE > /dev/null 2>&1 fi exit $RETVAL
Save
cmd:
run