@@ -3,7 +3,7 @@ use std::{io, path::PathBuf, sync::Arc};
33use anyhow:: { bail, Context } ;
44use aya:: {
55 maps:: { Array , LpmTrie , MapData , PerCpuArray , RingBuf } ,
6- programs:: Lsm ,
6+ programs:: Program ,
77 Btf , Ebpf ,
88} ;
99use checks:: Checks ;
@@ -30,6 +30,8 @@ pub struct Bpf {
3030
3131 paths : Vec < path_prefix_t > ,
3232 paths_config : watch:: Receiver < Vec < PathBuf > > ,
33+
34+ use_lsm_hook : bool ,
3335}
3436
3537impl Bpf {
@@ -61,6 +63,7 @@ impl Bpf {
6163 tx,
6264 paths,
6365 paths_config,
66+ use_lsm_hook : checks. lsm_support ,
6467 } ;
6568
6669 bpf. load_paths ( ) ?;
@@ -138,24 +141,59 @@ impl Bpf {
138141 Ok ( ( ) )
139142 }
140143
141- fn load_lsm_prog ( & mut self , name : & str , hook : & str , btf : & Btf ) -> anyhow:: Result < ( ) > {
144+ fn load_prog ( & mut self , name : & str , btf : & Btf ) -> anyhow:: Result < ( ) > {
142145 let Some ( prog) = self . obj . program_mut ( name) else {
143146 bail ! ( "{name} program not found" ) ;
144147 } ;
145- let prog: & mut Lsm = prog. try_into ( ) ?;
146- prog. load ( hook, btf) ?;
148+
149+ match prog {
150+ Program :: Lsm ( lsm) => match name {
151+ "trace_file_open" => lsm. load ( "file_open" , btf) ?,
152+ "trace_path_unlink" => lsm. load ( "path_unlink" , btf) ?,
153+ name => bail ! ( "Unexpected LSM hook '{name}'" ) ,
154+ } ,
155+ Program :: KProbe ( kprobe) => kprobe. load ( ) ?,
156+ prog => bail ! ( "Unexpected program {prog:?}" ) ,
157+ }
158+
147159 Ok ( ( ) )
148160 }
149161
150162 fn load_progs ( & mut self , btf : & Btf ) -> anyhow:: Result < ( ) > {
151- self . load_lsm_prog ( "trace_file_open" , "file_open" , btf) ?;
152- self . load_lsm_prog ( "trace_path_unlink" , "path_unlink" , btf)
163+ if self . use_lsm_hook {
164+ debug ! ( "Loading LSM hooks" ) ;
165+ self . load_prog ( "trace_file_open" , btf) ?;
166+ self . load_prog ( "trace_path_unlink" , btf) ?;
167+ } else {
168+ debug ! ( "Loading KProbes" ) ;
169+ self . load_prog ( "kprobe_file_open" , btf) ?;
170+ self . load_prog ( "kprobe_path_unlink" , btf) ?;
171+ }
172+ Ok ( ( ) )
153173 }
154174
155175 fn attach_progs ( & mut self ) -> anyhow:: Result < ( ) > {
156- for ( _, prog) in self . obj . programs_mut ( ) {
157- let prog: & mut Lsm = prog. try_into ( ) ?;
158- prog. attach ( ) ?;
176+ for ( name, prog) in self . obj . programs_mut ( ) {
177+ match prog {
178+ Program :: Lsm ( prog) => {
179+ if self . use_lsm_hook {
180+ debug ! ( "Attaching '{name}'" ) ;
181+ prog. attach ( ) ?;
182+ }
183+ }
184+ Program :: KProbe ( prog) => {
185+ if !self . use_lsm_hook {
186+ debug ! ( "Attaching '{name}'" ) ;
187+ let fn_name = match name {
188+ "kprobe_file_open" => "security_file_open" ,
189+ "kprobe_path_unlink" => "security_path_unlink" ,
190+ name => unimplemented ! ( "Invalid '{name}' kprobe" ) ,
191+ } ;
192+ prog. attach ( fn_name, 0 ) ?;
193+ }
194+ }
195+ ty => unimplemented ! ( "Unsupported type {ty:?}" ) ,
196+ }
159197 }
160198 Ok ( ( ) )
161199 }
0 commit comments