@@ -5300,6 +5300,225 @@ 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+ save_bytes_to_buf (& p .event -> args_buf ,
5376+ __builtin_preserve_access_index (& mm -> saved_auxv ),
5377+ bpf_core_field_size (mm -> saved_auxv ),
5378+ 17 );
5379+
5380+ struct file * exe = BPF_CORE_READ (mm , exe_file );
5381+ void * exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5382+ dev_t exe_dev = get_dev_from_file (exe );
5383+ unsigned long exe_inode = get_inode_nr_from_file (exe );
5384+ u64 exe_ctime = get_ctime_nanosec_from_file (exe );
5385+ umode_t exe_inode_mode = get_inode_mode_from_file (exe );
5386+
5387+ save_str_to_buf (& p .event -> args_buf , exe_path , 18 );
5388+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 19 );
5389+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 20 );
5390+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 21 );
5391+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 22 );
5392+
5393+ struct prctl_mm_map * mm_map ;
5394+
5395+ // Save new mm info according to operation
5396+ switch (arg2 ) {
5397+ case PR_SET_MM_START_CODE :
5398+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 23 );
5399+ break ;
5400+ case PR_SET_MM_END_CODE :
5401+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 24 );
5402+ break ;
5403+ case PR_SET_MM_START_DATA :
5404+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 25 );
5405+ break ;
5406+ case PR_SET_MM_END_DATA :
5407+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 26 );
5408+ break ;
5409+ case PR_SET_MM_START_BRK :
5410+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 27 );
5411+ break ;
5412+ case PR_SET_MM_BRK :
5413+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 28 );
5414+ break ;
5415+ case PR_SET_MM_START_STACK :
5416+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 29 );
5417+ break ;
5418+ case PR_SET_MM_ARG_START :
5419+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 30 );
5420+ break ;
5421+ case PR_SET_MM_ARG_END :
5422+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 31 );
5423+ break ;
5424+ case PR_SET_MM_ENV_START :
5425+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 32 );
5426+ break ;
5427+ case PR_SET_MM_ENV_END :
5428+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 33 );
5429+ break ;
5430+ case PR_SET_MM_AUXV :
5431+ save_bytes_to_buf (& p .event -> args_buf , (void * ) arg3 , arg4 , 34 );
5432+ break ;
5433+ case PR_SET_MM_EXE_FILE :
5434+ exe = get_struct_file_from_fd (arg3 );
5435+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5436+ exe_dev = get_dev_from_file (exe );
5437+ exe_inode = get_inode_nr_from_file (exe );
5438+ exe_ctime = get_ctime_nanosec_from_file (exe );
5439+ exe_inode_mode = get_inode_mode_from_file (exe );
5440+
5441+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5442+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5443+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5444+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5445+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5446+
5447+ break ;
5448+ case PR_SET_MM_MAP :
5449+ mm_map = (struct prctl_mm_map * ) arg3 ;
5450+ save_to_submit_buf (& p .event -> args_buf ,
5451+ __builtin_preserve_access_index (& mm_map -> start_code ),
5452+ sizeof (mm_map -> start_code ),
5453+ 23 );
5454+ save_to_submit_buf (& p .event -> args_buf ,
5455+ __builtin_preserve_access_index (& mm_map -> end_code ),
5456+ sizeof (mm_map -> end_code ),
5457+ 24 );
5458+ save_to_submit_buf (& p .event -> args_buf ,
5459+ __builtin_preserve_access_index (& mm_map -> start_data ),
5460+ sizeof (mm_map -> start_data ),
5461+ 25 );
5462+ save_to_submit_buf (& p .event -> args_buf ,
5463+ __builtin_preserve_access_index (& mm_map -> end_data ),
5464+ sizeof (mm_map -> end_data ),
5465+ 26 );
5466+ save_to_submit_buf (& p .event -> args_buf ,
5467+ __builtin_preserve_access_index (& mm_map -> start_brk ),
5468+ sizeof (mm_map -> start_brk ),
5469+ 27 );
5470+ save_to_submit_buf (& p .event -> args_buf ,
5471+ __builtin_preserve_access_index (& mm_map -> brk ),
5472+ sizeof (mm_map -> brk ),
5473+ 28 );
5474+ save_to_submit_buf (& p .event -> args_buf ,
5475+ __builtin_preserve_access_index (& mm_map -> start_stack ),
5476+ sizeof (mm_map -> start_stack ),
5477+ 29 );
5478+ save_to_submit_buf (& p .event -> args_buf ,
5479+ __builtin_preserve_access_index (& mm_map -> arg_start ),
5480+ sizeof (mm_map -> arg_start ),
5481+ 30 );
5482+ save_to_submit_buf (& p .event -> args_buf ,
5483+ __builtin_preserve_access_index (& mm_map -> arg_end ),
5484+ sizeof (mm_map -> arg_end ),
5485+ 31 );
5486+ save_to_submit_buf (& p .event -> args_buf ,
5487+ __builtin_preserve_access_index (& mm_map -> env_start ),
5488+ sizeof (mm_map -> env_start ),
5489+ 32 );
5490+ save_to_submit_buf (& p .event -> args_buf ,
5491+ __builtin_preserve_access_index (& mm_map -> env_end ),
5492+ sizeof (mm_map -> env_end ),
5493+ 33 );
5494+ save_bytes_to_buf (& p .event -> args_buf ,
5495+ BPF_CORE_READ_USER (mm_map , auxv ),
5496+ BPF_CORE_READ_USER (mm_map , auxv_size ),
5497+ 34 );
5498+
5499+ exe = get_struct_file_from_fd (BPF_CORE_READ_USER (mm_map , exe_fd ));
5500+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5501+ exe_dev = get_dev_from_file (exe );
5502+ exe_inode = get_inode_nr_from_file (exe );
5503+ exe_ctime = get_ctime_nanosec_from_file (exe );
5504+ exe_inode_mode = get_inode_mode_from_file (exe );
5505+
5506+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5507+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5508+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5509+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5510+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5511+
5512+ break ;
5513+ default :
5514+ // unknown/invalid operation
5515+ return 0 ;
5516+ }
5517+ }
5518+
5519+ return events_perf_submit (& p , 0 );
5520+ }
5521+
53035522//
53045523// Syscall checkers
53055524//
0 commit comments