-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bpf: lsm: Add selftests for BPF_PROG_TYPE_LSM
* Load/attach a BPF program that hooks to file_mprotect (int) and bprm_committed_creds (void). * Perform an action that triggers the hook. * Verify if the audit event was received using the shared global variables for the process executed. * Verify if the mprotect returns a -EPERM. 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> Reviewed-by: James Morris <jamorris@linux.microsoft.com> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200329004356.27286-8-kpsingh@chromium.org
- Loading branch information
KP Singh
authored and
Daniel Borkmann
committed
Mar 29, 2020
1 parent
1e092a0
commit 03e54f1
Showing
3 changed files
with
136 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
/* | ||
* Copyright (C) 2020 Google LLC. | ||
*/ | ||
|
||
#include <test_progs.h> | ||
#include <sys/mman.h> | ||
#include <sys/wait.h> | ||
#include <unistd.h> | ||
#include <malloc.h> | ||
#include <stdlib.h> | ||
|
||
#include "lsm.skel.h" | ||
|
||
char *CMD_ARGS[] = {"true", NULL}; | ||
|
||
int heap_mprotect(void) | ||
{ | ||
void *buf; | ||
long sz; | ||
int ret; | ||
|
||
sz = sysconf(_SC_PAGESIZE); | ||
if (sz < 0) | ||
return sz; | ||
|
||
buf = memalign(sz, 2 * sz); | ||
if (buf == NULL) | ||
return -ENOMEM; | ||
|
||
ret = mprotect(buf, sz, PROT_READ | PROT_WRITE | PROT_EXEC); | ||
free(buf); | ||
return ret; | ||
} | ||
|
||
int exec_cmd(int *monitored_pid) | ||
{ | ||
int child_pid, child_status; | ||
|
||
child_pid = fork(); | ||
if (child_pid == 0) { | ||
*monitored_pid = getpid(); | ||
execvp(CMD_ARGS[0], CMD_ARGS); | ||
return -EINVAL; | ||
} else if (child_pid > 0) { | ||
waitpid(child_pid, &child_status, 0); | ||
return child_status; | ||
} | ||
|
||
return -EINVAL; | ||
} | ||
|
||
void test_test_lsm(void) | ||
{ | ||
struct lsm *skel = NULL; | ||
int err, duration = 0; | ||
|
||
skel = lsm__open_and_load(); | ||
if (CHECK(!skel, "skel_load", "lsm skeleton failed\n")) | ||
goto close_prog; | ||
|
||
err = lsm__attach(skel); | ||
if (CHECK(err, "attach", "lsm attach failed: %d\n", err)) | ||
goto close_prog; | ||
|
||
err = exec_cmd(&skel->bss->monitored_pid); | ||
if (CHECK(err < 0, "exec_cmd", "err %d errno %d\n", err, errno)) | ||
goto close_prog; | ||
|
||
CHECK(skel->bss->bprm_count != 1, "bprm_count", "bprm_count = %d\n", | ||
skel->bss->bprm_count); | ||
|
||
skel->bss->monitored_pid = getpid(); | ||
|
||
err = heap_mprotect(); | ||
if (CHECK(errno != EPERM, "heap_mprotect", "want errno=EPERM, got %d\n", | ||
errno)) | ||
goto close_prog; | ||
|
||
CHECK(skel->bss->mprotect_count != 1, "mprotect_count", | ||
"mprotect_count = %d\n", skel->bss->mprotect_count); | ||
|
||
close_prog: | ||
lsm__destroy(skel); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
/* | ||
* Copyright 2020 Google LLC. | ||
*/ | ||
|
||
#include "vmlinux.h" | ||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_tracing.h> | ||
#include <errno.h> | ||
|
||
char _license[] SEC("license") = "GPL"; | ||
|
||
int monitored_pid = 0; | ||
int mprotect_count = 0; | ||
int bprm_count = 0; | ||
|
||
SEC("lsm/file_mprotect") | ||
int BPF_PROG(test_int_hook, struct vm_area_struct *vma, | ||
unsigned long reqprot, unsigned long prot, int ret) | ||
{ | ||
if (ret != 0) | ||
return ret; | ||
|
||
__u32 pid = bpf_get_current_pid_tgid() >> 32; | ||
int is_heap = 0; | ||
|
||
is_heap = (vma->vm_start >= vma->vm_mm->start_brk && | ||
vma->vm_end <= vma->vm_mm->brk); | ||
|
||
if (is_heap && monitored_pid == pid) { | ||
mprotect_count++; | ||
ret = -EPERM; | ||
} | ||
|
||
return ret; | ||
} | ||
|
||
SEC("lsm/bprm_committed_creds") | ||
int BPF_PROG(test_void_hook, struct linux_binprm *bprm) | ||
{ | ||
__u32 pid = bpf_get_current_pid_tgid() >> 32; | ||
|
||
if (monitored_pid == pid) | ||
bprm_count++; | ||
|
||
return 0; | ||
} |