mirror of
https://github.com/systemd/systemd
synced 2025-10-06 00:13:24 +02:00
machined: do not allow unprivileged users to shell into the root namespace
We intend to make self-registering machines an unprivileged operation, but currently that would allow an unprivileged user to register a process they own in the root namespace, and then login as any user they like, including root, which is not ideal. Forbid non-root from shelling into a machine that is running in the root user namespace.
This commit is contained in:
committed by
Lennart Poettering
parent
6cae201ca1
commit
c5e48e3a66
@@ -20,6 +20,7 @@
|
|||||||
#include "machine-dbus.h"
|
#include "machine-dbus.h"
|
||||||
#include "machined.h"
|
#include "machined.h"
|
||||||
#include "mount-util.h"
|
#include "mount-util.h"
|
||||||
|
#include "namespace-util.h"
|
||||||
#include "operation.h"
|
#include "operation.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
@@ -355,6 +356,25 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
user = isempty(user) ? "root" : user;
|
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);
|
r = sd_bus_message_read_strv(message, &args_wire);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
@@ -69,4 +69,22 @@ machinectl terminate zurps
|
|||||||
"$(systemctl show -p MainPID --value systemd-logind.service)" \
|
"$(systemctl show -p MainPID --value systemd-logind.service)" \
|
||||||
"$PWD")
|
"$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
|
loginctl disable-linger testuser
|
||||||
|
Reference in New Issue
Block a user