@@ -5387,6 +5387,250 @@ int BPF_KPROBE(trace_chmod_common)
53875387 return events_perf_submit (& p , 0 );
53885388}
53895389
5390+ SEC ("kprobe/security_task_prctl" )
5391+ int BPF_KPROBE (trace_security_task_prctl )
5392+ {
5393+ program_data_t p = {};
5394+ if (!init_program_data (& p , ctx , SECURITY_TASK_PRCTL ))
5395+ return 0 ;
5396+
5397+ if (!evaluate_scope_filters (& p ))
5398+ return 0 ;
5399+
5400+ // Save raw args
5401+ int option = PT_REGS_PARM1 (ctx );
5402+ unsigned long arg2 = PT_REGS_PARM2 (ctx );
5403+ unsigned long arg3 = PT_REGS_PARM3 (ctx );
5404+ unsigned long arg4 = PT_REGS_PARM4 (ctx );
5405+ unsigned long arg5 = PT_REGS_PARM5 (ctx );
5406+ save_to_submit_buf (& p .event -> args_buf , & option , sizeof (option ), 0 );
5407+ save_to_submit_buf (& p .event -> args_buf , & arg2 , sizeof (arg2 ), 1 );
5408+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 2 );
5409+ save_to_submit_buf (& p .event -> args_buf , & arg4 , sizeof (arg4 ), 3 );
5410+ save_to_submit_buf (& p .event -> args_buf , & arg5 , sizeof (arg5 ), 4 );
5411+
5412+ // Save PR_SET_VMA arg
5413+ if (option == PR_SET_VMA && arg2 == PR_SET_VMA_ANON_NAME && arg5 != 0 )
5414+ save_str_to_buf (& p .event -> args_buf , (char * ) arg5 , 5 );
5415+
5416+ // Save PR_SET_MM args
5417+ if (option == PR_SET_MM ) {
5418+ // Save all old mm info regardless of operation
5419+ struct mm_struct * mm = get_mm_from_task (p .event -> task );
5420+ save_to_submit_buf (& p .event -> args_buf ,
5421+ __builtin_preserve_access_index (& mm -> start_code ),
5422+ sizeof (mm -> start_code ),
5423+ 6 );
5424+ save_to_submit_buf (& p .event -> args_buf ,
5425+ __builtin_preserve_access_index (& mm -> end_code ),
5426+ sizeof (mm -> end_code ),
5427+ 7 );
5428+ save_to_submit_buf (& p .event -> args_buf ,
5429+ __builtin_preserve_access_index (& mm -> start_data ),
5430+ sizeof (mm -> start_data ),
5431+ 8 );
5432+ save_to_submit_buf (& p .event -> args_buf ,
5433+ __builtin_preserve_access_index (& mm -> end_data ),
5434+ sizeof (mm -> end_data ),
5435+ 9 );
5436+ save_to_submit_buf (& p .event -> args_buf ,
5437+ __builtin_preserve_access_index (& mm -> start_brk ),
5438+ sizeof (mm -> start_brk ),
5439+ 10 );
5440+ save_to_submit_buf (
5441+ & p .event -> args_buf , __builtin_preserve_access_index (& mm -> brk ), sizeof (mm -> brk ), 11 );
5442+ save_to_submit_buf (& p .event -> args_buf ,
5443+ __builtin_preserve_access_index (& mm -> start_stack ),
5444+ sizeof (mm -> start_stack ),
5445+ 12 );
5446+ save_to_submit_buf (& p .event -> args_buf ,
5447+ __builtin_preserve_access_index (& mm -> arg_start ),
5448+ sizeof (mm -> arg_start ),
5449+ 13 );
5450+ save_to_submit_buf (& p .event -> args_buf ,
5451+ __builtin_preserve_access_index (& mm -> arg_end ),
5452+ sizeof (mm -> arg_end ),
5453+ 14 );
5454+ save_to_submit_buf (& p .event -> args_buf ,
5455+ __builtin_preserve_access_index (& mm -> env_start ),
5456+ sizeof (mm -> env_start ),
5457+ 15 );
5458+ save_to_submit_buf (& p .event -> args_buf ,
5459+ __builtin_preserve_access_index (& mm -> env_end ),
5460+ sizeof (mm -> env_end ),
5461+ 16 );
5462+ void * saved_auxv ;
5463+ u32 size ;
5464+ struct mm_struct___redhat * mm_redhat = (struct mm_struct___redhat * ) mm ;
5465+ // Upstream kernel
5466+ if (bpf_core_field_exists (mm -> saved_auxv )) {
5467+ saved_auxv = __builtin_preserve_access_index (& mm -> saved_auxv );
5468+ size = bpf_core_field_size (mm -> saved_auxv );
5469+ }
5470+ // Red Hat kernel
5471+ else if (bpf_core_field_exists (mm_redhat -> mm_rh )) {
5472+ struct mm_struct_rh * mm_rh = BPF_CORE_READ (mm_redhat , mm_rh );
5473+ saved_auxv = __builtin_preserve_access_index (& mm_rh -> saved_auxv );
5474+ size = bpf_core_field_size (mm_rh -> saved_auxv );
5475+ }
5476+ // Unknown variation of mm_struct
5477+ else
5478+ return 0 ;
5479+
5480+ save_bytes_to_buf (& p .event -> args_buf , saved_auxv , size , 17 );
5481+
5482+ struct file * exe = BPF_CORE_READ (mm , exe_file );
5483+ void * exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5484+ dev_t exe_dev = get_dev_from_file (exe );
5485+ unsigned long exe_inode = get_inode_nr_from_file (exe );
5486+ u64 exe_ctime = get_ctime_nanosec_from_file (exe );
5487+ umode_t exe_inode_mode = get_inode_mode_from_file (exe );
5488+
5489+ save_str_to_buf (& p .event -> args_buf , exe_path , 18 );
5490+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 19 );
5491+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 20 );
5492+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 21 );
5493+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 22 );
5494+
5495+ struct prctl_mm_map * mm_map ;
5496+
5497+ // Save new mm info according to operation
5498+ switch (arg2 ) {
5499+ case PR_SET_MM_START_CODE :
5500+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 23 );
5501+ break ;
5502+ case PR_SET_MM_END_CODE :
5503+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 24 );
5504+ break ;
5505+ case PR_SET_MM_START_DATA :
5506+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 25 );
5507+ break ;
5508+ case PR_SET_MM_END_DATA :
5509+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 26 );
5510+ break ;
5511+ case PR_SET_MM_START_BRK :
5512+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 27 );
5513+ break ;
5514+ case PR_SET_MM_BRK :
5515+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 28 );
5516+ break ;
5517+ case PR_SET_MM_START_STACK :
5518+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 29 );
5519+ break ;
5520+ case PR_SET_MM_ARG_START :
5521+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 30 );
5522+ break ;
5523+ case PR_SET_MM_ARG_END :
5524+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 31 );
5525+ break ;
5526+ case PR_SET_MM_ENV_START :
5527+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 32 );
5528+ break ;
5529+ case PR_SET_MM_ENV_END :
5530+ save_to_submit_buf (& p .event -> args_buf , & arg3 , sizeof (arg3 ), 33 );
5531+ break ;
5532+ case PR_SET_MM_AUXV :
5533+ size = AT_VECTOR_SIZE * sizeof (unsigned long );
5534+ if (arg4 < size )
5535+ size = arg4 ;
5536+ save_bytes_to_buf (& p .event -> args_buf , (void * ) arg3 , size , 34 );
5537+ break ;
5538+ case PR_SET_MM_EXE_FILE :
5539+ exe = get_struct_file_from_fd (arg3 );
5540+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5541+ exe_dev = get_dev_from_file (exe );
5542+ exe_inode = get_inode_nr_from_file (exe );
5543+ exe_ctime = get_ctime_nanosec_from_file (exe );
5544+ exe_inode_mode = get_inode_mode_from_file (exe );
5545+
5546+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5547+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5548+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5549+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5550+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5551+
5552+ break ;
5553+ case PR_SET_MM_MAP :
5554+ mm_map = (struct prctl_mm_map * ) arg3 ;
5555+ save_to_submit_buf (& p .event -> args_buf ,
5556+ __builtin_preserve_access_index (& mm_map -> start_code ),
5557+ sizeof (mm_map -> start_code ),
5558+ 23 );
5559+ save_to_submit_buf (& p .event -> args_buf ,
5560+ __builtin_preserve_access_index (& mm_map -> end_code ),
5561+ sizeof (mm_map -> end_code ),
5562+ 24 );
5563+ save_to_submit_buf (& p .event -> args_buf ,
5564+ __builtin_preserve_access_index (& mm_map -> start_data ),
5565+ sizeof (mm_map -> start_data ),
5566+ 25 );
5567+ save_to_submit_buf (& p .event -> args_buf ,
5568+ __builtin_preserve_access_index (& mm_map -> end_data ),
5569+ sizeof (mm_map -> end_data ),
5570+ 26 );
5571+ save_to_submit_buf (& p .event -> args_buf ,
5572+ __builtin_preserve_access_index (& mm_map -> start_brk ),
5573+ sizeof (mm_map -> start_brk ),
5574+ 27 );
5575+ save_to_submit_buf (& p .event -> args_buf ,
5576+ __builtin_preserve_access_index (& mm_map -> brk ),
5577+ sizeof (mm_map -> brk ),
5578+ 28 );
5579+ save_to_submit_buf (& p .event -> args_buf ,
5580+ __builtin_preserve_access_index (& mm_map -> start_stack ),
5581+ sizeof (mm_map -> start_stack ),
5582+ 29 );
5583+ save_to_submit_buf (& p .event -> args_buf ,
5584+ __builtin_preserve_access_index (& mm_map -> arg_start ),
5585+ sizeof (mm_map -> arg_start ),
5586+ 30 );
5587+ save_to_submit_buf (& p .event -> args_buf ,
5588+ __builtin_preserve_access_index (& mm_map -> arg_end ),
5589+ sizeof (mm_map -> arg_end ),
5590+ 31 );
5591+ save_to_submit_buf (& p .event -> args_buf ,
5592+ __builtin_preserve_access_index (& mm_map -> env_start ),
5593+ sizeof (mm_map -> env_start ),
5594+ 32 );
5595+ save_to_submit_buf (& p .event -> args_buf ,
5596+ __builtin_preserve_access_index (& mm_map -> env_end ),
5597+ sizeof (mm_map -> env_end ),
5598+ 33 );
5599+ save_bytes_to_buf (& p .event -> args_buf ,
5600+ BPF_CORE_READ_USER (mm_map , auxv ),
5601+ BPF_CORE_READ_USER (mm_map , auxv_size ),
5602+ 34 );
5603+
5604+ exe = get_struct_file_from_fd (BPF_CORE_READ_USER (mm_map , exe_fd ));
5605+ exe_path = get_path_str (__builtin_preserve_access_index (& exe -> f_path ));
5606+ exe_dev = get_dev_from_file (exe );
5607+ exe_inode = get_inode_nr_from_file (exe );
5608+ exe_ctime = get_ctime_nanosec_from_file (exe );
5609+ exe_inode_mode = get_inode_mode_from_file (exe );
5610+
5611+ save_str_to_buf (& p .event -> args_buf , exe_path , 35 );
5612+ save_to_submit_buf (& p .event -> args_buf , & exe_dev , sizeof (exe_dev ), 36 );
5613+ save_to_submit_buf (& p .event -> args_buf , & exe_inode , sizeof (exe_inode ), 37 );
5614+ save_to_submit_buf (& p .event -> args_buf , & exe_ctime , sizeof (exe_ctime ), 38 );
5615+ save_to_submit_buf (& p .event -> args_buf , & exe_inode_mode , sizeof (exe_inode_mode ), 39 );
5616+
5617+ break ;
5618+ default :
5619+ // unknown/invalid operation
5620+ return 0 ;
5621+ }
5622+ }
5623+
5624+ // Save old securebits for PR_SET_SECUREBITS
5625+ if (option == PR_SET_SECUREBITS ) {
5626+ struct task_struct * task = p .event -> task ;
5627+ unsigned int old_securebits = BPF_CORE_READ (task , cred , securebits );
5628+ save_to_submit_buf (& p .event -> args_buf , & old_securebits , sizeof (old_securebits ), 40 );
5629+ }
5630+
5631+ return events_perf_submit (& p , 0 );
5632+ }
5633+
53905634//
53915635// Syscall checkers
53925636//
0 commit comments