Blame SOURCES/polkit-0.115-CVE-2018-19788.patch

7cc25b
diff --git a/src/polkit/polkitunixgroup.c b/src/polkit/polkitunixgroup.c
7cc25b
index c57a1aaacbb13c4e4297dd812cf5904f2f427b03..309f68918895e0f8b547f8c06f89c6fb1326fe20 100644
7cc25b
--- a/src/polkit/polkitunixgroup.c
7cc25b
+++ b/src/polkit/polkitunixgroup.c
7cc25b
@@ -71,6 +71,7 @@ G_DEFINE_TYPE_WITH_CODE (PolkitUnixGroup, polkit_unix_group, G_TYPE_OBJECT,
7cc25b
 static void
7cc25b
 polkit_unix_group_init (PolkitUnixGroup *unix_group)
7cc25b
 {
7cc25b
+  unix_group->gid = -1; /* (git_t) -1 is not a valid GID under Linux */
7cc25b
 }
7cc25b
 
7cc25b
 static void
7cc25b
@@ -100,11 +101,14 @@ polkit_unix_group_set_property (GObject      *object,
7cc25b
                                GParamSpec   *pspec)
7cc25b
 {
7cc25b
   PolkitUnixGroup *unix_group = POLKIT_UNIX_GROUP (object);
7cc25b
+  gint val;
7cc25b
 
7cc25b
   switch (prop_id)
7cc25b
     {
7cc25b
     case PROP_GID:
7cc25b
-      unix_group->gid = g_value_get_int (value);
7cc25b
+      val = g_value_get_int (value);
7cc25b
+      g_return_if_fail (val != -1);
7cc25b
+      unix_group->gid = val;
7cc25b
       break;
7cc25b
 
7cc25b
     default:
7cc25b
@@ -131,9 +135,9 @@ polkit_unix_group_class_init (PolkitUnixGroupClass *klass)
7cc25b
                                    g_param_spec_int ("gid",
7cc25b
                                                      "Group ID",
7cc25b
                                                      "The UNIX group ID",
7cc25b
-                                                     0,
7cc25b
+                                                     G_MININT,
7cc25b
                                                      G_MAXINT,
7cc25b
-                                                     0,
7cc25b
+                                                     -1,
7cc25b
                                                      G_PARAM_CONSTRUCT |
7cc25b
                                                      G_PARAM_READWRITE |
7cc25b
                                                      G_PARAM_STATIC_NAME |
7cc25b
@@ -166,9 +170,10 @@ polkit_unix_group_get_gid (PolkitUnixGroup *group)
7cc25b
  */
7cc25b
 void
7cc25b
 polkit_unix_group_set_gid (PolkitUnixGroup *group,
7cc25b
-                          gint gid)
7cc25b
+                           gint gid)
7cc25b
 {
7cc25b
   g_return_if_fail (POLKIT_IS_UNIX_GROUP (group));
7cc25b
+  g_return_if_fail (gid != -1);
7cc25b
   group->gid = gid;
7cc25b
 }
7cc25b
 
7cc25b
@@ -183,6 +188,8 @@ polkit_unix_group_set_gid (PolkitUnixGroup *group,
7cc25b
 PolkitIdentity *
7cc25b
 polkit_unix_group_new (gint gid)
7cc25b
 {
7cc25b
+  g_return_val_if_fail (gid != -1, NULL);
7cc25b
+
7cc25b
   return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_GROUP,
7cc25b
                                        "gid", gid,
7cc25b
                                        NULL));
7cc25b
diff --git a/src/polkit/polkitunixprocess.c b/src/polkit/polkitunixprocess.c
7cc25b
index 972b7776825d5ccf677ed12ed620fc0c52352547..b02b25894ad120d88ea21d4c96ac8dca1821fcf2 100644
7cc25b
--- a/src/polkit/polkitunixprocess.c
7cc25b
+++ b/src/polkit/polkitunixprocess.c
7cc25b
@@ -159,9 +159,14 @@ polkit_unix_process_set_property (GObject      *object,
7cc25b
       polkit_unix_process_set_pid (unix_process, g_value_get_int (value));
7cc25b
       break;
7cc25b
 
7cc25b
-    case PROP_UID:
7cc25b
-      polkit_unix_process_set_uid (unix_process, g_value_get_int (value));
7cc25b
+    case PROP_UID: {
7cc25b
+      gint val;
7cc25b
+
7cc25b
+      val = g_value_get_int (value);
7cc25b
+      g_return_if_fail (val != -1);
7cc25b
+      polkit_unix_process_set_uid (unix_process, val);
7cc25b
       break;
7cc25b
+    }
7cc25b
 
7cc25b
     case PROP_START_TIME:
7cc25b
       polkit_unix_process_set_start_time (unix_process, g_value_get_uint64 (value));
7cc25b
@@ -239,7 +244,7 @@ polkit_unix_process_class_init (PolkitUnixProcessClass *klass)
7cc25b
                                    g_param_spec_int ("uid",
7cc25b
                                                      "User ID",
7cc25b
                                                      "The UNIX user ID",
7cc25b
-                                                     -1,
7cc25b
+                                                     G_MININT,
7cc25b
                                                      G_MAXINT,
7cc25b
                                                      -1,
7cc25b
                                                      G_PARAM_CONSTRUCT |
7cc25b
@@ -303,7 +308,6 @@ polkit_unix_process_set_uid (PolkitUnixProcess *process,
7cc25b
                              gint               uid)
7cc25b
 {
7cc25b
   g_return_if_fail (POLKIT_IS_UNIX_PROCESS (process));
7cc25b
-  g_return_if_fail (uid >= -1);
7cc25b
   process->uid = uid;
7cc25b
 }
7cc25b
 
7cc25b
diff --git a/src/polkit/polkitunixuser.c b/src/polkit/polkitunixuser.c
7cc25b
index 8bfd3a1fb05ddb56adebd097569a9977b7b922f3..234a6976c573ac65200ee08228cd50111f0c769b 100644
7cc25b
--- a/src/polkit/polkitunixuser.c
7cc25b
+++ b/src/polkit/polkitunixuser.c
7cc25b
@@ -72,6 +72,7 @@ G_DEFINE_TYPE_WITH_CODE (PolkitUnixUser, polkit_unix_user, G_TYPE_OBJECT,
7cc25b
 static void
7cc25b
 polkit_unix_user_init (PolkitUnixUser *unix_user)
7cc25b
 {
7cc25b
+  unix_user->uid = -1;  /* (uid_t) -1 is not a valid UID under Linux */
7cc25b
   unix_user->name = NULL;
7cc25b
 }
7cc25b
 
7cc25b
@@ -112,11 +113,14 @@ polkit_unix_user_set_property (GObject      *object,
7cc25b
                                GParamSpec   *pspec)
7cc25b
 {
7cc25b
   PolkitUnixUser *unix_user = POLKIT_UNIX_USER (object);
7cc25b
+  gint val;
7cc25b
 
7cc25b
   switch (prop_id)
7cc25b
     {
7cc25b
     case PROP_UID:
7cc25b
-      unix_user->uid = g_value_get_int (value);
7cc25b
+      val = g_value_get_int (value);
7cc25b
+      g_return_if_fail (val != -1);
7cc25b
+      unix_user->uid = val;
7cc25b
       break;
7cc25b
 
7cc25b
     default:
7cc25b
@@ -144,9 +148,9 @@ polkit_unix_user_class_init (PolkitUnixUserClass *klass)
7cc25b
                                    g_param_spec_int ("uid",
7cc25b
                                                      "User ID",
7cc25b
                                                      "The UNIX user ID",
7cc25b
-                                                     0,
7cc25b
+                                                     G_MININT,
7cc25b
                                                      G_MAXINT,
7cc25b
-                                                     0,
7cc25b
+                                                     -1,
7cc25b
                                                      G_PARAM_CONSTRUCT |
7cc25b
                                                      G_PARAM_READWRITE |
7cc25b
                                                      G_PARAM_STATIC_NAME |
7cc25b
@@ -182,6 +186,7 @@ polkit_unix_user_set_uid (PolkitUnixUser *user,
7cc25b
                           gint uid)
7cc25b
 {
7cc25b
   g_return_if_fail (POLKIT_IS_UNIX_USER (user));
7cc25b
+  g_return_if_fail (uid != -1);
7cc25b
   user->uid = uid;
7cc25b
 }
7cc25b
 
7cc25b
@@ -196,6 +201,8 @@ polkit_unix_user_set_uid (PolkitUnixUser *user,
7cc25b
 PolkitIdentity *
7cc25b
 polkit_unix_user_new (gint uid)
7cc25b
 {
7cc25b
+  g_return_val_if_fail (uid != -1, NULL);
7cc25b
+
7cc25b
   return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_USER,
7cc25b
                                         "uid", uid,
7cc25b
                                         NULL));
7cc25b
diff --git a/test/data/etc/group b/test/data/etc/group
7cc25b
index 12ef328b21b346ee3828ce3aaf15cca83858bd1d..b9acab97211fdf7db521dc0939b2dcfc2c9e350b 100644
7cc25b
--- a/test/data/etc/group
7cc25b
+++ b/test/data/etc/group
7cc25b
@@ -5,3 +5,4 @@ john:x:500:
7cc25b
 jane:x:501:
7cc25b
 sally:x:502:
7cc25b
 henry:x:503:
7cc25b
+highuid2:x:4000000000:
7cc25b
diff --git a/test/data/etc/passwd b/test/data/etc/passwd
7cc25b
index 8544febcd8b1720e5577dfb3f0672a6fef29e701..5cf14a5620259f79806192ca935fee84a29ac96d 100644
7cc25b
--- a/test/data/etc/passwd
7cc25b
+++ b/test/data/etc/passwd
7cc25b
@@ -3,3 +3,5 @@ john:x:500:500:John Done:/home/john:/bin/bash
7cc25b
 jane:x:501:501:Jane Smith:/home/jane:/bin/bash
7cc25b
 sally:x:502:502:Sally Derp:/home/sally:/bin/bash
7cc25b
 henry:x:503:503:Henry Herp:/home/henry:/bin/bash
7cc25b
+highuid1:x:2147483648:2147483648:The first high uid:/home/highuid1:/sbin/nologin
7cc25b
+highuid2:x:4000000000:4000000000:An example high uid:/home/example:/sbin/nologin
7cc25b
diff --git a/test/data/etc/polkit-1/rules.d/10-testing.rules b/test/data/etc/polkit-1/rules.d/10-testing.rules
7cc25b
index 446e62291b7fe4c5bacdceb1045350af1a9dc245..98bf062a08cb11fddb7df95d0bcdec1b1ac3587d 100644
7cc25b
--- a/test/data/etc/polkit-1/rules.d/10-testing.rules
7cc25b
+++ b/test/data/etc/polkit-1/rules.d/10-testing.rules
7cc25b
@@ -53,6 +53,27 @@ polkit.addRule(function(action, subject) {
7cc25b
     }
7cc25b
 });
7cc25b
 
7cc25b
+polkit.addRule(function(action, subject) {
7cc25b
+    if (action.id == "net.company.john_action") {
7cc25b
+        if (subject.user == "john") {
7cc25b
+            return polkit.Result.YES;
7cc25b
+        } else {
7cc25b
+            return polkit.Result.NO;
7cc25b
+        }
7cc25b
+    }
7cc25b
+});
7cc25b
+
7cc25b
+polkit.addRule(function(action, subject) {
7cc25b
+    if (action.id == "net.company.highuid2_action") {
7cc25b
+        if (subject.user == "highuid2") {
7cc25b
+            return polkit.Result.YES;
7cc25b
+        } else {
7cc25b
+            return polkit.Result.NO;
7cc25b
+        }
7cc25b
+    }
7cc25b
+});
7cc25b
+
7cc25b
+
7cc25b
 // ---------------------------------------------------------------------
7cc25b
 // variables
7cc25b
 
7cc25b
diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c
7cc25b
index b484a26600dbde074ee7d8491f88624fdc83c39c..71aad23e2f5d1a7b15e138f23e6581a31498bad6 100644
7cc25b
--- a/test/polkitbackend/test-polkitbackendjsauthority.c
7cc25b
+++ b/test/polkitbackend/test-polkitbackendjsauthority.c
7cc25b
@@ -330,6 +330,78 @@ static const RulesTestCase rules_test_cases[] = {
7cc25b
     NULL,
7cc25b
     POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
7cc25b
   },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* highuid1 is not a member of group 'users', see test/data/etc/group */
7cc25b
+    "group_membership_with_non_member(highuid22)",
7cc25b
+    "net.company.group.only_group_users",
7cc25b
+    "unix-user:highuid2",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* highuid2 is not a member of group 'users', see test/data/etc/group */
7cc25b
+    "group_membership_with_non_member(highuid21)",
7cc25b
+    "net.company.group.only_group_users",
7cc25b
+    "unix-user:highuid2",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* highuid1 is not a member of group 'users', see test/data/etc/group */
7cc25b
+    "group_membership_with_non_member(highuid24)",
7cc25b
+    "net.company.group.only_group_users",
7cc25b
+    "unix-user:2147483648",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* highuid2 is not a member of group 'users', see test/data/etc/group */
7cc25b
+    "group_membership_with_non_member(highuid23)",
7cc25b
+    "net.company.group.only_group_users",
7cc25b
+    "unix-user:4000000000",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* john is authorized to do this, see 10-testing.rules */
7cc25b
+    "john_action",
7cc25b
+    "net.company.john_action",
7cc25b
+    "unix-user:john",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* only john is authorized to do this, see 10-testing.rules */
7cc25b
+    "jane_action",
7cc25b
+    "net.company.john_action",
7cc25b
+    "unix-user:jane",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* highuid2 is authorized to do this, see 10-testing.rules */
7cc25b
+    "highuid2_action",
7cc25b
+    "net.company.highuid2_action",
7cc25b
+    "unix-user:highuid2",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
7cc25b
+  },
7cc25b
+
7cc25b
+  {
7cc25b
+    /* only highuid2 is authorized to do this, see 10-testing.rules */
7cc25b
+    "highuid1_action",
7cc25b
+    "net.company.highuid2_action",
7cc25b
+    "unix-user:highuid1",
7cc25b
+    NULL,
7cc25b
+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
7cc25b
+  },
7cc25b
 };
7cc25b
 
7cc25b
 /* ---------------------------------------------------------------------------------------------------- */
7cc25b