diff mbox series

ima: Support euid keyword for buffer measurement

Message ID 20210705115650.3373599-1-roberto.sassu@huawei.com (mailing list archive)
State New, archived
Headers show
Series ima: Support euid keyword for buffer measurement | expand

Commit Message

Roberto Sassu July 5, 2021, 11:56 a.m. UTC
This patch makes the 'euid' keyword available for buffer measurement rules,
in the same way as for other rules. Currently, there is only support for
the 'uid' keyword.

With this change, buffer measurement (or non-measurement) can depend also
on the process effective UID.

Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
---
 security/integrity/ima/ima_policy.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

Comments

Lakshmi Ramasubramanian July 6, 2021, 7:29 p.m. UTC | #1
On 7/5/2021 4:56 AM, Roberto Sassu wrote:

Hi Roberto,

> This patch makes the 'euid' keyword available for buffer measurement rules,
> in the same way as for other rules. Currently, there is only support for
> the 'uid' keyword.
> 
> With this change, buffer measurement (or non-measurement) can depend also
> on the process effective UID.

Who (kernel component) will be using this?

Maybe you could make this change as part of the patch set in which the 
above "euid" support will be used.

thanks,
  -lakshmi

> 
> Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
> ---
>   security/integrity/ima/ima_policy.c | 12 +++++++++++-
>   1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
> index fd5d46e511f1..fdaa030fb04b 100644
> --- a/security/integrity/ima/ima_policy.c
> +++ b/security/integrity/ima/ima_policy.c
> @@ -480,6 +480,16 @@ static bool ima_match_rule_data(struct ima_rule_entry *rule,
>   	if ((rule->flags & IMA_UID) && !rule->uid_op(cred->uid, rule->uid))
>   		return false;
>   
> +	if (rule->flags & IMA_EUID) {
> +		if (has_capability_noaudit(current, CAP_SETUID)) {
> +			if (!rule->uid_op(cred->euid, rule->uid)
> +			    && !rule->uid_op(cred->suid, rule->uid)
> +			    && !rule->uid_op(cred->uid, rule->uid))
> +				return false;
> +		} else if (!rule->uid_op(cred->euid, rule->uid))
> +			return false;
> +	}
> +
>   	switch (rule->func) {
>   	case KEY_CHECK:
>   		if (!rule->keyrings)
> @@ -1153,7 +1163,7 @@ static bool ima_validate_rule(struct ima_rule_entry *entry)
>   		if (entry->action & ~(MEASURE | DONT_MEASURE))
>   			return false;
>   
> -		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_PCR |
> +		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_EUID | IMA_PCR |
>   				     IMA_LABEL))
>   			return false;
>   
>
Roberto Sassu July 7, 2021, 7:15 a.m. UTC | #2
> From: Lakshmi Ramasubramanian [mailto:nramas@linux.microsoft.com]
> Sent: Tuesday, July 6, 2021 9:30 PM
> On 7/5/2021 4:56 AM, Roberto Sassu wrote:
> 
> Hi Roberto,
> 
> > This patch makes the 'euid' keyword available for buffer measurement rules,
> > in the same way as for other rules. Currently, there is only support for
> > the 'uid' keyword.
> >
> > With this change, buffer measurement (or non-measurement) can depend
> also
> > on the process effective UID.
> 
> Who (kernel component) will be using this?

Hi Lakshmi

I'm using it in a (not yet submitted) test for digest lists.

It is in a dont_measure rule to try to unload a digest list
without measurement and to check that this is not allowed
if the digest list was measured at addition time (to ensure
completeness of information).

> Maybe you could make this change as part of the patch set in which the
> above "euid" support will be used.

I wanted to send the digest lists patch set without anything
else. I could resend the patch as part of that patch set if it is
preferred.

Thanks

Roberto

HUAWEI TECHNOLOGIES Duesseldorf GmbH, HRB 56063
Managing Director: Li Peng, Li Jian, Shi Yanli

