all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH 0/3] fix #7864: allow pool-scoped privileges to create VMs with tags
@ 2026-10-27 10:32 jlcusinato
  2026-10-27 10:32 ` [PATCH pve-guest-common] fix #7864: guest helpers: allow pool-scoped privileges for tag permission checks jlcusinato
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: jlcusinato @ 2026-10-27 10:32 UTC (permalink / raw)
  To: pve-devel; +Cc: felix, crandler, dreadfulbunny

Pool-scoped automation can create VMs and containers in its pool, but the
create fails as soon as --tags is passed (403 on /vms/<vmid>,
VM.Config.Options); regressed with commit a929b3e ("vm_create: check tag
permissions if setting tags") in qemu-server and its pve-container
counterpart 7a57f63 ("check_ct_modify_config_perm: check for tags
permissions with 'assert_tag_permissions'").

Root cause and reproducer: bug 7864 [0]. These are the patches already
attached there (code by Felix Winterhalter <felix@ranovus.com>, all three
contributors CCed), posted per the maintainers' request (comment #6);
neither has been active on the bug since September 2026 and the list never
received a posting, hence this submission. crandler's fix for the {} -> ''
defect (comment #5) is rolled into the qemu-server patch; the pve-container
message was corrected after dreadfulbunny's data point (comment #7) showed
that container create is affected too. Provenance is preserved in the
commit messages (Signed-off-by / Reported-by); my individual CLA is on
record with Proxmox (October 2026).

Merge order: pve-guest-common first; qemu-server and pve-container then.
Per-patch notes describe deltas from the Bugzilla versions. Not
runtime-tested (no test node); testing feedback welcome.

[0] https://bugzilla.proxmox.com/show_bug.cgi?id=7864




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH pve-guest-common] fix #7864: guest helpers: allow pool-scoped privileges for tag permission checks
  2026-10-27 10:32 [PATCH 0/3] fix #7864: allow pool-scoped privileges to create VMs with tags jlcusinato
@ 2026-10-27 10:32 ` jlcusinato
  2026-10-27 10:32 ` [PATCH qemu-server] fix #7864: api: create vm: honour pool privileges when setting tags jlcusinato
  2026-10-27 10:32 ` [PATCH pve-container] fix #7864: lxc: honour pool privileges when creating containers with tags jlcusinato
  2 siblings, 0 replies; 4+ messages in thread
From: jlcusinato @ 2026-10-27 10:32 UTC (permalink / raw)
  To: pve-devel; +Cc: felix, crandler, dreadfulbunny

From: Jean-Leon CUSINATO <jlcusinato@neverhack.com>

assert_tag_permissions() hardcoded the pool argument of
check_vm_perm() to undef, so the VM.Config.Options check always
resolved against /vms/$vmid.

That is fine for callers acting on an existing guest, because the
pool ACL is resolved onto /vms/$vmid by
RPCEnvironment::compile_acl_path(). It is not fine while a guest is
being created: at that point the guest is not a member of the pool
yet, so a caller whose privileges come solely from /pool/<pool> has
nothing on /vms/$vmid to match against.

Add an optional $pool parameter and forward it, so callers that know
the target pool can opt in. Existing callers pass no pool and keep
the current behaviour.

Signed-off-by: Felix Winterhalter <felix@ranovus.com>
---

Same code as the Bugzilla attachment (2056), rebased onto current
master. Subject now starts with 'fix #7864:' per the developer
documentation, and the commit message is reflowed to the 72-char
line-width guideline; no semantic changes.

Resend note (submitted by Jean-Léon CUSINATO
<jlcusinato@neverhack.com>):

These patches originate from bug 7864 [0]: code by Felix Winterhalter
<felix@ranovus.com> (the versions attached there, informally reviewed
by a Proxmox maintainer in comment #4, who asked for a posting on this
list) plus crandler's follow-up finding (comment #5) and dreadfulbunny's
data point on the container create path (comment #7). Neither original
author has been active on the bug since September 2026, and the list
never received a posting despite that request, so I am submitting them
here with their attribution intact in the commit messages
(Signed-off-by / Reported-by). All contributors are CCed. My individual
CLA has been submitted to and recorded by Proxmox
(office@proxmox.com, October 2026), who asked for the patches to be
posted here. Not runtime-tested (no test node available); verification
is code-level only. Feedback, especially testing, welcome.

Series merge order: 1) pve-guest-common, then 2) qemu-server and
3) pve-container (the latter two only rely on the new optional $pool
parameter introduced in 1).

[0] https://bugzilla.proxmox.com/show_bug.cgi?id=7864

 src/PVE/GuestHelpers.pm | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/PVE/GuestHelpers.pm b/src/PVE/GuestHelpers.pm
