firstboot: validate root shell credentials

Validate passwd.shell.root after reading the credential so it uses
the same target-root shell checks as --root-shell= and prompted input.

Reproducer: CREDENTIALS_DIRECTORY=... systemd-firstboot --root=...
with passwd.shell.root=/bin/nonexistentshell

Before: /etc/passwd was written with the nonexistent root shell and
the command exited successfully.

Follow-up: 416f7b3a11
This commit is contained in:
dongshengyuan
2026-07-18 15:48:34 +08:00
parent 05b49871a2
commit 50eaa51ce1
2 changed files with 9 additions and 0 deletions
+4
View File
@@ -998,6 +998,10 @@ static int prompt_root_shell(int rfd, sd_varlink **mute_console_link) {
if (r < 0)
log_debug_errno(r, "Failed to read credential passwd.shell.root, ignoring: %m");
else {
r = find_shell(rfd, arg_root_shell);
if (r < 0)
return r;
log_debug("Acquired root shell from credential.");
return 0;
}
@@ -352,6 +352,11 @@ grep -q "^root::" "$ROOT/etc/shadow"
rm -fv "$ROOT/etc/passwd" "$ROOT/etc/shadow"
(! systemd-firstboot --root="$ROOT" --root-shell=/bin/nonexistentshell)
WCREDS="$(mktemp -d)"
printf '/bin/nonexistentshell' >"$WCREDS/passwd.shell.root"
(! CREDENTIALS_DIRECTORY="$WCREDS" systemd-firstboot --root="$ROOT")
[[ ! -e "$ROOT/etc/passwd" ]]
rm -rf "$WCREDS"
(! systemd-firstboot --root="$ROOT" --machine-id=invalidmachineid)
(! systemd-firstboot --root="$ROOT" --timezone=Foo/Bar)