]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homed: AddSigningKey: only feed data to OpenSSL _after_ Polkit auth
authorMatthias Gerstner <matthias.gerstner@suse.de>
Wed, 27 Aug 2025 08:18:41 +0000 (10:18 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 29 Aug 2025 05:49:12 +0000 (14:49 +0900)
As a hardening measure it makes sense not to process potentially crafted
data in `openssl_pubkey_to_pem()` before we know that the caller is
authorized to perform the action.

src/home/homed-manager-bus.c

index 920153827a11f7ea6ea14501a045722a2d8c4eee..f35268567218ee44c374ac09887ebdba4e0b9c54 100644 (file)
@@ -969,6 +969,20 @@ static int method_add_signing_key(sd_bus_message *message, void *userdata, sd_bu
         if (streq(fn, "local.public"))
                 return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Refusing to write local public key.");
 
+        if (hashmap_contains(m->public_keys, fn))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Public key name already exists: %s", fn);
+
+        r = bus_verify_polkit_async(
+                        message,
+                        "org.freedesktop.home1.manage-signing-keys",
+                        /* details= */ NULL,
+                        &m->polkit_registry,
+                        error);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return 1; /* Will call us back */
+
         _cleanup_(EVP_PKEY_freep) EVP_PKEY *pkey = NULL;
         r = openssl_pubkey_from_pem(pem, /* pem_size= */ SIZE_MAX, &pkey);
         if (r == -EIO)
@@ -976,9 +990,6 @@ static int method_add_signing_key(sd_bus_message *message, void *userdata, sd_bu
         if (r < 0)
                 return r;
 
-        if (hashmap_contains(m->public_keys, fn))
-                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Public key name already exists: %s", fn);
-
         /* Make sure the local key is loaded before can detect conflicts */
         r = manager_acquire_key_pair(m);
         if (r < 0)
@@ -987,17 +998,6 @@ static int method_add_signing_key(sd_bus_message *message, void *userdata, sd_bu
         if (manager_has_public_key(m, pkey))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Public key already exists: %s", fn);
 
-        r = bus_verify_polkit_async(
-                        message,
-                        "org.freedesktop.home1.manage-signing-keys",
-                        /* details= */ NULL,
-                        &m->polkit_registry,
-                        error);
-        if (r < 0)
-                return r;
-        if (r == 0)
-                return 1; /* Will call us back */
-
         _cleanup_free_ char *pem_reformatted = NULL;
         r = openssl_pubkey_to_pem(pkey, &pem_reformatted);
         if (r < 0)