@@ -5300,6 +5300,234 @@ int BPF_KPROBE(trace_chmod_common)
53005300 return events_perf_submit (& p , 0 );
53015301}
53025302
5303+ SEC ("kprobe/security_task_prctl" )
5304+ int BPF_KPROBE (trace_security_task_prctl )
5305+ {
5306+ program_data_t p = {};
5307+ if (!init_program_data (& p , ctx , SECURITY_TASK_PRCTL ))
5308+ return 0 ;
5309+
5310+ if (!evaluate_scope_filters (& p ))
5311+ return 0 ;
5312+
5313+ // Save raw args
5314+ int option = PT_REGS_PARM1 (ctx );
5315+ unsigned long arg2 = PT_REGS_PARM2 (ctx );
5316+ unsigned long arg3 = PT_REGS_PARM3 (ctx );
5317+ unsigned long arg4 = PT_REGS_PARM4 (ctx );
5318+ unsigned long arg5 = PT_REGS_PARM5 (ctx );
5319+ save_to_submit_buf (& p .event -> args_buf , & option , sizeof (option ), 0 );
5320+ save_to_submit_buf (& p .event -> args_buf , & arg2 , sizeof (arg2 ), 1 );
5321+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 2 );
5322+ save_to_submit_buf (& p .event -> args_buf , & arg4 , sizeof (arg4 ), 3 );
5323+ save_to_submit_buf (& p .event -> args_buf , & arg5 , sizeof (arg5 ), 4 );
5324+
5325+ // Save PR_SET_VMA arg
5326+ if (option == PR_SET_VMA )
5327+ save_str_to_buf (& p .event -> args_buf , (char * ) arg5 , 5 );
5328+
5329+ // Save PR_SET_MM args
5330+ if (option == PR_SET_MM ) {
5331+ // Save all old mm info regardless of operation
5332+ struct mm_struct * mm = get_mm_from_task (p .event -> task );
5333+ save_to_submit_buf (& p .event -> args_buf ,
5334+ __builtin_preserve_access_index (& mm -> start_code ),
5335+ sizeof (mm -> start_code ),
5336+ 6 );
5337+ save_to_submit_buf (& p .event -> args_buf ,
5338+ __builtin_preserve_access_index (& mm -> end_code ),
5339+ sizeof (mm -> end_code ),
5340+ 7 );
5341+ save_to_submit_buf (& p .event -> args_buf ,
5342+ __builtin_preserve_access_index (& mm -> start_data ),
5343+ sizeof (mm -> start_data ),
5344+ 8 );
5345+ save_to_submit_buf (& p .event -> args_buf ,
5346+ __builtin_preserve_access_index (& mm -> end_data ),
5347+ sizeof (mm -> end_data ),
5348+ 9 );
5349+ save_to_submit_buf (& p .event -> args_buf ,
5350+ __builtin_preserve_access_index (& mm -> start_brk ),
5351+ sizeof (mm -> start_brk ),
5352+ 10 );
5353+ save_to_submit_buf (
5354+ & p .event -> args_buf , __builtin_preserve_access_index (& mm -> brk ), sizeof (mm -> brk ), 11 );
5355+ save_to_submit_buf (& p .event -> args_buf ,
5356+ __builtin_preserve_access_index (& mm -> start_stack ),
5357+ sizeof (mm -> start_stack ),
5358+ 12 );
5359+ save_to_submit_buf (& p .event -> args_buf ,
5360+ __builtin_preserve_access_index (& mm -> arg_start ),
5361+ sizeof (mm -> arg_start ),
5362+ 13 );
5363+ save_to_submit_buf (& p .event -> args_buf ,
5364+ __builtin_preserve_access_index (& mm -> arg_end ),
5365+ sizeof (mm -> arg_end ),
5366+ 14 );
5367+ save_to_submit_buf (& p .event -> args_buf ,
5368+ __builtin_preserve_access_index (& mm -> env_start ),
5369+ sizeof (mm -> env_start ),
5370+ 15 );
5371+ save_to_submit_buf (& p .event -> args_buf ,
5372+ __builtin_preserve_access_index (& mm -> env_end ),
5373+ sizeof (mm -> env_end ),
5374+ 16 );
5375+ void * saved_auxv ;
5376+ u32 size ;
5377+ if (bpf_core_field_exists (mm -> saved_auxv )) {
5378+ saved_auxv = BPF_CORE_READ (mm , saved_auxv );
5379+ size = bpf_core_field_size (mm -> saved_auxv );
5380+ }
5381+ // Red Hat version
5382+ else {
5383+ struct mm_struct___redhat * mm_redhat = (struct mm_struct___redhat * ) mm ;
5384+ saved_auxv = BPF_CORE_READ (mm_redhat , mm_rh , saved_auxv );
5385+ size = bpf_core_field_size (mm_redhat -> mm_rh -> saved_auxv );
5386+ }
5387+ save_bytes_to_buf (& p .event -> args_buf , saved_auxv , size , 17 );
5388+
5389+ struct file * exe = BPF_CORE_READ (mm , exe_file );
5390+ void * exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5391+ dev_t exe_dev = get_dev_from_file (exe );
5392+ unsigned long exe_inode = get_inode_nr_from_file (exe );
5393+ u64 exe_ctime = get_ctime_nanosec_from_file (exe );
5394+ umode_t exe_inode_mode = get_inode_mode_from_file (exe );
5395+
5396+ save_str_to_buf (& p .event -> args_buf , exe_path , 18 );
5397+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 19 );
5398+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 20 );
5399+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 21 );
5400+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 22 );
5401+
5402+ struct prctl_mm_map * mm_map ;
5403+
5404+ // Save new mm info according to operation
5405+ switch (arg2 ) {
5406+ case PR_SET_MM_START_CODE :
5407+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 23 );
5408+ break ;
5409+ case PR_SET_MM_END_CODE :
5410+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 24 );
5411+ break ;
5412+ case PR_SET_MM_START_DATA :
5413+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 25 );
5414+ break ;
5415+ case PR_SET_MM_END_DATA :
5416+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 26 );
5417+ break ;
5418+ case PR_SET_MM_START_BRK :
5419+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 27 );
5420+ break ;
5421+ case PR_SET_MM_BRK :
5422+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 28 );
5423+ break ;
5424+ case PR_SET_MM_START_STACK :
5425+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 29 );
5426+ break ;
5427+ case PR_SET_MM_ARG_START :
5428+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 30 );
5429+ break ;
5430+ case PR_SET_MM_ARG_END :
5431+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 31 );
5432+ break ;
5433+ case PR_SET_MM_ENV_START :
5434+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 32 );
5435+ break ;
5436+ case PR_SET_MM_ENV_END :
5437+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 33 );
5438+ break ;
5439+ case PR_SET_MM_AUXV :
5440+ save_bytes_to_buf (& p .event -> args_buf , (void * ) arg3 , arg4 , 34 );
5441+ break ;
5442+ case PR_SET_MM_EXE_FILE :
5443+ exe = get_struct_file_from_fd (arg3 );
5444+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5445+ exe_dev = get_dev_from_file (exe );
5446+ exe_inode = get_inode_nr_from_file (exe );
5447+ exe_ctime = get_ctime_nanosec_from_file (exe );
5448+ exe_inode_mode = get_inode_mode_from_file (exe );
5449+
5450+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5451+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5452+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5453+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5454+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5455+
5456+ break ;
5457+ case PR_SET_MM_MAP :
5458+ mm_map = (struct prctl_mm_map * ) arg3 ;
5459+ save_to_submit_buf (& p .event -> args_buf ,
5460+ __builtin_preserve_access_index (& mm_map -> start_code ),
5461+ sizeof (mm_map -> start_code ),
5462+ 23 );
5463+ save_to_submit_buf (& p .event -> args_buf ,
5464+ __builtin_preserve_access_index (& mm_map -> end_code ),
5465+ sizeof (mm_map -> end_code ),
5466+ 24 );
5467+ save_to_submit_buf (& p .event -> args_buf ,
5468+ __builtin_preserve_access_index (& mm_map -> start_data ),
5469+ sizeof (mm_map -> start_data ),
5470+ 25 );
5471+ save_to_submit_buf (& p .event -> args_buf ,
5472+ __builtin_preserve_access_index (& mm_map -> end_data ),
5473+ sizeof (mm_map -> end_data ),
5474+ 26 );
5475+ save_to_submit_buf (& p .event -> args_buf ,
5476+ __builtin_preserve_access_index (& mm_map -> start_brk ),
5477+ sizeof (mm_map -> start_brk ),
5478+ 27 );
5479+ save_to_submit_buf (& p .event -> args_buf ,
5480+ __builtin_preserve_access_index (& mm_map -> brk ),
5481+ sizeof (mm_map -> brk ),
5482+ 28 );
5483+ save_to_submit_buf (& p .event -> args_buf ,
5484+ __builtin_preserve_access_index (& mm_map -> start_stack ),
5485+ sizeof (mm_map -> start_stack ),
5486+ 29 );
5487+ save_to_submit_buf (& p .event -> args_buf ,
5488+ __builtin_preserve_access_index (& mm_map -> arg_start ),
5489+ sizeof (mm_map -> arg_start ),
5490+ 30 );
5491+ save_to_submit_buf (& p .event -> args_buf ,
5492+ __builtin_preserve_access_index (& mm_map -> arg_end ),
5493+ sizeof (mm_map -> arg_end ),
5494+ 31 );
5495+ save_to_submit_buf (& p .event -> args_buf ,
5496+ __builtin_preserve_access_index (& mm_map -> env_start ),
5497+ sizeof (mm_map -> env_start ),
5498+ 32 );
5499+ save_to_submit_buf (& p .event -> args_buf ,
5500+ __builtin_preserve_access_index (& mm_map -> env_end ),
5501+ sizeof (mm_map -> env_end ),
5502+ 33 );
5503+ save_bytes_to_buf (& p .event -> args_buf ,
5504+ BPF_CORE_READ_USER (mm_map , auxv ),
5505+ BPF_CORE_READ_USER (mm_map , auxv_size ),
5506+ 34 );
5507+
5508+ exe = get_struct_file_from_fd (BPF_CORE_READ_USER (mm_map , exe_fd ));
5509+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5510+ exe_dev = get_dev_from_file (exe );
5511+ exe_inode = get_inode_nr_from_file (exe );
5512+ exe_ctime = get_ctime_nanosec_from_file (exe );
5513+ exe_inode_mode = get_inode_mode_from_file (exe );
5514+
5515+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5516+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5517+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5518+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5519+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5520+
5521+ break ;
5522+ default :
5523+ // unknown/invalid operation
5524+ return 0 ;
5525+ }
5526+ }
5527+
5528+ return events_perf_submit (& p , 0 );
5529+ }
5530+
53035531//
53045532// Syscall checkers
53055533//
0 commit comments