Revert "selinux: split up mac_selinux_have() from mac_selinux_use()"

This reverts commit 6355e75610.

The previously mentioned commit inadvertently broke a lot of SELinux related
functionality for both unprivileged users and systemd instances running as
MANAGER_USER.  In particular, setting the correct SELinux context after a User=
directive is used would fail to work since we attempt to set the security
context after changing UID.  Additionally, it causes activated socket units to
be mislabeled for systemd --user processes since setsockcreatecon() would never
be called.

Reverting this fixes the issues with labeling outlined above, and reinstates
SELinux access checks on unprivileged user services.
This commit is contained in:
Gary Tierney
2017-05-12 14:43:39 +01:00
parent 6e4177315f
commit 6d395665e5
10 changed files with 16 additions and 27 deletions
+5 -15
View File
@@ -53,7 +53,7 @@ static struct selabel_handle *label_hnd = NULL;
#define log_enforcing(...) log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, __VA_ARGS__)
#endif
bool mac_selinux_have(void) {
bool mac_selinux_use(void) {
#ifdef HAVE_SELINUX
if (cached_use < 0)
cached_use = is_selinux_enabled() > 0;
@@ -64,16 +64,6 @@ bool mac_selinux_have(void) {
#endif
}
bool mac_selinux_use(void) {
if (!mac_selinux_have())
return false;
/* Never try to configure SELinux features if we aren't
* root */
return getuid() == 0;
}
void mac_selinux_retest(void) {
#ifdef HAVE_SELINUX
cached_use = -1;
@@ -205,7 +195,7 @@ int mac_selinux_get_create_label_from_exe(const char *exe, char **label) {
assert(exe);
assert(label);
if (!mac_selinux_have())
if (!mac_selinux_use())
return -EOPNOTSUPP;
r = getcon_raw(&mycon);
@@ -231,7 +221,7 @@ int mac_selinux_get_our_label(char **label) {
assert(label);
#ifdef HAVE_SELINUX
if (!mac_selinux_have())
if (!mac_selinux_use())
return -EOPNOTSUPP;
r = getcon_raw(label);
@@ -255,7 +245,7 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *
assert(exe);
assert(label);
if (!mac_selinux_have())
if (!mac_selinux_use())
return -EOPNOTSUPP;
r = getcon_raw(&mycon);
@@ -310,7 +300,7 @@ char* mac_selinux_free(char *label) {
if (!label)
return NULL;
if (!mac_selinux_have())
if (!mac_selinux_use())
return NULL;
-1
View File
@@ -26,7 +26,6 @@
#include "macro.h"
bool mac_selinux_use(void);
bool mac_selinux_have(void);
void mac_selinux_retest(void);
int mac_selinux_init(void);
+1 -1
View File
@@ -479,7 +479,7 @@ int server_open_native_socket(Server*s) {
return log_error_errno(errno, "SO_PASSCRED failed: %m");
#ifdef HAVE_SELINUX
if (mac_selinux_have()) {
if (mac_selinux_use()) {
r = setsockopt(s->native_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
if (r < 0)
log_warning_errno(errno, "SO_PASSSEC failed: %m");
+1 -1
View File
@@ -918,7 +918,7 @@ static void dispatch_message_real(
}
#ifdef HAVE_SELINUX
if (mac_selinux_have()) {
if (mac_selinux_use()) {
if (label) {
x = alloca(strlen("_SELINUX_CONTEXT=") + label_len + 1);
+1 -1
View File
@@ -494,7 +494,7 @@ static int stdout_stream_install(Server *s, int fd, StdoutStream **ret) {
if (r < 0)
return log_error_errno(r, "Failed to determine peer credentials: %m");
if (mac_selinux_have()) {
if (mac_selinux_use()) {
r = getpeersec(fd, &stream->label);
if (r < 0 && r != -EOPNOTSUPP)
(void) log_warning_errno(r, "Failed to determine peer security context: %m");
+1 -1
View File
@@ -410,7 +410,7 @@ int server_open_syslog_socket(Server *s) {
return log_error_errno(errno, "SO_PASSCRED failed: %m");
#ifdef HAVE_SELINUX
if (mac_selinux_have()) {
if (mac_selinux_use()) {
r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
if (r < 0)
log_warning_errno(errno, "SO_PASSSEC failed: %m");
+1 -1
View File
@@ -607,7 +607,7 @@ static void bus_get_peercred(sd_bus *b) {
b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
/* Get the SELinux context of the peer */
if (mac_selinux_have()) {
if (mac_selinux_use()) {
r = getpeersec(b->input_fd, &b->label);
if (r < 0 && r != -EOPNOTSUPP)
log_debug_errno(r, "Failed to determine peer security context: %m");
+1 -1
View File
@@ -235,7 +235,7 @@ static int condition_test_security(Condition *c) {
assert(c->type == CONDITION_SECURITY);
if (streq(c->parameter, "selinux"))
return mac_selinux_have();
return mac_selinux_use();
if (streq(c->parameter, "smack"))
return mac_smack_use();
if (streq(c->parameter, "apparmor"))
+1 -1
View File
@@ -243,7 +243,7 @@ static void test_condition_test_security(void) {
condition = condition_new(CONDITION_SECURITY, "selinux", false, true);
assert_se(condition);
assert_se(condition_test(condition) != mac_selinux_have());
assert_se(condition_test(condition) != mac_selinux_use());
condition_free(condition);
condition = condition_new(CONDITION_SECURITY, "ima", false, false);
+4 -4
View File
@@ -35,16 +35,16 @@ static void test_testing(void) {
b = mac_selinux_use();
log_info("mac_selinux_use → %s", yes_no(b));
b = mac_selinux_have();
log_info("mac_selinux_have → %s", yes_no(b));
b = mac_selinux_use();
log_info("mac_selinux_use → %s", yes_no(b));
mac_selinux_retest();
b = mac_selinux_use();
log_info("mac_selinux_use → %s", yes_no(b));
b = mac_selinux_have();
log_info("mac_selinux_have → %s", yes_no(b));
b = mac_selinux_use();
log_info("mac_selinux_use → %s", yes_no(b));
}
static void test_loading(void) {