> thanks,
>   -lakshmi
> 
> >
> > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
> > ---
> >   security/integrity/ima/ima_policy.c | 12 +++++++++++-
> >   1 file changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/security/integrity/ima/ima_policy.c
> b/security/integrity/ima/ima_policy.c
> > index fd5d46e511f1..fdaa030fb04b 100644
> > --- a/security/integrity/ima/ima_policy.c
> > +++ b/security/integrity/ima/ima_policy.c
> > @@ -480,6 +480,16 @@ static bool ima_match_rule_data(struct
> ima_rule_entry *rule,
> >   	if ((rule->flags & IMA_UID) && !rule->uid_op(cred->uid, rule->uid))
> >   		return false;
> >
> > +	if (rule->flags & IMA_EUID) {
> > +		if (has_capability_noaudit(current, CAP_SETUID)) {
> > +			if (!rule->uid_op(cred->euid, rule->uid)
> > +			    && !rule->uid_op(cred->suid, rule->uid)
> > +			    && !rule->uid_op(cred->uid, rule->uid))
> > +				return false;
> > +		} else if (!rule->uid_op(cred->euid, rule->uid))
> > +			return false;
> > +	}
> > +
> >   	switch (rule->func) {
> >   	case KEY_CHECK:
> >   		if (!rule->keyrings)
> > @@ -1153,7 +1163,7 @@ static bool ima_validate_rule(struct
> ima_rule_entry *entry)
> >   		if (entry->action & ~(MEASURE | DONT_MEASURE))
> >   			return false;
> >
> > -		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_PCR |
> > +		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_EUID |
> IMA_PCR |
> >   				     IMA_LABEL))
> >   			return false;
> >
> >
Mimi Zohar July 19, 2021, 9:30 p.m. UTC | #3
Hi Roberto,

On Wed, 2021-07-07 at 07:15 +0000, Roberto Sassu wrote:
> > From: Lakshmi Ramasubramanian [mailto:nramas@linux.microsoft.com]
> > Sent: Tuesday, July 6, 2021 9:30 PM
> > On 7/5/2021 4:56 AM, Roberto Sassu wrote:
> > 
> > Hi Roberto,
> > 
> > > This patch makes the 'euid' keyword available for buffer measurement rules,
> > > in the same way as for other rules. Currently, there is only support for
> > > the 'uid' keyword.
> > >
> > > With this change, buffer measurement (or non-measurement) can depend
> > also
> > > on the process effective UID.
> > 
> > Who (kernel component) will be using this?
> 
> Hi Lakshmi
> 
> I'm using it in a (not yet submitted) test for digest lists.
> 
> It is in a dont_measure rule to try to unload a digest list
> without measurement and to check that this is not allowed
> if the digest list was measured at addition time (to ensure
> completeness of information).
> 
> > Maybe you could make this change as part of the patch set in which the
> > above "euid" support will be used.
> 
> I wanted to send the digest lists patch set without anything
> else. I could resend the patch as part of that patch set if it is
> preferred.

Unless there is another usecase, please keep it with the digest list
tests patch set.

Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>

thanks,

Mimi
diff mbox series

Patch

diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
index fd5d46e511f1..fdaa030fb04b 100644
--- a/security/integrity/ima/ima_policy.c
+++ b/security/integrity/ima/ima_policy.c
@@ -480,6 +480,16 @@  static bool ima_match_rule_data(struct ima_rule_entry *rule,
 	if ((rule->flags & IMA_UID) && !rule->uid_op(cred->uid, rule->uid))
 		return false;
 
+	if (rule->flags & IMA_EUID) {
+		if (has_capability_noaudit(current, CAP_SETUID)) {
+			if (!rule->uid_op(cred->euid, rule->uid)
+			    && !rule->uid_op(cred->suid, rule->uid)
+			    && !rule->uid_op(cred->uid, rule->uid))
+				return false;
+		} else if (!rule->uid_op(cred->euid, rule->uid))
+			return false;
+	}
+
 	switch (rule->func) {
 	case KEY_CHECK:
 		if (!rule->keyrings)
@@ -1153,7 +1163,7 @@  static bool ima_validate_rule(struct ima_rule_entry *entry)
 		if (entry->action & ~(MEASURE | DONT_MEASURE))
 			return false;
 
-		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_PCR |
+		if (entry->flags & ~(IMA_FUNC | IMA_UID | IMA_EUID | IMA_PCR |
 				     IMA_LABEL))
 			return false;