|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
From a369dc213166c91ef7cc673a0ee7a75f24eab5f6 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
From: Dan Walsh <dwalsh@redhat.com>
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
Date: Thu, 16 Jan 2014 12:59:10 +0100
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
Subject: [PATCH] fix SELinux check for transient units
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
SELinux does not have a path to check for a snapshot servic creation.
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
This ends up giving us a bogus check.
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
On snapshot creation we should check if the remote process type, has the ability to start a service with the type that systemd is running with.
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
This patch is only for systemd-208
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
src/core/dbus-manager.c | 6 +++---
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
src/core/selinux-access.c | 9 +++++----
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
src/core/selinux-access.h | 13 +++++++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
3 files changed, 21 insertions(+), 7 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
1cc3df |
index 536f2ea4db..6d16c2a503 100644
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
--- a/src/core/dbus-manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+++ b/src/core/dbus-manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -1104,7 +1104,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
dbus_bool_t cleanup;
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
Snapshot *s;
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- SELINUX_ACCESS_CHECK(connection, message, "start");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ SELINUX_RUNTIME_UNIT_ACCESS_CHECK(connection, message, "start");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (!dbus_message_get_args(
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
message,
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -1157,7 +1157,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
return bus_send_error_reply(connection, message, &error, -ENOENT);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "stop");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ SELINUX_RUNTIME_UNIT_ACCESS_CHECK(connection, message, "stop");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
snapshot_remove(SNAPSHOT(u));
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
reply = dbus_message_new_method_return(message);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -1767,7 +1767,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
return bus_send_error_reply(connection, message, &error, r);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "start");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ SELINUX_RUNTIME_UNIT_ACCESS_CHECK(connection, message, "start");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (u->load_state != UNIT_NOT_FOUND || set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
dbus_set_error(&error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c
|
|
Zbigniew Jędrzejewski-Szmek |
1cc3df |
index 0a3ee18bb9..5d85b268ad 100644
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
--- a/src/core/selinux-access.c
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+++ b/src/core/selinux-access.c
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -374,8 +374,9 @@ int selinux_access_check(
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- if (path) {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- tclass = "service";
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ tclass = "service";
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ if (path && !strneq(path,"system", strlen("system"))) {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
/* get the file context of the unit file */
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
r = getfilecon(path, &fcon);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -384,9 +385,9 @@ int selinux_access_check(
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
log_error("Failed to get security context on %s: %m",path);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
} else {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
- tclass = "system";
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ if (path)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ tclass = "system";
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
r = getcon(&fcon);
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
dbus_set_error(error, DBUS_ERROR_ACCESS_DENIED, "Failed to get current context.");
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
diff --git a/src/core/selinux-access.h b/src/core/selinux-access.h
|
|
Zbigniew Jędrzejewski-Szmek |
1cc3df |
index 2d7ac64c8f..92acd69eb9 100644
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
--- a/src/core/selinux-access.h
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+++ b/src/core/selinux-access.h
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -36,6 +36,18 @@ int selinux_access_check(DBusConnection *connection, DBusMessage *message, const
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
DBusConnection *_c = (connection); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
DBusMessage *_m = (message); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
dbus_error_init(&_error); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ _r = selinux_access_check(_c, _m, "system", (permission), &_error); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ if (_r < 0) \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ return bus_send_error_reply(_c, _m, &_error, _r); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ } while (false)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+#define SELINUX_RUNTIME_UNIT_ACCESS_CHECK(connection, message, permission) \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ do { \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ DBusError _error; \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ int _r; \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ DBusConnection *_c = (connection); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ DBusMessage *_m = (message); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+ dbus_error_init(&_error); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
_r = selinux_access_check(_c, _m, NULL, (permission), &_error); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
if (_r < 0) \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
return bus_send_error_reply(_c, _m, &_error, _r); \
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
@@ -57,6 +69,7 @@ int selinux_access_check(DBusConnection *connection, DBusMessage *message, const
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
#else
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
#define SELINUX_ACCESS_CHECK(connection, message, permission) do { } while (false)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
+#define SELINUX_RUNTIME_UNIT_ACCESS_CHECK(connection, message, permission) do { } while (false)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
#define SELINUX_UNIT_ACCESS_CHECK(unit, connection, message, permission) do { } while (false)
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
|
|
Zbigniew Jędrzejewski-Szmek |
a52f67 |
#endif
|