bpf: Introduce BPF_PROG_TYPE_LSM
Introduce types and configs for bpf programs that can be attached to LSM hooks. The programs can be enabled by the config option CONFIG_BPF_LSM. Signed-off-by: KP Singh <kpsingh@google.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Brendan Jackman <jackmanb@google.com> Reviewed-by: Florent Revest <revest@google.com> Reviewed-by: Thomas Garnier <thgarnie@google.com> Acked-by: Yonghong Song <yhs@fb.com> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: James Morris <jamorris@linux.microsoft.com> Link: https://lore.kernel.org/bpf/20200329004356.27286-2-kpsingh@chromium.org
This commit is contained in:
		
							parent
							
								
									e5fb60ee4c
								
							
						
					
					
						commit
						fc611f47f2
					
				| @ -3147,6 +3147,7 @@ R:	Martin KaFai Lau <kafai@fb.com> | ||||
| R:	Song Liu <songliubraving@fb.com> | ||||
| R:	Yonghong Song <yhs@fb.com> | ||||
| R:	Andrii Nakryiko <andriin@fb.com> | ||||
| R:	KP Singh <kpsingh@chromium.org> | ||||
| L:	netdev@vger.kernel.org | ||||
| L:	bpf@vger.kernel.org | ||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git | ||||
|  | ||||
| @ -1515,6 +1515,9 @@ extern const struct bpf_func_proto bpf_tcp_sock_proto; | ||||
| extern const struct bpf_func_proto bpf_jiffies64_proto; | ||||
| extern const struct bpf_func_proto bpf_get_ns_current_pid_tgid_proto; | ||||
| 
 | ||||
| const struct bpf_func_proto *bpf_tracing_func_proto( | ||||
| 	enum bpf_func_id func_id, const struct bpf_prog *prog); | ||||
| 
 | ||||
| /* Shared helpers among cBPF and eBPF. */ | ||||
| void bpf_user_rnd_init_once(void); | ||||
| u64 bpf_user_rnd_u32(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); | ||||
|  | ||||
| @ -70,6 +70,10 @@ BPF_PROG_TYPE(BPF_PROG_TYPE_STRUCT_OPS, bpf_struct_ops, | ||||
| 	      void *, void *) | ||||
| BPF_PROG_TYPE(BPF_PROG_TYPE_EXT, bpf_extension, | ||||
| 	      void *, void *) | ||||
| #ifdef CONFIG_BPF_LSM | ||||
| BPF_PROG_TYPE(BPF_PROG_TYPE_LSM, lsm, | ||||
| 	       void *, void *) | ||||
| #endif /* CONFIG_BPF_LSM */ | ||||
| #endif | ||||
| 
 | ||||
| BPF_MAP_TYPE(BPF_MAP_TYPE_ARRAY, array_map_ops) | ||||
|  | ||||
| @ -181,6 +181,7 @@ enum bpf_prog_type { | ||||
| 	BPF_PROG_TYPE_TRACING, | ||||
| 	BPF_PROG_TYPE_STRUCT_OPS, | ||||
| 	BPF_PROG_TYPE_EXT, | ||||
| 	BPF_PROG_TYPE_LSM, | ||||
| }; | ||||
| 
 | ||||
