• Steven Rostedt (Google)'s avatar
    tracefs: Reset permissions on remount if permissions are options · baa23a8d
    Steven Rostedt (Google) authored
    There's an inconsistency with the way permissions are handled in tracefs.
    Because the permissions are generated when accessed, they default to the
    root inode's permission if they were never set by the user. If the user
    sets the permissions, then a flag is set and the permissions are saved via
    the inode (for tracefs files) or an internal attribute field (for
    eventfs).
    
    But if a remount happens that specify the permissions, all the files that
    were not changed by the user gets updated, but the ones that were are not.
    If the user were to remount the file system with a given permission, then
    all files and directories within that file system should be updated.
    
    This can cause security issues if a file's permission was updated but the
    admin forgot about it. They could incorrectly think that remounting with
    permissions set would update all files, but miss some.
    
    For example:
    
     # cd /sys/kernel/tracing
     # chgrp 1002 current_tracer
     # ls -l
    [..]
     -rw-r-----  1 root root 0 May  1 21:25 buffer_size_kb
     -rw-r-----  1 root root 0 May  1 21:25 buffer_subbuf_size_kb
     -r--r-----  1 root root 0 May  1 21:25 buffer_total_size_kb
     -rw-r-----  1 root lkp  0 May  1 21:25 current_tracer
     -rw-r-----  1 root root 0 May  1 21:25 dynamic_events
     -r--r-----  1 root root 0 May  1 21:25 dyn_ftrace_total_info
     -r--r-----  1 root root 0 May  1 21:25 enabled_functions
    
    Where current_tracer now has group "lkp".
    
     # mount -o remount,gid=1001 .
     # ls -l
     -rw-r-----  1 root tracing 0 May  1 21:25 buffer_size_kb
     -rw-r-----  1 root tracing 0 May  1 21:25 buffer_subbuf_size_kb
     -r--r-----  1 root tracing 0 May  1 21:25 buffer_total_size_kb
     -rw-r-----  1 root lkp     0 May  1 21:25 current_tracer
     -rw-r-----  1 root tracing 0 May  1 21:25 dynamic_events
     -r--r-----  1 root tracing 0 May  1 21:25 dyn_ftrace_total_info
     -r--r-----  1 root tracing 0 May  1 21:25 enabled_functions
    
    Everything changed but the "current_tracer".
    
    Add a new link list that keeps track of all the tracefs_inodes which has
    the permission flags that tell if the file/dir should use the root inode's
    permission or not. Then on remount, clear all the flags so that the
    default behavior of using the root inode's permission is done for all
    files and directories.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20240502200905.529542160@goodmis.org
    
    Cc: stable@vger.kernel.org
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Fixes: 8186fff7 ("tracefs/eventfs: Use root and instance inodes as default ownership")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    baa23a8d
inode.c 20.6 KB