tools/pygrub: Set mount propagation to private recursively

This is important in order for every mount done inside a mount namespace to
go away after the namespace itself goes away. The comment referring to
unreliability in Linux 4.19 was just wrong.

This patch sets the story straight and makes the depriv pygrub a bit more
confined should a layer of the onion be vulnerable.

Fixes: e0342ae555 ("tools/pygrub: Deprivilege pygrub")
Signed-off-by: Alejandro Vallejo <alejandro.vallejo@cloud.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Alejandro Vallejo authored and Andrew Cooper committed 2023-11-23 17:21:01 +00:00
1 parent 16a0e16dab
commit c789c7ff7e
1 file changed
+9 -5
+9 -5
View File
@@ -55,6 +55,12 @@ def unshare(flags):
if unshare(flags) < 0:
raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno()))
# It's very typical for systemd to mount / with MS_SHARED. That means
# any events in the new namespace get propagated back to the parent.
#
# Undo it so that every mount done in the NS stay confined within it.
subprocess.check_output(["mount", "--make-rprivate", "/"])
def bind_mount(src, dst, options):
open(dst, "a").close() # touch
@@ -113,11 +119,9 @@ def depriv(output_directory, output, device, uid, path_kernel, path_ramdisk):
if rc != 0 or os.path.getsize(path) == 0:
os.unlink(path)
# Normally, unshare(CLONE_NEWNS) will ensure this is not required.
# However, this syscall doesn't exist in *BSD systems and doesn't
# auto-unmount everything on older Linux kernels (At least as of
# Linux 4.19, but it seems fixed in 5.15). Either way,
# recursively unmount everything if needed. Quietly.
# Unshare(CLONE_NEWNS) ensures this is not required, but that's not
# present on *BSD, so recursively unmount everything if needed.
# Quietly.
with open('/dev/null', 'w') as devnull:
subprocess.call(["umount", "-f", chroot + device_path],
stdout=devnull, stderr=devnull)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.