#include "machine-dbus.h"
#include "machined.h"
#include "mount-util.h"
+#include "namespace-util.h"
#include "operation.h"
#include "path-util.h"
#include "signal-util.h"
if (r < 0)
return r;
user = isempty(user) ? "root" : user;
+
+ /* Ensure only root can shell into the root namespace, unless it's specifically the host machine,
+ * which is owned by uid 0 anyway and cannot be self-registered. This is to avoid unprivileged
+ * users registering a process they own in the root user namespace, and then shelling in as root
+ * or another user. Note that the shell operation is privileged and requires 'auth_admin', so we
+ * do not need to check the caller's uid, as that will be checked by polkit, and if they machine's
+ * and the caller's do not match, authorization will be required. It's only the case where the
+ * caller owns the machine that will be shortcut and needs to be checked here. */
+ if (m->uid != 0 && m->class != MACHINE_HOST) {
+ r = pidref_in_same_namespace(&PIDREF_MAKE_FROM_PID(1), &m->leader, NAMESPACE_USER);
+ if (r < 0)
+ return r;
+ if (r != 0)
+ return sd_bus_error_set(
+ error,
+ SD_BUS_ERROR_ACCESS_DENIED,
+ "Only root may shell into the root user namespace");
+ }
+
r = sd_bus_message_read_strv(message, &args_wire);
if (r < 0)
return r;
"$(systemctl show -p MainPID --value systemd-logind.service)" \
"$PWD")
+run0 -u testuser \
+ busctl call \
+ org.freedesktop.machine1 \
+ /org/freedesktop/machine1 \
+ org.freedesktop.machine1.Manager \
+ RegisterMachine \
+ 'sayssus' \
+ shouldnotwork2 \
+ 16 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 \
+ "" \
+ container \
+ "$(systemctl show -p MainPID --value user@4711.service)" \
+ "$PWD"
+(! run0 -u testuser machinectl shell shouldnotwork2 /usr/bin/id -u)
+(! run0 -u testuser machinectl shell root@shouldnotwork2 /usr/bin/id -u)
+(! run0 -u testuser machinectl shell 0@shouldnotwork2 /usr/bin/id -u)
+(! run0 -u testuser machinectl shell testuser@shouldnotwork2 /usr/bin/id -u)
+
loginctl disable-linger testuser