diff options
| author | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
| commit | c74a7469f97c0f40b46e82ee979f9fb1bb6e847c (patch) | |
| tree | f2690a1a916b73ef94657fbf0e0141ae57701825 /security/integrity/ima/ima_policy.c | |
| parent | 6f15a7de86c8cf2dc09fc9e6d07047efa40ef809 (diff) | |
| parent | 500775074f88d9cf5416bed2ca19592812d62c41 (diff) | |
Merge drm/drm-next into drm-intel-next-queued
We need a backmerge to get DP_DPCD_REV_14 before we push other
i915 changes to dinq that could break compilation.
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'security/integrity/ima/ima_policy.c')
| -rw-r--r-- | security/integrity/ima/ima_policy.c | 70 | 
1 files changed, 45 insertions, 25 deletions
| diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index d89bebf85421..cdcc9a7b4e24 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c @@ -33,6 +33,7 @@  #define IMA_INMASK	0x0040  #define IMA_EUID	0x0080  #define IMA_PCR		0x0100 +#define IMA_FSNAME	0x0200  #define UNKNOWN		0  #define MEASURE		0x0001	/* same as IMA_MEASURE */ @@ -74,6 +75,7 @@ struct ima_rule_entry {  		void *args_p;	/* audit value */  		int type;	/* audit type */  	} lsm[MAX_LSM_RULES]; +	char *fsname;  };  /* @@ -273,6 +275,9 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode,  	if ((rule->flags & IMA_FSMAGIC)  	    && rule->fsmagic != inode->i_sb->s_magic)  		return false; +	if ((rule->flags & IMA_FSNAME) +	    && strcmp(rule->fsname, inode->i_sb->s_type->name)) +		return false;  	if ((rule->flags & IMA_FSUUID) &&  	    !uuid_equal(&rule->fsuuid, &inode->i_sb->s_uuid))  		return false; @@ -435,6 +440,17 @@ void ima_update_policy_flag(void)  		ima_policy_flag &= ~IMA_APPRAISE;  } +static int ima_appraise_flag(enum ima_hooks func) +{ +	if (func == MODULE_CHECK) +		return IMA_APPRAISE_MODULES; +	else if (func == FIRMWARE_CHECK) +		return IMA_APPRAISE_FIRMWARE; +	else if (func == POLICY_CHECK) +		return IMA_APPRAISE_POLICY; +	return 0; +} +  /**   * ima_init_policy - initialize the default measure rules.   * @@ -473,9 +489,11 @@ void __init ima_init_policy(void)  	 * Insert the appraise rules requiring file signatures, prior to  	 * any other appraise rules.  	 */ -	for (i = 0; i < secure_boot_entries; i++) -		list_add_tail(&secure_boot_rules[i].list, -			      &ima_default_rules); +	for (i = 0; i < secure_boot_entries; i++) { +		list_add_tail(&secure_boot_rules[i].list, &ima_default_rules); +		temp_ima_appraise |= +		    ima_appraise_flag(secure_boot_rules[i].func); +	}  	for (i = 0; i < appraise_entries; i++) {  		list_add_tail(&default_appraise_rules[i].list, @@ -509,22 +527,9 @@ int ima_check_policy(void)   */  void ima_update_policy(void)  { -	struct list_head *first, *last, *policy; - -	/* append current policy with the new rules */ -	first = (&ima_temp_rules)->next; -	last = (&ima_temp_rules)->prev; -	policy = &ima_policy_rules; - -	synchronize_rcu(); +	struct list_head *policy = &ima_policy_rules; -	last->next = policy; -	rcu_assign_pointer(list_next_rcu(policy->prev), first); -	first->prev = policy->prev; -	policy->prev = last; - -	/* prepare for the next policy rules addition */ -	INIT_LIST_HEAD(&ima_temp_rules); +	list_splice_tail_init_rcu(&ima_temp_rules, policy, synchronize_rcu);  	if (ima_rules != policy) {  		ima_policy_flag = 0; @@ -540,7 +545,7 @@ enum {  	Opt_audit, Opt_hash, Opt_dont_hash,  	Opt_obj_user, Opt_obj_role, Opt_obj_type,  	Opt_subj_user, Opt_subj_role, Opt_subj_type, -	Opt_func, Opt_mask, Opt_fsmagic, +	Opt_func, Opt_mask, Opt_fsmagic, Opt_fsname,  	Opt_fsuuid, Opt_uid_eq, Opt_euid_eq, Opt_fowner_eq,  	Opt_uid_gt, Opt_euid_gt, Opt_fowner_gt,  	Opt_uid_lt, Opt_euid_lt, Opt_fowner_lt, @@ -565,6 +570,7 @@ static match_table_t policy_tokens = {  	{Opt_func, "func=%s"},  	{Opt_mask, "mask=%s"},  	{Opt_fsmagic, "fsmagic=%s"}, +	{Opt_fsname, "fsname=%s"},  	{Opt_fsuuid, "fsuuid=%s"},  	{Opt_uid_eq, "uid=%s"},  	{Opt_euid_eq, "euid=%s"}, @@ -776,6 +782,17 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)  			if (!result)  				entry->flags |= IMA_FSMAGIC;  			break; +		case Opt_fsname: +			ima_log_string(ab, "fsname", args[0].from); + +			entry->fsname = kstrdup(args[0].from, GFP_KERNEL); +			if (!entry->fsname) { +				result = -ENOMEM; +				break; +			} +			result = 0; +			entry->flags |= IMA_FSNAME; +			break;  		case Opt_fsuuid:  			ima_log_string(ab, "fsuuid", args[0].from); @@ -917,12 +934,9 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)  	}  	if (!result && (entry->action == UNKNOWN))  		result = -EINVAL; -	else if (entry->func == MODULE_CHECK) -		temp_ima_appraise |= IMA_APPRAISE_MODULES; -	else if (entry->func == FIRMWARE_CHECK) -		temp_ima_appraise |= IMA_APPRAISE_FIRMWARE; -	else if (entry->func == POLICY_CHECK) -		temp_ima_appraise |= IMA_APPRAISE_POLICY; +	else if (entry->action == APPRAISE) +		temp_ima_appraise |= ima_appraise_flag(entry->func); +  	audit_log_format(ab, "res=%d", !result);  	audit_log_end(ab);  	return result; @@ -1104,6 +1118,12 @@ int ima_policy_show(struct seq_file *m, void *v)  		seq_puts(m, " ");  	} +	if (entry->flags & IMA_FSNAME) { +		snprintf(tbuf, sizeof(tbuf), "%s", entry->fsname); +		seq_printf(m, pt(Opt_fsname), tbuf); +		seq_puts(m, " "); +	} +  	if (entry->flags & IMA_PCR) {  		snprintf(tbuf, sizeof(tbuf), "%d", entry->pcr);  		seq_printf(m, pt(Opt_pcr), tbuf); |