Problem
plugins/guardrails/hooks/block-root-delete-target.sh resolves the command word through a fixed table of launchers. A launcher missing from that table ends the walk, and the launcher's own name is read as the command word. So a recursive delete of a root passes when a launcher that is not in the table wraps it.
Payloads fed to the guard on stdin at 49dac96 exit 0, both direct and through run-guards.sh:
runuser -c 'rm -rf /'
taskset 1 rm -rf /
The same holds for runuser -u bob -- rm -rf /, chrt 10 rm -rf /, flock /tmp/l rm -rf /, flock /tmp/l -c 'rm -rf /', unshare rm -rf /, nsenter -t 1 -m rm -rf /, chroot / rm -rf / and numactl -l rm -rf /. The guard header already names runuser and taskset as a declared gap.
Ask
Unwrap each launcher whose grammar fits the guard's launcher model, and declare the rest as gaps. Pin a suite case either way.
Problem
plugins/guardrails/hooks/block-root-delete-target.shresolves the command word through a fixed table of launchers. A launcher missing from that table ends the walk, and the launcher's own name is read as the command word. So a recursive delete of a root passes when a launcher that is not in the table wraps it.Payloads fed to the guard on stdin at 49dac96 exit 0, both direct and through
run-guards.sh:runuser -c 'rm -rf /'taskset 1 rm -rf /The same holds for
runuser -u bob -- rm -rf /,chrt 10 rm -rf /,flock /tmp/l rm -rf /,flock /tmp/l -c 'rm -rf /',unshare rm -rf /,nsenter -t 1 -m rm -rf /,chroot / rm -rf /andnumactl -l rm -rf /. The guard header already namesrunuserandtasksetas a declared gap.Ask
Unwrap each launcher whose grammar fits the guard's launcher model, and declare the rest as gaps. Pin a suite case either way.