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