Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp2812841ybb; Fri, 27 Mar 2020 12:31:47 -0700 (PDT) X-Google-Smtp-Source: ADFU+vsQQ3QPRf9pec4Spy+b6biKEzHABWJ52qYH4+DDDa6TkSIFRiK4m1JuELPeh+EgQmsjtAiw X-Received: by 2002:a9d:f05:: with SMTP id 5mr182335ott.263.1585337507023; Fri, 27 Mar 2020 12:31:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585337507; cv=none; d=google.com; s=arc-20160816; b=fArd6uuGWaadC5AYUEwSB7KPQxX7xZ/W3Lh7zZcGQfEfejn7sa3g7UK/FOAK+FrzYS Vd1LSVfFdCicwivpyc5SpCqrXU36j1nu143wCIVCzqPK2Q5DnLRVe4p65MlsN4WTpYyM 4fcT3tU0T9zDhuBrA8/5MiLeL6oTvKloOmLq4z4iCdVDtV1Esf8BTnwtk3mBDpM01a1t 1s1ds5pwDBp9tbN4EQO96cJ5h02ssQpdoNXpBaUFpPW2wma66Qmxf0J0VFmHBPq0Znmt ObNBDHDmAJTq+MfwgJQ0PrrxBw/GYsbdmNNToGSaBaatOMoku0Tg6xQXXEPYauv3NjnA VP5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=PjN96pPP2Ws9AKqOwqjPj/iDmHQIGB0PlzbKlrnTivA=; b=OdEPLlnd22vT4Mq/9A9ILOwZG6G5G5dOWBIR8zQ+Pv8m/D8MKoThSiUc0WylNwBBU8 67pERNL6VCVZLs1NOzO1+bZBf/hcvbVbmGBzrD3iaENkeI/nlmRfl6Vfwup/pzu/vFlL kb1V9N0Lc4TcRM3FDJfd9ZX1QxeZOCGnuNHzZ5oSokziiwY95qMyvTd5iL3vGHz2JCHs x4RzOp2JZM6Ky6wEidI2GESTZSZLLmNewxw0DWR3IJ87Ha/GknsbWJkjUIAwxlAH3mpu tjvdO/ft9HBdXF3aVSmn0AehkK+aBjdWszr1Erdl1rYVmrteicfhpeigwSEZOQHWp9xR RQcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=H9RYIRC4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m25si2659458oic.230.2020.03.27.12.31.24; Fri, 27 Mar 2020 12:31:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=H9RYIRC4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727881AbgC0T3N (ORCPT + 99 others); Fri, 27 Mar 2020 15:29:13 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:37676 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727849AbgC0T3H (ORCPT ); Fri, 27 Mar 2020 15:29:07 -0400 Received: by mail-wm1-f67.google.com with SMTP id d1so13655695wmb.2 for ; Fri, 27 Mar 2020 12:29:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=PjN96pPP2Ws9AKqOwqjPj/iDmHQIGB0PlzbKlrnTivA=; b=H9RYIRC4MLsoxRogGWOsAjGK7I4zSI+8sGkO7aqruzXI+qO/Co1A2yHjdSST9m4lhO U5liN4MhqN9teJtAM1qnL8Njme1ihvRHSbZzI7nSIviAl8iqnT2WFDc1K0uIqq6QX0kc 5fe0eOIZSUv46Cp9xDjOrJKZ+G34dKIFE9y9E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PjN96pPP2Ws9AKqOwqjPj/iDmHQIGB0PlzbKlrnTivA=; b=aX8NLpdc4tlO9ev35YUKnRS+KAgKt9jnJewJjqK9RBN4nl1ioDqWQuGiyaoCWqrFz3 hATZQBCy3Kc0Y5IUJKfLZY/lpeHEnOaz/e1Wx7IuKnpMJgjhUdlKNiTQqkxnX53sk5s1 FiBdPg3W36H5WUjV9WDk7uV9Jj4MCQ/M4IKqLCEEPQOHnkFgBMZYP54m+teBdwHFB3FM jp311MOPMWQoD10vxygb+hDJI+nblM8x8VZE+lGEdtIU1xDNaFLnQ0MgaOZAFIk/iz4d WTR3o6tVMqk7SyIwzrdjsHm8YV85vgBM5WdPoMBpIVhn2iaOVatFvEDP/c3vodxSRWhF wg3w== X-Gm-Message-State: ANhLgQ3BeLmlhxT6/6KrnzJGdKfA7hb1B05rXs6W645UN1bJMvvNPRhd cAg/imBmCjMAs6fl40R7/Yj3Iv7/9SU= X-Received: by 2002:a1c:c246:: with SMTP id s67mr197718wmf.160.1585337345985; Fri, 27 Mar 2020 12:29:05 -0700 (PDT) Received: from kpsingh-kernel.localdomain (77-56-209-237.dclient.hispeed.ch. [77.56.209.237]) by smtp.gmail.com with ESMTPSA id h132sm9828537wmf.18.2020.03.27.12.29.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2020 12:29:05 -0700 (PDT) From: KP Singh To: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-security-module@vger.kernel.org Cc: Andrii Nakryiko , Brendan Jackman , Florent Revest , Thomas Garnier , James Morris , Alexei Starovoitov , Daniel Borkmann , James Morris , Kees Cook , Paul Turner , Jann Horn , Florent Revest , Brendan Jackman , Greg Kroah-Hartman Subject: [PATCH bpf-next v8 7/8] bpf: lsm: Add selftests for BPF_PROG_TYPE_LSM Date: Fri, 27 Mar 2020 20:28:53 +0100 Message-Id: <20200327192854.31150-8-kpsingh@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200327192854.31150-1-kpsingh@chromium.org> References: <20200327192854.31150-1-kpsingh@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: KP Singh * 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 Acked-by: Andrii Nakryiko Reviewed-by: Brendan Jackman Reviewed-by: Florent Revest Reviewed-by: Thomas Garnier Reviewed-by: James Morris --- tools/testing/selftests/bpf/config | 2 + .../selftests/bpf/prog_tests/test_lsm.c | 86 +++++++++++++++++++ tools/testing/selftests/bpf/progs/lsm.c | 48 +++++++++++ 3 files changed, 136 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/test_lsm.c create mode 100644 tools/testing/selftests/bpf/progs/lsm.c diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/bpf/config index 5dc109f4c097..60e3ae5d4e48 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -35,3 +35,5 @@ CONFIG_MPLS_ROUTING=m CONFIG_MPLS_IPTUNNEL=m CONFIG_IPV6_SIT=m CONFIG_BPF_JIT=y +CONFIG_BPF_LSM=y +CONFIG_SECURITY=y diff --git a/tools/testing/selftests/bpf/prog_tests/test_lsm.c b/tools/testing/selftests/bpf/prog_tests/test_lsm.c new file mode 100644 index 000000000000..fcd839e88540 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/test_lsm.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Copyright (C) 2020 Google LLC. + */ + +#include +#include +#include +#include +#include +#include + +#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_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); +} diff --git a/tools/testing/selftests/bpf/progs/lsm.c b/tools/testing/selftests/bpf/progs/lsm.c new file mode 100644 index 000000000000..a4e3c223028d --- /dev/null +++ b/tools/testing/selftests/bpf/progs/lsm.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Copyright 2020 Google LLC. + */ + +#include "vmlinux.h" +#include +#include +#include + +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; +} -- 2.20.1