diff --git a/docker/stage2-hook.sh b/docker/stage2-hook.sh index 1e8af197de9d5..4183fdedaea57 100755 --- a/docker/stage2-hook.sh +++ b/docker/stage2-hook.sh @@ -32,12 +32,19 @@ INSTALL_DIR="/opt/hermes" # is a no-op if the dir already exists. (#18482, salvages #18488) mkdir -p "$HERMES_HOME" +# Numeric UID/GID validation: must be digits only, 1000-65534 +validate_uid_gid() { + case "$1" in + ''|*[!0-9]*) return 1 ;; + *) [ "$1" -ge 1000 ] && [ "$1" -le 65534 ] ;; + esac +} # --- UID/GID remap --- -if [ -n "${HERMES_UID:-}" ] && [ "$HERMES_UID" != "$(id -u hermes)" ]; then +if [ -n "${HERMES_UID:-}" ] && validate_uid_gid "$HERMES_UID" && [ "$HERMES_UID" != "$(id -u hermes)" ]; then echo "[stage2] Changing hermes UID to $HERMES_UID" usermod -u "$HERMES_UID" hermes fi -if [ -n "${HERMES_GID:-}" ] && [ "$HERMES_GID" != "$(id -g hermes)" ]; then +if [ -n "${HERMES_GID:-}" ] && validate_uid_gid "$HERMES_GID" && [ "$HERMES_GID" != "$(id -g hermes)" ]; then echo "[stage2] Changing hermes GID to $HERMES_GID" # -o allows non-unique GID (e.g. macOS GID 20 "staff" may already # exist as "dialout" in the Debian-based container image).