diff --git a/bin/omarchy-security-functions b/bin/omarchy-security-functions index 890d4430..12ad8a78 100755 --- a/bin/omarchy-security-functions +++ b/bin/omarchy-security-functions @@ -10,13 +10,18 @@ fi omarchy_security_require_privileged_bash_startup() { [[ $- == *p* ]] || return 1 + # The caller is this check's parent, under the number this /proc gives it. + # arch-chroot runs the installer in a new PID namespace beneath the outer + # /proc, where $$ names no process, or someone else's. /usr/bin/env -i /usr/bin/bash -p -c ' - mapfile -d "" -t argv <"/proc/$1/cmdline" || exit 1 - executable=$(/usr/bin/readlink -e -- "/proc/$1/exe") || exit 1 + stat=$("$test_tmp/entrypoint" +# Privileged mode turned on after startup: the mode is set, the proof is not. +printf 'set -p\nsource "%s"\n%s\n' "$ROOT/bin/omarchy-security-functions" "$check" >"$test_tmp/late" +chmod +x "$test_tmp/entrypoint" + +"$test_tmp/entrypoint" || fail "a script started as bash -p passes the startup check, from a subshell too" +pass "a script started as bash -p passes the startup check, from a subshell too" + +for arguments in "" "-p"; do + if /usr/bin/bash "$test_tmp/late" $arguments; then + fail "bash that only turned -p on later is rejected" "arguments: $arguments" + fi +done +if /usr/bin/bash "$test_tmp/entrypoint"; then + fail "a script not started with -p is rejected" +fi +pass "bash not started with -p is rejected, whatever its other arguments" + +# arch-chroot runs the installer in a new PID namespace under the outer /proc, +# so the caller's own PID is not the number /proc knows it by. +in_new_pid_namespace=(unshare --user --map-root-user --fork --pid) +if "${in_new_pid_namespace[@]}" /usr/bin/true 2>/dev/null; then + "${in_new_pid_namespace[@]}" /usr/bin/bash -c "for i in {1..50}; do /usr/bin/true; done; '$test_tmp/entrypoint'; exit"