| enum bpf_attach_type { | ||||
| @ -211,6 +212,7 @@ enum bpf_attach_type { | ||||
| 	BPF_TRACE_FENTRY, | ||||
| 	BPF_TRACE_FEXIT, | ||||
| 	BPF_MODIFY_RETURN, | ||||
| 	BPF_LSM_MAC, | ||||
| 	__MAX_BPF_ATTACH_TYPE | ||||
| }; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								init/Kconfig
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								init/Kconfig
									
									
									
									
									
								
							| @ -1616,6 +1616,18 @@ config KALLSYMS_BASE_RELATIVE | ||||
| # end of the "standard kernel features (expert users)" menu | ||||
| 
 | ||||
| # syscall, maps, verifier | ||||
| 
 | ||||
| config BPF_LSM | ||||
| 	bool "LSM Instrumentation with BPF" | ||||
| 	depends on BPF_SYSCALL | ||||
| 	depends on SECURITY | ||||
| 	depends on BPF_JIT | ||||
| 	help | ||||
| 	  Enables instrumentation of the security hooks with eBPF programs for | ||||
| 	  implementing dynamic MAC and Audit Policies. | ||||
| 
 | ||||
| 	  If you are unsure how to answer this question, answer N. | ||||
| 
 | ||||
| config BPF_SYSCALL | ||||
| 	bool "Enable bpf() system call" | ||||
| 	select BPF | ||||
|  | ||||
| @ -29,4 +29,5 @@ obj-$(CONFIG_DEBUG_INFO_BTF) += sysfs_btf.o | ||||
| endif | ||||
| ifeq ($(CONFIG_BPF_JIT),y) | ||||
| obj-$(CONFIG_BPF_SYSCALL) += bpf_struct_ops.o | ||||
| obj-${CONFIG_BPF_LSM} += bpf_lsm.o | ||||
| endif | ||||
|  | ||||
							
								
								
									
										17
									
								
								kernel/bpf/bpf_lsm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								kernel/bpf/bpf_lsm.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Copyright (C) 2020 Google LLC. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/filter.h> | ||||
| #include <linux/bpf.h> | ||||
| #include <linux/btf.h> | ||||
| 
 | ||||
| const struct bpf_prog_ops lsm_prog_ops = { | ||||
| }; | ||||
| 
 | ||||
| const struct bpf_verifier_ops lsm_verifier_ops = { | ||||
| 	.get_func_proto = bpf_tracing_func_proto, | ||||
| 	.is_valid_access = btf_ctx_access, | ||||
| }; | ||||
| @ -779,8 +779,8 @@ static const struct bpf_func_proto bpf_send_signal_thread_proto = { | ||||
| 	.arg1_type	= ARG_ANYTHING, | ||||
| }; | ||||
| 
 | ||||
| static const struct bpf_func_proto * | ||||
| tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| const struct bpf_func_proto * | ||||
| bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| { | ||||
| 	switch (func_id) { | ||||
| 	case BPF_FUNC_map_lookup_elem: | ||||
| @ -865,7 +865,7 @@ kprobe_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| 		return &bpf_override_return_proto; | ||||
| #endif | ||||
| 	default: | ||||
| 		return tracing_func_proto(func_id, prog); | ||||
| 		return bpf_tracing_func_proto(func_id, prog); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -975,7 +975,7 @@ tp_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| 	case BPF_FUNC_get_stack: | ||||
| 		return &bpf_get_stack_proto_tp; | ||||
| 	default: | ||||
| 		return tracing_func_proto(func_id, prog); | ||||
| 		return bpf_tracing_func_proto(func_id, prog); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -1082,7 +1082,7 @@ pe_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| 	case BPF_FUNC_read_branch_records: | ||||
| 		return &bpf_read_branch_records_proto; | ||||
| 	default: | ||||
| 		return tracing_func_proto(func_id, prog); | ||||
| 		return bpf_tracing_func_proto(func_id, prog); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -1210,7 +1210,7 @@ raw_tp_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) | ||||
| 	case BPF_FUNC_get_stack: | ||||
| 		return &bpf_get_stack_proto_raw_tp; | ||||
| 	default: | ||||
| 		return tracing_func_proto(func_id, prog); | ||||
| 		return bpf_tracing_func_proto(func_id, prog); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -181,6 +181,7 @@ enum bpf_prog_type { | ||||
| 	BPF_PROG_TYPE_TRACING, | ||||
| 	BPF_PROG_TYPE_STRUCT_OPS, | ||||
| 	BPF_PROG_TYPE_EXT, | ||||
| 	BPF_PROG_TYPE_LSM, | ||||
| }; | ||||
| 
 | ||||
| enum bpf_attach_type { | ||||
| @ -211,6 +212,7 @@ enum bpf_attach_type { | ||||
| 	BPF_TRACE_FENTRY, | ||||
| 	BPF_TRACE_FEXIT, | ||||
| 	BPF_MODIFY_RETURN, | ||||
| 	BPF_LSM_MAC, | ||||
| 	__MAX_BPF_ATTACH_TYPE | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -108,6 +108,7 @@ probe_load(enum bpf_prog_type prog_type, const struct bpf_insn *insns, | ||||
| 	case BPF_PROG_TYPE_TRACING: | ||||
| 	case BPF_PROG_TYPE_STRUCT_OPS: | ||||
| 	case BPF_PROG_TYPE_EXT: | ||||
| 	case BPF_PROG_TYPE_LSM: | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user