index f8d112b..72da542 100644
--- a/src/PVE/GuestHelpers.pm
+++ b/src/PVE/GuestHelpers.pm
@@ -310,11 +310,15 @@ sub get_allowed_tags {
 # checks the permissions for setting/updating/removing tags for guests
 # tagopt_old and tagopt_new expect the tags as they are in the config
 #
+# $pool is optional and only relevant while the guest is being created, where
+# the guest is not a member of the pool yet, so the pool ACL cannot yet be
+# resolved onto /vms/$vmid. Callers acting on an existing guest can omit it.
+#
 # either returns gracefully or raises a permission exception
 sub assert_tag_permissions {
-    my ($vmid, $tagopt_old, $tagopt_new, $rpcenv, $authuser) = @_;
+    my ($vmid, $tagopt_old, $tagopt_new, $rpcenv, $authuser, $pool) = @_;
 
-    $rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.Options']);
+    $rpcenv->check_vm_perm($authuser, $vmid, $pool, ['VM.Config.Options']);
 
     my $privileged_user = $rpcenv->check($authuser, '/', ['Sys.Modify'], 1) // 0;
 
-- 
2.56.0




^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH qemu-server] fix #7864: api: create vm: honour pool privileges when setting tags
  2026-10-27 10:32 [PATCH 0/3] fix #7864: allow pool-scoped privileges to create VMs with tags jlcusinato
  2026-10-27 10:32 ` [PATCH pve-guest-common] fix #7864: guest helpers: allow pool-scoped privileges for tag permission checks jlcusinato
@ 2026-10-27 10:32 ` jlcusinato
  2026-10-27 10:32 ` [PATCH pve-container] fix #7864: lxc: honour pool privileges when creating containers with tags jlcusinato
  2 siblings, 0 replies; 4+ messages in thread
From: jlcusinato @ 2026-10-27 10:32 UTC (permalink / raw)
  To: pve-devel; +Cc: felix, crandler, dreadfulbunny

From: Jean-Leon CUSINATO <jlcusinato@neverhack.com>

Commit a929b3e ("vm_create: check tag permissions if setting tags")
started checking tag permissions on the create path, but
assert_tag_permissions() resolved VM.Config.Options against a bare
/vms/$vmid.

At that point the VM is not a pool member yet - add_vm_to_pool()
only runs after $realcmd has written the config - so a user or API
token whose privileges are granted solely on /pool/<pool> fails with

  unable to create VM 1021 - 403 Permission check failed
  (/vms/1021, VM.Config.Options)

even though it is allowed to create the VM in that pool, and even
though every other create-time option honours the pool via
$check_vm_modify_config_perm(). Tags are the only exception, because
they are skipped there and checked separately.

Pass the pool through, matching the surrounding checks. Setting the
same tags in a second config update already worked, so this only
removes the need for the caller to hold VM.Config.Options on all of
/vms.

The old-tags argument passed {} rather than an empty string.
PVE::Tools::split_list() stringifies that reference, so with
'user-allow' set to anything but 'free' a pseudo tag like
'HASH(0x...)' enters the per-tag comparison, which no allow list can
ever hold since the address is fresh on every call:

  403 Permission check failed (/, Sys.Modify for modifying tag
  'HASH(0x5c0c4195ab70)')

Pass an empty string instead, as the delete branch of the
config-update path already does; split_list('') returns an empty
list.

Fixes: a929b3e ("vm_create: check tag permissions if setting tags")
Reported-by: crandler <crandler@crandland.de>
Signed-off-by: Felix Winterhalter <felix@ranovus.com>
Signed-off-by: Jean-Léon CUSINATO <jlcusinato@neverhack.com>
---

Compared to the Bugzilla attachment (2057): the old-tags argument
is '' rather than {} per crandler's finding in comment #5 of the
bug (also CCed) - PVE::Tools::split_list() stringifies a hash
reference, so a 'HASH(0x...)' pseudo tag would enter the per-tag
comparison whenever 'user-allow' is not 'free'. Verified against
current pve-common: split_list('') returns () while split_list({})
yields HASH(0x...). Bug reference #7864 already in the subject;
commit message reflowed to the 72-char line-width guideline;
rebased onto current master.

Resend note (submitted by Jean-Léon CUSINATO
<jlcusinato@neverhack.com>):

These patches originate from bug 7864 [0]: code by Felix Winterhalter
<felix@ranovus.com> (the versions attached there, informally reviewed
by a Proxmox maintainer in comment #4, who asked for a posting on this
list) plus crandler's follow-up finding (comment #5) and dreadfulbunny's
data point on the container create path (comment #7). Neither original
author has been active on the bug since September 2026, and the list
never received a posting despite that request, so I am submitting them
here with their attribution intact in the commit messages
(Signed-off-by / Reported-by). All contributors are CCed. My individual
CLA has been submitted to and recorded by Proxmox
(office@proxmox.com, October 2026), who asked for the patches to be
posted here. Not runtime-tested (no test node available); verification
is code-level only. Feedback, especially testing, welcome.

Series merge order: 1) pve-guest-common, then 2) qemu-server and
3) pve-container (the latter two only rely on the new optional $pool
parameter introduced in 1).

[0] https://bugzilla.proxmox.com/show_bug.cgi?id=7864

 src/PVE/API2/Qemu.pm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/PVE/API2/Qemu.pm b/src/PVE/API2/Qemu.pm
index f4dbd2a..5789f99 100644
--- a/src/PVE/API2/Qemu.pm
+++ b/src/PVE/API2/Qemu.pm
@@ -1568,7 +1568,7 @@ __PACKAGE__->register_method({
 
                     if (defined $conf->{tags}) {
                         assert_tag_permissions(
-                            $vmid, {}, $conf->{tags}, $rpcenv, $authuser,
+                            $vmid, '', $conf->{tags}, $rpcenv, $authuser, $pool,
                         );
                         $conf->{tags} = PVE::GuestHelpers::get_unique_tags($conf->{tags});
                     }
-- 
2.56.0




^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH pve-container] fix #7864: lxc: honour pool privileges when creating containers with tags
  2026-10-27 10:32 [PATCH 0/3] fix #7864: allow pool-scoped privileges to create VMs with tags jlcusinato
  2026-10-27 10:32 ` [PATCH pve-guest-common] fix #7864: guest helpers: allow pool-scoped privileges for tag permission checks jlcusinato
  2026-10-27 10:32 ` [PATCH qemu-server] fix #7864: api: create vm: honour pool privileges when setting tags jlcusinato
@ 2026-10-27 10:32 ` jlcusinato
  2 siblings, 0 replies; 4+ messages in thread
From: jlcusinato @ 2026-10-27 10:32 UTC (permalink / raw)
  To: pve-devel; +Cc: felix, crandler, dreadfulbunny

From: Jean-Leon CUSINATO <jlcusinato@neverhack.com>

check_ct_modify_config_perm() passes $pool to every other
check_vm_perm() call, but the tags branch called
assert_tag_permissions() without it, so the VM.Config.Options check
always resolved against /vms/$vmid.

Unlike for an existing container, where the pool ACL already resolves
onto /vms/$vmid, the create path is hit: the LXC create API accepts
tags as a config property and hands the raw parameters, including
tags, to check_ct_modify_config_perm() before the container joins the
pool. A caller whose privileges come solely from /pool/<pool>
therefore fails to create containers with tags:

  403 Permission check failed (/vms/<vmid>, VM.Config.Options)

Pass the pool through, matching the neighbouring checks.

Fixes: 7a57f63 ("check_ct_modify_config_perm: check for tags permissions with 'assert_tag_permissions'")
Reported-by: dreadfulbunny <dreadfulbunny@proton.me>
Signed-off-by: Felix Winterhalter <felix@ranovus.com>
---

Compared to the Bugzilla attachment (2058): the 'currently latent'
premise in the original message is wrong - the LXC create API does
accept tags and container create fails the same way (data point in
bug comment #7, 2026-10-27), so the subject now starts with
'fix #7864:' and the message describes the create path;
Fixes:/Reported-by: trailers added. Code identical, rebased onto
current master.

Resend note (submitted by Jean-Léon CUSINATO
<jlcusinato@neverhack.com>):

These patches originate from bug 7864 [0]: code by Felix Winterhalter
<felix@ranovus.com> (the versions attached there, informally reviewed
by a Proxmox maintainer in comment #4, who asked for a posting on this
list) plus crandler's follow-up finding (comment #5) and dreadfulbunny's
data point on the container create path (comment #7). Neither original
author has been active on the bug since September 2026, and the list
never received a posting despite that request, so I am submitting them
here with their attribution intact in the commit messages
(Signed-off-by / Reported-by). All contributors are CCed. My individual
CLA has been submitted to and recorded by Proxmox
(office@proxmox.com, October 2026), who asked for the patches to be
posted here. Not runtime-tested (no test node available); verification
is code-level only. Feedback, especially testing, welcome.

Series merge order: 1) pve-guest-common, then 2) qemu-server and
3) pve-container (the latter two only rely on the new optional $pool
parameter introduced in 1).

