if nesting is enabled, it is already possible to mount a fresh instance of
procfs and sysfs inside the container. protecting the original one does not
make much sense in such a scenario, the kernel already protects the bits that
are off-limits for unprivileged users anyway..

this fixes an issue with certain nested container setups, such as a recent
enough runc nested inside LXC.

Signed-off-by: Fabian Grünbichler <[email protected]>
Link: 
https://lore.proxmox.com/[email protected]
(cherry picked from commit d24bcf97de7c3e59e3d3dd19945b4cd42e72db40)
renamed patch for backport
Signed-off-by: Fabian Grünbichler <[email protected]>
---
 ...proc-and-sys-restrictions-if-nesting.patch | 71 +++++++++++++++++++
 debian/patches/series                         |  1 +
 2 files changed, 72 insertions(+)
 create mode 100644 
debian/patches/0002-apparmor-skip-proc-and-sys-restrictions-if-nesting.patch

diff --git 
a/debian/patches/0002-apparmor-skip-proc-and-sys-restrictions-if-nesting.patch 
b/debian/patches/0002-apparmor-skip-proc-and-sys-restrictions-if-nesting.patch
new file mode 100644
index 0000000..24b255a
--- /dev/null
+++ 
b/debian/patches/0002-apparmor-skip-proc-and-sys-restrictions-if-nesting.patch
@@ -0,0 +1,71 @@
+From 33b101104ea750cc7bb723fa3715fb42cd177645 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <[email protected]>
+Date: Thu, 13 Nov 2025 13:25:04 +0100
+Subject: [PATCH] apparmor: skip /proc and /sys restrictions if nesting is
+ enabled
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+if nesting is enabled, it's already possible to mount your own instance of both
+/proc and /sys inside the container, so protecting the "original" one makes no
+sense, but breaks certain nested container setups.
+
+See: 
https://github.com/lxc/incus/pull/2624/commits/1fbe4bffb9748cc3b07aaf5db310d463c1e827d0
+Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=7006
+
+Signed-off-by: Fabian Grünbichler <[email protected]>
+---
+ src/lxc/lsm/apparmor.c | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/src/lxc/lsm/apparmor.c b/src/lxc/lsm/apparmor.c
+index d6516ae9f..e9d494f1e 100644
+--- a/src/lxc/lsm/apparmor.c
++++ b/src/lxc/lsm/apparmor.c
+@@ -170,6 +170,9 @@ static const char AA_PROFILE_BASE[] =
+ "  mount options=(rw,move) /s[^y]*{,/**},\n"
+ "  mount options=(rw,move) /sy[^s]*{,/**},\n"
+ "  mount options=(rw,move) /sys?*{,/**},\n"
++"\n";
++
++static const char AA_PROFILE_BASE_NO_NESTING[] =
+ "\n"
+ "  # generated by: lxc-generate-aa-rules.py container-rules.base\n"
+ "  deny /proc/sys/[^kn]*{,/**} wklx,\n"
+@@ -755,6 +758,10 @@ static char *get_apparmor_profile_content(struct lsm_ops 
*ops, struct lxc_conf *
+       must_append_sized(&profile, &size, AA_PROFILE_BASE,
+                         STRARRAYLEN(AA_PROFILE_BASE));
+ 
++      if (!conf->lsm_aa_allow_nesting)
++              must_append_sized(&profile, &size, AA_PROFILE_BASE_NO_NESTING,
++                                STRARRAYLEN(AA_PROFILE_BASE_NO_NESTING));
++
+       append_all_remount_rules(&profile, &size);
+ 
+       if (ops->aa_supports_unix)
+@@ -768,8 +775,10 @@ static char *get_apparmor_profile_content(struct lsm_ops 
*ops, struct lxc_conf *
+       if (ops->aa_can_stack && !ops->aa_is_stacked) {
+               char *namespace, *temp;
+ 
+-              must_append_sized(&profile, &size, AA_PROFILE_STACKING_BASE,
+-                                STRARRAYLEN(AA_PROFILE_STACKING_BASE));
++
++              if (!conf->lsm_aa_allow_nesting)
++                      must_append_sized(&profile, &size, 
AA_PROFILE_STACKING_BASE,
++                                        
STRARRAYLEN(AA_PROFILE_STACKING_BASE));
+ 
+               namespace = apparmor_namespace(conf->name, lxcpath);
+               temp = must_concat(NULL, "  change_profile -> \":", namespace, 
":*\",\n"
+@@ -779,7 +788,7 @@ static char *get_apparmor_profile_content(struct lsm_ops 
*ops, struct lxc_conf *
+ 
+               must_append_sized(&profile, &size, temp, strlen(temp));
+               free(temp);
+-      } else {
++      } else if (!conf->lsm_aa_allow_nesting) {
+               must_append_sized(&profile, &size, AA_PROFILE_NO_STACKING,
+                                 STRARRAYLEN(AA_PROFILE_NO_STACKING));
+       }
+-- 
+2.47.3
+
diff --git a/debian/patches/series b/debian/patches/series
index 247ec88..63d54d2 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
 0001-Revert-lsm-apparmor-allow-to-change-mount-propagatio.patch
+0002-apparmor-skip-proc-and-sys-restrictions-if-nesting.patch
 pve/0001-PVE-Config-deny-rw-mounting-of-sys-and-proc.patch
 pve/0002-PVE-Config-attach-always-use-getent.patch
-- 
2.47.3



_______________________________________________
pve-devel mailing list
[email protected]
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to