Skip to content

Commit 0a069ce

Browse files
author
David Herrmann
committed
core: harden cgroups-agent forwarding
On dbus1, we receive systemd1.Agent signals via the private socket, hence it's trusted. However, on kdbus we receive it on the system bus. We must make sure it's sent by UID=0, otherwise unprivileged users can fake it. Furthermore, never forward broadcasts we sent ourself. This might happen on kdbus, as we forward the message on the same bus we received it on, thus ending up in an endless loop.
1 parent 1d44f75 commit 0a069ce

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

src/core/dbus.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,37 @@ int bus_send_queued_message(Manager *m) {
6969
}
7070

7171
static int signal_agent_released(sd_bus_message *message, void *userdata, sd_bus_error *error) {
72+
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
73+
const char *cgroup, *me;
7274
Manager *m = userdata;
73-
const char *cgroup;
75+
uid_t sender_uid;
76+
sd_bus *bus;
7477
int r;
7578

7679
assert(message);
7780
assert(m);
7881

82+
/* ignore recursive events sent by us on the system/user bus */
83+
bus = sd_bus_message_get_bus(message);
84+
if (!sd_bus_is_server(bus)) {
85+
r = sd_bus_get_unique_name(bus, &me);
86+
if (r < 0)
87+
return r;
88+
89+
if (streq_ptr(sd_bus_message_get_sender(message), me))
90+
return 0;
91+
}
92+
93+
/* only accept org.freedesktop.systemd1.Agent from UID=0 */
94+
r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds);
95+
if (r < 0)
96+
return r;
97+
98+
r = sd_bus_creds_get_euid(creds, &sender_uid);
99+
if (r < 0 || sender_uid != 0)
100+
return 0;
101+
102+
/* parse 'cgroup-empty' notification */
79103
r = sd_bus_message_read(message, "s", &cgroup);
80104
if (r < 0) {
81105
bus_log_parse_error(r);

0 commit comments

Comments
 (0)