Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp3449791ybd; Fri, 28 Jun 2019 08:50:11 -0700 (PDT) X-Google-Smtp-Source: APXvYqy6vAJOqGh/0jRL401V3xt70UBe71jIcROsxb94h3ScKcCQzS3h6DNaNk6nQKye2z1o5Nyv X-Received: by 2002:a17:902:1003:: with SMTP id b3mr12561876pla.172.1561737011761; Fri, 28 Jun 2019 08:50:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561737011; cv=none; d=google.com; s=arc-20160816; b=xMvdUZW/TDkQLBHBEyEYtLXyKK0IQ+pQinJMyE8anT9l7d981BlBmhilB6QS2wxbRk VIg/dU4zhqrSSJhToQS1uLoX7f7F5djDxrYO6q7ErRQHc5NJDWz/YkcahBxIGRYfaVLu 3k65InZUj3tyGj9fqcmx7GY02h77/PF8ks/EB/I9in43Zfpixl5wrv0ZgX91gVGk1m95 P9UxYYegLCKn3aY4yXJDTktTnKY6mmc69aPCE0ZgbVUuUIaThJErH3Zm776ss1Uh0UOr UHsOX38Jnrlr7ko4Eabb2BstAnmI4ncPXjmHdyjY+T99lEQkcppvxoNkOwFXpSYgSFSm /+yg== 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 :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:organization; bh=LDDuKEeIjfoe+LTZWOn8h/rpuNRLEQaRxxAmtFJgMBs=; b=MmCi+D4e0hQti8hBcNKEBfoGWBQTMGezqspxmHmp1bBb+9aiKEzl+4tPSd7Jv51gZe BBPk+I0a/sPKkIFCjtEwM+vRPrsMsVtxpUAIiea025nhi598cxH4PXBVQmihNlE8Aa4n F5iCyqGh3WcEJu+PuDX5q2TvGdbN4ZYUN2dTpk3yXXbwRc8+HzHDS8K7AsJ1nIVV254m dN14q4a6qEwJgEVIAm5s/3ejY6yHQxmkTzFPolsxpY51JCgnH5eGdWE0z/RY8jBjquCg /3MJ11TqTJG5qyHuPBhKymOrmrkC6I9xtl6woDScGshd37DCYSK4e5/sY5DtJvvmiySa 8e1w== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m22si2252201pgv.303.2019.06.28.08.49.55; Fri, 28 Jun 2019 08:50:11 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726967AbfF1PtH (ORCPT + 99 others); Fri, 28 Jun 2019 11:49:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36712 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726907AbfF1PtG (ORCPT ); Fri, 28 Jun 2019 11:49:06 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66A0988305; Fri, 28 Jun 2019 15:49:05 +0000 (UTC) Received: from warthog.procyon.org.uk (ovpn-120-219.rdu2.redhat.com [10.10.120.219]) by smtp.corp.redhat.com (Postfix) with ESMTP id BC6B75D71B; Fri, 28 Jun 2019 15:49:02 +0000 (UTC) Organization: Red Hat UK Ltd. Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SI4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 3798903 Subject: [PATCH 3/9] security: Add a hook for the point of notification insertion [ver #5] From: David Howells To: viro@zeniv.linux.org.uk Cc: dhowells@redhat.com, Casey Schaufler , Stephen Smalley , Greg Kroah-Hartman , nicolas.dichtel@6wind.com, raven@themaw.net, Christian Brauner , dhowells@redhat.com, keyrings@vger.kernel.org, linux-usb@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, linux-block@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Date: Fri, 28 Jun 2019 16:49:02 +0100 Message-ID: <156173694190.15137.8939274212328721351.stgit@warthog.procyon.org.uk> In-Reply-To: <156173690158.15137.3985163001079120218.stgit@warthog.procyon.org.uk> References: <156173690158.15137.3985163001079120218.stgit@warthog.procyon.org.uk> User-Agent: StGit/unknown-version MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 28 Jun 2019 15:49:05 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a security hook that allows an LSM to rule on whether a notification message is allowed to be inserted into a particular watch queue. The hook is given the following information: (1) The credentials of the triggerer (which may be init_cred for a system notification, eg. a hardware error). (2) The credentials of the whoever set the watch. (3) The notification message. Signed-off-by: David Howells cc: Casey Schaufler cc: Stephen Smalley cc: linux-security-module@vger.kernel.org --- include/linux/lsm_hooks.h | 10 ++++++++++ include/linux/security.h | 10 ++++++++++ security/security.c | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index f9d31f6445e4..fd4b2b14e7d0 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1426,6 +1426,12 @@ * from devices (as a global set). * @watch: The watch object * + * @post_notification: + * Check to see if a watch notification can be posted to a particular + * queue. + * @w_cred: The credentials of the whoever set the watch. + * @cred: The event-triggerer's credentials + * @n: The notification being posted * * Security hooks for using the eBPF maps and programs functionalities through * eBPF syscalls. @@ -1705,6 +1711,9 @@ union security_list_options { #ifdef CONFIG_WATCH_QUEUE int (*watch_key)(struct watch *watch, struct key *key); int (*watch_devices)(struct watch *watch); + int (*post_notification)(const struct cred *w_cred, + const struct cred *cred, + struct watch_notification *n); #endif /* CONFIG_WATCH_QUEUE */ #ifdef CONFIG_SECURITY_NETWORK @@ -1985,6 +1994,7 @@ struct security_hook_heads { #ifdef CONFIG_WATCH_QUEUE struct hlist_head watch_key; struct hlist_head watch_devices; + struct hlist_head post_notification; #endif /* CONFIG_WATCH_QUEUE */ #ifdef CONFIG_SECURITY_NETWORK struct hlist_head unix_stream_connect; diff --git a/include/linux/security.h b/include/linux/security.h index 540863678355..5c074bf18bea 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -58,6 +58,7 @@ struct fs_context; struct fs_parameter; enum fs_value_type; struct watch; +struct watch_notification; /* Default (no) options for the capable function */ #define CAP_OPT_NONE 0x0 @@ -396,6 +397,9 @@ int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); #ifdef CONFIG_WATCH_QUEUE int security_watch_key(struct watch *watch, struct key *key); int security_watch_devices(struct watch *watch); +int security_post_notification(const struct cred *w_cred, + const struct cred *cred, + struct watch_notification *n); #endif /* CONFIG_WATCH_QUEUE */ #else /* CONFIG_SECURITY */ @@ -1218,6 +1222,12 @@ static inline int security_watch_devices(struct watch *watch) { return 0; } +static inline int security_post_notification(const struct cred *w_cred, + const struct cred *cred, + struct watch_notification *n) +{ + return 0; +} #endif /* CONFIG_WATCH_QUEUE */ #endif /* CONFIG_SECURITY */ diff --git a/security/security.c b/security/security.c index 2c9919226ad1..459e87d55ac9 100644 --- a/security/security.c +++ b/security/security.c @@ -1928,6 +1928,12 @@ int security_watch_devices(struct watch *watch) return call_int_hook(watch_devices, 0, watch); } +int security_post_notification(const struct cred *w_cred, + const struct cred *cred, + struct watch_notification *n) +{ + return call_int_hook(post_notification, 0, w_cred, cred, n); +} #endif /* CONFIG_WATCH_QUEUE */ #ifdef CONFIG_SECURITY_NETWORK