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:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user