diff --git a/docker/stage2-hook.sh b/docker/stage2-hook.sh index 4bfbd56af..c10b68582 100755 --- a/docker/stage2-hook.sh +++ b/docker/stage2-hook.sh @@ -32,6 +32,14 @@ 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 --- # Accept PUID/PGID as aliases for HERMES_UID/HERMES_GID. NAS users (UGOS, # Synology, unRAID) expect the LinuxServer.io PUID/PGID convention and @@ -42,11 +50,11 @@ mkdir -p "$HERMES_HOME" HERMES_UID="${HERMES_UID:-${PUID:-}}" HERMES_GID="${HERMES_GID:-${PGID:-}}" -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).