tracefs/tracing: Remove "other" permission from tracefs
Subsystems (3)
Steven Rostedt
maintainercover tracefs/tracing: Remove "other" permission from tracefs
Currently tracefs is mounted with just 0700, keeping anyone that is not root from accessing it. But tracefs is like any other file system, where its permissions can be modified via chmod, chgrp, chown commands. Admins can change the permission of the file system for their own needs. Of course, because tracefs is a pseudo file system, a reboot will remove any updates an admin makes.
There really is no reason why any of the files in tracefs should allow any permission for the "other" group. Thus, make it so that, by default, all the files created in tracefs do not have any permission bits set for other. An admin can still change it to allow other to have permission to access tracefs, but then they get to own the fallout that creates.
Steven Rostedt (VMware) (2):
tracefs: Have tracefs directories not set OTH permission bits by default
tracing: Disable "other" permission bits in the tracefs files
----
fs/tracefs/inode.c | 3 +- kernel/trace/ftrace.c | 23 +++++------ kernel/trace/trace.c | 73 ++++++++++++++++++----------------- kernel/trace/trace.h | 3 ++ kernel/trace/trace_dynevent.c | 2 +- kernel/trace/trace_events.c | 42 ++++++++++---------- kernel/trace/trace_events_synth.c | 4 +- kernel/trace/trace_functions_graph.c | 2 +- kernel/trace/trace_hwlat.c | 6 +-- kernel/trace/trace_kprobe.c | 8 ++-- kernel/trace/trace_osnoise.c | 14 +++---- kernel/trace/trace_printk.c | 2 +- kernel/trace/trace_recursion_record.c | 4 +- kernel/trace/trace_stack.c | 6 +-- kernel/trace/trace_stat.c | 6 +-- kernel/trace/trace_uprobe.c | 4 +- 16 files changed, 105 insertions(+), 97 deletions(-)
Steven Rostedt
maintainerRFC PATCH 1/2 tracefs: Have tracefs directories not set OTH permission bits by default
From: "Steven Rostedt (VMware)" <[email protected]>
The tracefs file system is by default mounted such that only root user can access it. But there are legitimate reasons to create a group and allow those added to the group to have access to tracing. By changing the permissions of the tracefs mount point to allow access, it will allow group access to the tracefs directory.
There should not be any real reason to allow all access to the tracefs directory as it contains sensitive information. Have the default permission of directories being created not have any OTH (other) bits set, such that an admin that wants to give permission to a group has to first disable all OTH bits in the file system.
--- fs/tracefs/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/tracefs/inode.c +2 -1
@@ -432,7 +432,8 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent,if (unlikely (!inode))return failed_creating (dentry); - inode->i_mode =S_IFDIR |S_IRWXU |S_IRUGO |S_IXUGO ; +/* Do not set bits for OTH */ + inode->i_mode =S_IFDIR |S_IRWXU |S_IRUSR |S_IRGRP |S_IXUSR |S_IXGRP ; inode->i_op = ops; inode->i_fop = &simple_dir_operations;
Signature · 1 line
2.30.2
Steven Rostedt
maintainerRFC PATCH 2/2 tracing: Disable "other" permission bits in the tracefs files
In reply to Steven RostedtFrom: "Steven Rostedt (VMware)" <[email protected]>
When building the files in the tracefs file system, do not by default set any permissions for OTH (other). This will make it easier for admins who want to define a group for accessing tracefs and not having to first disable all the permission bits for "other" in the file system.
As tracing can leak sensitive information, it should never by default allowing all users access. An admin can still set the permission bits for others to have access, which may be useful for creating a honeypot and seeing who takes advantage of it and roots the machine.
--- kernel/trace/ftrace.c | 23 +++++---- kernel/trace/trace.c | 73 ++++++++++++++------------- kernel/trace/trace.h | 3 ++ kernel/trace/trace_dynevent.c | 2 +- kernel/trace/trace_events.c | 42 +++++++-------- kernel/trace/trace_events_synth.c | 4 +- kernel/trace/trace_functions_graph.c | 2 +- kernel/trace/trace_hwlat.c | 6 +-- kernel/trace/trace_kprobe.c | 8 +-- kernel/trace/trace_osnoise.c | 14 ++--- kernel/trace/trace_printk.c | 2 +- kernel/trace/trace_recursion_record.c | 4 +- kernel/trace/trace_stack.c | 6 +-- kernel/trace/trace_stat.c | 6 +-- kernel/trace/trace_uprobe.c | 4 +- 15 files changed, 103 insertions(+), 96 deletions(-)
kernel/trace/ftrace.c +12 -11
@@ -988,8 +988,9 @@ static __init void ftrace_profile_tracefs(struct dentry *d_tracer) } } - entry =tracefs_create_file ("function_profile_enabled" ,0644 , - d_tracer,NULL , &ftrace_profile_fops); + entry =tracefs_create_file ("function_profile_enabled" , +TRACE_MODE_WRITE , d_tracer,NULL , + &ftrace_profile_fops);if (!entry)pr_warn ("Could not create tracefs 'function_profile_enabled' entry\n" ); }
@@ -6109,10 +6110,10 @@ void ftrace_create_filter_files(struct ftrace_ops *ops, struct dentry *parent) { -trace_create_file ("set_ftrace_filter" ,0644 , parent, +trace_create_file ("set_ftrace_filter" ,TRACE_MODE_WRITE , parent, ops, &ftrace_filter_fops); -trace_create_file ("set_ftrace_notrace" ,0644 , parent, +trace_create_file ("set_ftrace_notrace" ,TRACE_MODE_WRITE , parent, ops, &ftrace_notrace_fops); }
@@ -6139,19 +6140,19 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops)static __init int ftrace_init_dyn_tracefs (struct dentry *d_tracer) { -trace_create_file ("available_filter_functions" ,0444 , +trace_create_file ("available_filter_functions" ,TRACE_MODE_READ , d_tracer,NULL , &ftrace_avail_fops); -trace_create_file ("enabled_functions" ,0444 , +trace_create_file ("enabled_functions" ,TRACE_MODE_READ , d_tracer,NULL , &ftrace_enabled_fops);ftrace_create_filter_files (&global_ops, d_tracer);#ifdef CONFIG_FUNCTION_GRAPH_TRACER -trace_create_file ("set_graph_function" ,0644 , d_tracer, +trace_create_file ("set_graph_function" ,TRACE_MODE_WRITE , d_tracer,NULL , &ftrace_graph_fops); -trace_create_file ("set_graph_notrace" ,0644 , d_tracer, +trace_create_file ("set_graph_notrace" ,TRACE_MODE_WRITE , d_tracer,NULL , &ftrace_graph_notrace_fops);#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
@@ -7494,10 +7495,10 @@ static const struct file_operations ftrace_no_pid_fops = {void ftrace_init_tracefs (struct trace_array *tr,struct dentry *d_tracer) { -trace_create_file ("set_ftrace_pid" ,0644 , d_tracer, +trace_create_file ("set_ftrace_pid" ,TRACE_MODE_WRITE , d_tracer, tr, &ftrace_pid_fops); -trace_create_file ("set_ftrace_notrace_pid" ,0644 , d_tracer, - tr, &ftrace_no_pid_fops); +trace_create_file ("set_ftrace_notrace_pid" ,TRACE_MODE_WRITE , + d_tracer, tr, &ftrace_no_pid_fops); } void __init ftrace_init_tracefs_toplevel(struct trace_array *tr,
kernel/trace/trace.c +37 -36
191 lines not on this page · raw message
kernel/trace/trace.h +3 -0
@@ -27,6 +27,9 @@#include <asm/syscall.h> /* some archs define it here */ #endif +#define TRACE_MODE_WRITE 0640 +#define TRACE_MODE_READ 0440 +enum trace_type { __TRACE_FIRST_TYPE =0 ,
kernel/trace/trace_dynevent.c +1 -1
@@ -224,7 +224,7 @@ static __init int init_dynamic_event(void)if (ret)return 0 ; - entry =tracefs_create_file ("dynamic_events" ,0644 ,NULL , + entry =tracefs_create_file ("dynamic_events" ,TRACE_MODE_WRITE ,NULL ,NULL , &dynamic_events_ops);/* Event list interface */
kernel/trace/trace_events.c +22 -20
116 lines not on this page · raw message
kernel/trace/trace_events_synth.c +2 -2
@@ -2222,8 +2222,8 @@ static __init int trace_events_synth_init(void)if (err) goto err; - entry =tracefs_create_file ("synthetic_events" ,0644 ,NULL , -NULL , &synth_events_fops); + entry =tracefs_create_file ("synthetic_events" ,TRACE_MODE_WRITE , +NULL ,NULL , &synth_events_fops);if (!entry) { err = -ENODEV ; goto err;
kernel/trace/trace_functions_graph.c +1 -1
@@ -1340,7 +1340,7 @@ static __init int init_graph_tracefs(void)if (ret)return 0 ; -trace_create_file ("max_graph_depth" ,0644 ,NULL , +trace_create_file ("max_graph_depth" ,TRACE_MODE_WRITE ,NULL ,NULL , &graph_depth_fops);return 0 ;
kernel/trace/trace_hwlat.c +3 -3
@@ -782,21 +782,21 @@ static int init_tracefs(void)if (!top_dir)return -ENOMEM ; - hwlat_sample_window =tracefs_create_file ("window" ,0640 , + hwlat_sample_window =tracefs_create_file ("window" ,TRACE_MODE_WRITE , top_dir, &hwlat_window, &trace_min_max_fops);if (!hwlat_sample_window) goto err; - hwlat_sample_width =tracefs_create_file ("width" ,0644 , + hwlat_sample_width =tracefs_create_file ("width" ,TRACE_MODE_WRITE , top_dir, &hwlat_width, &trace_min_max_fops);if (!hwlat_sample_width) goto err; - hwlat_thread_mode =trace_create_file ("mode" ,0644 , + hwlat_thread_mode =trace_create_file ("mode" ,TRACE_MODE_WRITE , top_dir,NULL , &thread_mode_fops);
kernel/trace/trace_kprobe.c +4 -4
@@ -1930,16 +1930,16 @@ static __init int init_kprobe_trace(void)if (ret)return 0 ; - entry =tracefs_create_file ("kprobe_events" ,0644 ,NULL , -NULL , &kprobe_events_ops); + entry =tracefs_create_file ("kprobe_events" ,TRACE_MODE_WRITE , +NULL ,NULL , &kprobe_events_ops);/* Event list interface */ if (!entry)pr_warn ("Could not create tracefs 'kprobe_events' entry\n" );/* Profile interface */ - entry =tracefs_create_file ("kprobe_profile" ,0444 ,NULL , -NULL , &kprobe_profile_ops); + entry =tracefs_create_file ("kprobe_profile" ,TRACE_MODE_READ , +NULL ,NULL , &kprobe_profile_ops);if (!entry)pr_warn ("Could not create tracefs 'kprobe_profile' entry\n" );
kernel/trace/trace_osnoise.c +7 -7
@@ -1856,38 +1856,38 @@ static int init_tracefs(void)if (!top_dir)return 0 ; - tmp =tracefs_create_file ("period_us" ,0640 , top_dir, + tmp =tracefs_create_file ("period_us" ,TRACE_MODE_WRITE , top_dir, &osnoise_period, &trace_min_max_fops);if (!tmp) goto err; - tmp =tracefs_create_file ("runtime_us" ,0644 , top_dir, + tmp =tracefs_create_file ("runtime_us" ,TRACE_MODE_WRITE , top_dir, &osnoise_runtime, &trace_min_max_fops);if (!tmp) goto err; - tmp =tracefs_create_file ("stop_tracing_us" ,0640 , top_dir, + tmp =tracefs_create_file ("stop_tracing_us" ,TRACE_MODE_WRITE , top_dir, &osnoise_stop_tracing_in, &trace_min_max_fops);if (!tmp) goto err; - tmp =tracefs_create_file ("stop_tracing_total_us" ,0640 , top_dir, + tmp =tracefs_create_file ("stop_tracing_total_us" ,TRACE_MODE_WRITE , top_dir, &osnoise_stop_tracing_total, &trace_min_max_fops);if (!tmp) goto err; - tmp =trace_create_file ("cpus" ,0644 , top_dir,NULL , &cpus_fops); + tmp =trace_create_file ("cpus" ,TRACE_MODE_WRITE , top_dir,NULL , &cpus_fops);if (!tmp) goto err;#ifdef CONFIG_TIMERLAT_TRACER #ifdef CONFIG_STACKTRACE - tmp =tracefs_create_file ("print_stack" ,0640 , top_dir, + tmp =tracefs_create_file ("print_stack" ,TRACE_MODE_WRITE , top_dir, &osnoise_print_stack, &trace_min_max_fops);if (!tmp) goto err;#endif - tmp =tracefs_create_file ("timerlat_period_us" ,0640 , top_dir, + tmp =tracefs_create_file ("timerlat_period_us" ,TRACE_MODE_WRITE , top_dir, &timerlat_period, &trace_min_max_fops);if (!tmp) goto err;
kernel/trace/trace_printk.c +1 -1
@@ -384,7 +384,7 @@ static __init int init_trace_printk_function_export(void)if (ret)return 0 ; -trace_create_file ("printk_formats" ,0444 ,NULL , +trace_create_file ("printk_formats" ,TRACE_MODE_READ ,NULL ,NULL , &ftrace_formats_fops);return 0 ;
kernel/trace/trace_recursion_record.c +2 -2
@@ -226,8 +226,8 @@ __init static int create_recursed_functions(void) {struct dentry *dentry; - dentry =trace_create_file ("recursed_functions" ,0644 ,NULL ,NULL , - &recursed_functions_fops); + dentry =trace_create_file ("recursed_functions" ,TRACE_MODE_WRITE , +NULL ,NULL , &recursed_functions_fops);if (!dentry)pr_warn ("WARNING: Failed to create recursed_functions\n" );return 0 ;
kernel/trace/trace_stack.c +3 -3
@@ -559,14 +559,14 @@ static __init int stack_trace_init(void)if (ret)return 0 ; -trace_create_file ("stack_max_size" ,0644 ,NULL , +trace_create_file ("stack_max_size" ,TRACE_MODE_WRITE ,NULL , &stack_trace_max_size, &stack_max_size_fops); -trace_create_file ("stack_trace" ,0444 ,NULL , +trace_create_file ("stack_trace" ,TRACE_MODE_READ ,NULL ,NULL , &stack_trace_fops);#ifdef CONFIG_DYNAMIC_FTRACE -trace_create_file ("stack_trace_filter" ,0644 ,NULL , +trace_create_file ("stack_trace_filter" ,TRACE_MODE_WRITE ,NULL , &trace_ops, &stack_trace_filter_fops);#endif
kernel/trace/trace_stat.c +3 -3
@@ -297,9 +297,9 @@ static int init_stat_file(struct stat_session *session)if (!stat_dir && (ret =tracing_stat_init ()))return ret; - session->file =tracefs_create_file (session->ts->name,0644 , - stat_dir, - session, &tracing_stat_fops); + session->file =tracefs_create_file (session->ts->name,TRACE_MODE_WRITE , + stat_dir, session, + &tracing_stat_fops);if (!session->file)return -ENOMEM ;return 0 ;
kernel/trace/trace_uprobe.c +2 -2
@@ -1653,10 +1653,10 @@ static __init int init_uprobe_trace(void)if (ret)return 0 ; -trace_create_file ("uprobe_events" ,0644 ,NULL , +trace_create_file ("uprobe_events" ,TRACE_MODE_WRITE ,NULL ,NULL , &uprobe_events_ops);/* Profile interface */ -trace_create_file ("uprobe_profile" ,0444 ,NULL , +trace_create_file ("uprobe_profile" ,TRACE_MODE_READ ,NULL ,NULL , &uprobe_profile_ops);return 0 ; }
Signature · 1 line
2.30.2