All of lore.kernel.org
 help / color / mirror / Atom feed
From: Casey Schaufler <casey@schaufler-ca.com>
To: Roberto Sassu <roberto.sassu@huaweicloud.com>,
	viro@zeniv.linux.org.uk, brauner@kernel.org,
	chuck.lever@oracle.com, jlayton@kernel.org, neilb@suse.de,
	kolga@netapp.com, Dai.Ngo@oracle.com, tom@talpey.com,
	paul@paul-moore.com, jmorris@namei.org, serge@hallyn.com,
	zohar@linux.ibm.com, dmitry.kasatkin@gmail.com,
	dhowells@redhat.com, jarkko@kernel.org,
	stephen.smalley.work@gmail.com, eparis@parisplace.org,
	mic@digikod.net
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-nfs@vger.kernel.org, linux-security-module@vger.kernel.org,
	linux-integrity@vger.kernel.org, keyrings@vger.kernel.org,
	selinux@vger.kernel.org, Roberto Sassu <roberto.sassu@huawei.com>,
	Casey Schaufler <casey@schaufler-ca.com>
Subject: Re: [PATCH v6 25/25] security: Enforce ordering of 'ima' and 'evm' LSMs
Date: Mon, 20 Nov 2023 16:50:56 -0800	[thread overview]
Message-ID: <24a9f95d-6a28-47d3-a0cf-48e1698e2445@schaufler-ca.com> (raw)
In-Reply-To: <20231120173318.1132868-26-roberto.sassu@huaweicloud.com>

On 11/20/2023 9:33 AM, Roberto Sassu wrote:
> From: Roberto Sassu <roberto.sassu@huawei.com>
>
> The ordering of LSM_ORDER_LAST LSMs depends on how they are placed in the
> .lsm_info.init section of the kernel image.
>
> Without making any assumption on the LSM ordering based on how they are
> compiled, enforce that ordering at LSM infrastructure level.
>
> Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
> ---
>  security/security.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/security/security.c b/security/security.c
> index 351a124b771c..b98db79ca500 100644
> --- a/security/security.c
> +++ b/security/security.c
> @@ -263,6 +263,18 @@ static void __init initialize_lsm(struct lsm_info *lsm)
>  	}
>  }
>  
> +/* Find an LSM with a given name. */
> +static struct lsm_info __init *find_lsm(const char *name)
> +{
> +	struct lsm_info *lsm;
> +
> +	for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++)
> +		if (!strcmp(lsm->name, name))
> +			return lsm;
> +
> +	return NULL;
> +}
> +
>  /*
>   * Current index to use while initializing the lsm id list.
>   */
> @@ -333,10 +345,23 @@ static void __init ordered_lsm_parse(const char *order, const char *origin)
>  
>  	/* LSM_ORDER_LAST is always last. */
>  	for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
> +		/* Do it later, to enforce the expected ordering. */
> +		if (!strcmp(lsm->name, "ima") || !strcmp(lsm->name, "evm"))
> +			continue;
> +

Hard coding the ordering of LSMs is incredibly ugly and unlikely to scale.
Not to mention perplexing the next time someone creates an LSM that "has to be last".

Why isn't LSM_ORDER_LAST sufficient? If it really isn't, how about adding
and using LSM_ORDER_LAST_I_REALLY_MEAN_IT* ?

Alternatively, a declaration of ordering requirements with regard to other
LSMs in lsm_info. You probably don't care where ima is relative to Yama,
but you need to be after SELinux and before evm. lsm_info could have 
must_precede and must_follow lists. Maybe a must_not_combine list, too,
although I'm hoping to make that unnecessary. 

And you should be using LSM_ID values instead of LSM names.

---
* Naming subject to Paul's sensibilities, of course.

>  		if (lsm->order == LSM_ORDER_LAST)
>  			append_ordered_lsm(lsm, "   last");
>  	}
>  
> +	/* Ensure that the 'ima' and 'evm' LSMs are last and in this order. */
> +	lsm = find_lsm("ima");
> +	if (lsm)
> +		append_ordered_lsm(lsm, "   last");
> +
> +	lsm = find_lsm("evm");
> +	if (lsm)
> +		append_ordered_lsm(lsm, "   last");
> +
>  	/* Disable all LSMs not in the ordered list. */
>  	for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
>  		if (exists_ordered_lsm(lsm))

  reply	other threads:[~2023-11-21  0:51 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20 17:32 [PATCH v6 00/25] security: Move IMA and EVM to the LSM infrastructure Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 01/25] ima: Align ima_inode_post_setattr() definition with " Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 02/25] ima: Align ima_file_mprotect() " Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 03/25] ima: Align ima_inode_setxattr() " Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 04/25] ima: Align ima_inode_removexattr() " Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 05/25] ima: Align ima_post_read_file() " Roberto Sassu
2023-11-20 17:32 ` [PATCH v6 06/25] evm: Align evm_inode_post_setattr() " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 07/25] evm: Align evm_inode_setxattr() " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 08/25] evm: Align evm_inode_post_setxattr() " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 09/25] security: Align inode_setattr hook definition with EVM Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 10/25] security: Introduce inode_post_setattr hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 11/25] security: Introduce inode_post_removexattr hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 12/25] security: Introduce file_post_open hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 13/25] security: Introduce file_release hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 14/25] security: Introduce path_post_mknod hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 15/25] security: Introduce inode_post_create_tmpfile hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 16/25] security: Introduce inode_post_set_acl hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 17/25] security: Introduce inode_post_remove_acl hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 18/25] security: Introduce key_post_create_or_update hook Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 19/25] ima: Move to LSM infrastructure Roberto Sassu
2023-11-21  8:02   ` Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 20/25] ima: Move IMA-Appraisal " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 21/25] evm: Move " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 22/25] ima: Remove dependency on 'integrity' LSM Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 23/25] evm: " Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 24/25] integrity: Remove LSM Roberto Sassu
2023-11-20 17:33 ` [PATCH v6 25/25] security: Enforce ordering of 'ima' and 'evm' LSMs Roberto Sassu
2023-11-21  0:50   ` Casey Schaufler [this message]
2023-11-21  7:57     ` Roberto Sassu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=24a9f95d-6a28-47d3-a0cf-48e1698e2445@schaufler-ca.com \
    --to=casey@schaufler-ca.com \
    --cc=Dai.Ngo@oracle.com \
    --cc=brauner@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=dhowells@redhat.com \
    --cc=dmitry.kasatkin@gmail.com \
    --cc=eparis@parisplace.org \
    --cc=jarkko@kernel.org \
    --cc=jlayton@kernel.org \
    --cc=jmorris@namei.org \
    --cc=keyrings@vger.kernel.org \
    --cc=kolga@netapp.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=mic@digikod.net \
    --cc=neilb@suse.de \
    --cc=paul@paul-moore.com \
    --cc=roberto.sassu@huawei.com \
    --cc=roberto.sassu@huaweicloud.com \
    --cc=selinux@vger.kernel.org \
    --cc=serge@hallyn.com \
    --cc=stephen.smalley.work@gmail.com \
    --cc=tom@talpey.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=zohar@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.