Received: by 2002:a05:7412:3784:b0:e2:908c:2ebd with SMTP id jk4csp2892513rdb; Wed, 4 Oct 2023 15:10:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHS8uzI2J9ipJrqHTjzW2Biv+keuuZ09A2GY5MJZ5EqzTsxgnvkwUR5nNmZUsD/Pdf764mG X-Received: by 2002:a17:90a:dd41:b0:278:f656:ca1b with SMTP id u1-20020a17090add4100b00278f656ca1bmr3425594pjv.37.1696457403076; Wed, 04 Oct 2023 15:10:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696457403; cv=none; d=google.com; s=arc-20160816; b=KvtpfpqA1jGspDn5jwzKIUphjdKPUlI9dvUlB2sF/3bOiYN1Cg5PUbVwDO9tge2Fte AhN9Vy9FpoSewuTrppxRyB2xZVLkV7LQvm1B6Eqxx2Z7gtQC6gqadXis7dY1UxBZ7dz+ 0IHI+eze3ss/9gsVqnDKtTScVZxx86sWdGoJYhix1Y5uUqsiO0r2CGsq7TubOBgmuBYQ 43TBKX3SUObTXBz0Is9W9gxRzibqoAFjyMzby56Wk0RqTeUDNc/gQUIBtY4j2GxHs7KI dThp1T6r6OTz/J4DaaJPzv0eppzPbyU3r0QTdrsAGs6mX1gKAqZ9C7eRsTqQDnB9wGIr PuHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature:dkim-filter; bh=jGkhEn3ZFwR/GgtoddxjP0SkUVW+MWODAqAxLOOgeiA=; fh=WKOxBQCBkKJEYHNk8gUZtM1FdSmLSIlhHGYfTk9Bdmc=; b=OT0Pd1ccHsTMpoV7j1CCBlvqKVIoXiKN3rduujVClG1Ztiy5za6VvdEmvt2IR66zj5 PGO1jFpCu01uUSFEphwKaHIBjVefUmGPVJcXiyeJbUEQX/eKw58nkkAKl3bTfFc7vch5 d5JSqIkRZvMxvZg6BhnaABt2hZs2CK3rp5i3FsbFQLYZ7yTDOLSqtwAxnIJdt/Jxe+T6 yaZWrLRcdnAef/hPq7GkWqLphkmM0y582ZkFYCQkFjYRt7AwfJ7keVgefXUZxdqT2zHc C+K7zPmmjeeoketvXc8fMj7UTBfP9CWBGmsU4G7tZMRJyQm0oS0dhcoSpnbNoGlA710J J4pA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=nuhx3tGL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id bf20-20020a17090b0b1400b0027491203b43si2206599pjb.189.2023.10.04.15.10.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 15:10:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=nuhx3tGL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 078F482BB554; Wed, 4 Oct 2023 15:10:02 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234926AbjJDWJ7 (ORCPT + 99 others); Wed, 4 Oct 2023 18:09:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231594AbjJDWJz (ORCPT ); Wed, 4 Oct 2023 18:09:55 -0400 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id F3E82DD; Wed, 4 Oct 2023 15:09:50 -0700 (PDT) Received: by linux.microsoft.com (Postfix, from userid 1052) id 4ECF020B74C6; Wed, 4 Oct 2023 15:09:50 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4ECF020B74C6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1696457390; bh=jGkhEn3ZFwR/GgtoddxjP0SkUVW+MWODAqAxLOOgeiA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nuhx3tGLEpT1yj9wFPQtNUAp58mBUdu6GBUGTyQanRtHBOjkklh16yYhfT9aY0gZ6 huOxUMcbhYESb6WW6vXHU/8mSbvsqk89Rk2fl2wtXbNFAmFLSjD1JGmX36qdulk0db U3zyyXu0wECnsvsnkjfsa1e7L/jMxHR89VyWuDh0= From: Fan Wu To: corbet@lwn.net, zohar@linux.ibm.com, jmorris@namei.org, serge@hallyn.com, tytso@mit.edu, ebiggers@kernel.org, axboe@kernel.dk, agk@redhat.com, snitzer@kernel.org, eparis@redhat.com, paul@paul-moore.com Cc: linux-doc@vger.kernel.org, linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fscrypt@vger.kernel.org, linux-block@vger.kernel.org, dm-devel@redhat.com, audit@vger.kernel.org, roberto.sassu@huawei.com, linux-kernel@vger.kernel.org, Deven Bowers , Fan Wu Subject: [RFC PATCH v11 03/19] ipe: add evaluation loop Date: Wed, 4 Oct 2023 15:09:30 -0700 Message-Id: <1696457386-3010-4-git-send-email-wufan@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1696457386-3010-1-git-send-email-wufan@linux.microsoft.com> References: <1696457386-3010-1-git-send-email-wufan@linux.microsoft.com> X-Spam-Status: No, score=-17.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,ENV_AND_HDR_SPF_MATCH,SPF_HELO_PASS,SPF_PASS, USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 04 Oct 2023 15:10:02 -0700 (PDT) From: Deven Bowers IPE must have a centralized function to evaluate incoming callers against IPE's policy. This iteration of the policy for against the rules for that specific caller is known as the evaluation loop. Signed-off-by: Deven Bowers Signed-off-by: Fan Wu --- v2: + Split evaluation loop, access control hooks, and evaluation loop from policy parser and userspace interface to pass mailing list character limit v3: + Move ipe_load_properties to patch 04. + Remove useless 0-initializations Prefix extern variables with ipe_ + Remove kernel module parameters, as these are exposed through sysctls. + Add more prose to the IPE base config option help text. + Use GFP_KERNEL for audit_log_start. + Remove unnecessary caching system. + Remove comments from headers + Use rcu_access_pointer for rcu-pointer null check + Remove usage of reqprot; use prot only. +Move policy load and activation audit event to 03/12 v4: + Remove sysctls in favor of securityfs nodes + Re-add kernel module parameters, as these are now exposed through securityfs. + Refactor property audit loop to a separate function. v5: + fix minor grammatical errors + do not group rule by curly-brace in audit record, + reconstruct the exact rule. v6: + No changes v7: + Further split lsm creation into a separate commit from the evaluation loop and audit system, for easier review. + Propagating changes to support the new ipe_context structure in the evaluation loop. v8: + Remove ipe_hook enumeration; hooks can be correlated via syscall record. v9: + Remove ipe_context related code and simplify the evaluation loop. v10: + Split eval part and boot_verified part v11: + Fix code style issues --- security/ipe/Makefile | 1 + security/ipe/eval.c | 96 +++++++++++++++++++++++++++++++++++++++++++ security/ipe/eval.h | 24 +++++++++++ 3 files changed, 121 insertions(+) create mode 100644 security/ipe/eval.c create mode 100644 security/ipe/eval.h diff --git a/security/ipe/Makefile b/security/ipe/Makefile index c09aec4904f2..57fe922cf1fc 100644 --- a/security/ipe/Makefile +++ b/security/ipe/Makefile @@ -6,6 +6,7 @@ # obj-$(CONFIG_SECURITY_IPE) += \ + eval.o \ ipe.o \ policy.o \ policy_parser.o \ diff --git a/security/ipe/eval.c b/security/ipe/eval.c new file mode 100644 index 000000000000..5533c359bbeb --- /dev/null +++ b/security/ipe/eval.c @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) Microsoft Corporation. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include + +#include "ipe.h" +#include "eval.h" +#include "policy.h" + +struct ipe_policy __rcu *ipe_active_policy; + +/** + * evaluate_property - Analyze @ctx against a property. + * @ctx: Supplies a pointer to the context to be evaluated. + * @p: Supplies a pointer to the property to be evaluated. + * + * Return: + * * true - The current @ctx match the @p + * * false - The current @ctx doesn't match the @p + */ +static bool evaluate_property(const struct ipe_eval_ctx *const ctx, + struct ipe_prop *p) +{ + return false; +} + +/** + * ipe_evaluate_event - Analyze @ctx against the current active policy. + * @ctx: Supplies a pointer to the context to be evaluated. + * + * This is the loop where all policy evaluation happens against IPE policy. + * + * Return: + * * 0 - OK + * * -EACCES - @ctx did not pass evaluation. + * * !0 - Error + */ +int ipe_evaluate_event(const struct ipe_eval_ctx *const ctx) +{ + bool match = false; + enum ipe_action_type action; + struct ipe_policy *pol = NULL; + const struct ipe_rule *rule = NULL; + const struct ipe_op_table *rules = NULL; + struct ipe_prop *prop = NULL; + + rcu_read_lock(); + + pol = rcu_dereference(ipe_active_policy); + if (!pol) { + rcu_read_unlock(); + return 0; + } + + if (ctx->op == IPE_OP_INVALID) { + rcu_read_unlock(); + if (pol->parsed->global_default_action == IPE_ACTION_DENY) + return -EACCES; + return 0; + } + + rules = &pol->parsed->rules[ctx->op]; + + list_for_each_entry(rule, &rules->rules, next) { + match = true; + + list_for_each_entry(prop, &rule->props, next) { + match = match && evaluate_property(ctx, prop); + if (!match) + break; + } + + if (match) + break; + } + + if (match) + action = rule->action; + else if (rules->default_action != IPE_ACTION_INVALID) + action = rules->default_action; + else + action = pol->parsed->global_default_action; + + rcu_read_unlock(); + if (action == IPE_ACTION_DENY) + return -EACCES; + + return 0; +} diff --git a/security/ipe/eval.h b/security/ipe/eval.h new file mode 100644 index 000000000000..6b434515968f --- /dev/null +++ b/security/ipe/eval.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) Microsoft Corporation. All rights reserved. + */ + +#ifndef _IPE_EVAL_H +#define _IPE_EVAL_H + +#include +#include + +#include "policy.h" + +extern struct ipe_policy __rcu *ipe_active_policy; + +struct ipe_eval_ctx { + enum ipe_op_type op; + + const struct file *file; +}; + +int ipe_evaluate_event(const struct ipe_eval_ctx *const ctx); + +#endif /* _IPE_EVAL_H */ -- 2.25.1