proc: allow access in init userns for map_files with CAP_CHECKPOINT_RESTORE
authorAdrian Reber <areber@redhat.com>
Sun, 19 Jul 2020 10:04:14 +0000 (12:04 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 19 Jul 2020 18:14:42 +0000 (20:14 +0200)
Opening files in /proc/pid/map_files when the current user is
CAP_CHECKPOINT_RESTORE capable in the root namespace is useful for
checkpointing and restoring to recover files that are unreachable via
the file system such as deleted files, or memfd files.

Signed-off-by: Adrian Reber <areber@redhat.com>
Signed-off-by: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@gmail.com>
Reviewed-by: Serge Hallyn <serge@hallyn.com>
Link: https://lore.kernel.org/r/20200719100418.2112740-5-areber@redhat.com
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
fs/proc/base.c

index d86c0af..a333cae 100644 (file)
@@ -2189,16 +2189,16 @@ struct map_files_info {
 };
 
 /*
- * Only allow CAP_SYS_ADMIN to follow the links, due to concerns about how the
- * symlinks may be used to bypass permissions on ancestor directories in the
- * path to the file in question.
+ * Only allow CAP_SYS_ADMIN and CAP_CHECKPOINT_RESTORE to follow the links, due
+ * to concerns about how the symlinks may be used to bypass permissions on
+ * ancestor directories in the path to the file in question.
  */
 static const char *
 proc_map_files_get_link(struct dentry *dentry,
                        struct inode *inode,
                        struct delayed_call *done)
 {
-       if (!capable(CAP_SYS_ADMIN))
+       if (!checkpoint_restore_ns_capable(&init_user_ns))
                return ERR_PTR(-EPERM);
 
        return proc_pid_get_link(dentry, inode, done);