[0] https://bugzilla.proxmox.com/show_bug.cgi?id=7864

 src/PVE/LXC.pm | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index 44ae4fa..f7c9b5b 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -1743,7 +1743,9 @@ sub check_ct_modify_config_perm {
         } elsif ($opt eq 'tags') {
             my $old = $oldconf->{$opt};
             my $new = $delete ? '' : $newconf->{$opt};
-            PVE::GuestHelpers::assert_tag_permissions($vmid, $old, $new, $rpcenv, $authuser);
+            PVE::GuestHelpers::assert_tag_permissions(
+                $vmid, $old, $new, $rpcenv, $authuser, $pool,
+            );
         } else {
             $rpcenv->check_vm_perm($authuser, $vmid, $pool, ['VM.Config.Options']);
         }
-- 
2.56.0




^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-10-27 10:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-27 10:32 [PATCH 0/3] fix #7864: allow pool-scoped privileges to create VMs with tags jlcusinato
2026-10-27 10:32 ` [PATCH pve-guest-common] fix #7864: guest helpers: allow pool-scoped privileges for tag permission checks jlcusinato
2026-10-27 10:32 ` [PATCH qemu-server] fix #7864: api: create vm: honour pool privileges when setting tags jlcusinato
2026-10-27 10:32 ` [PATCH pve-container] fix #7864: lxc: honour pool privileges when creating containers with tags jlcusinato

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal