Re: [PATCH] libsepol: Report all neverallow violations.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/14/2014 01:51 PM, Stephen Smalley wrote:
> Switch libsepol check_assertions() from only reporting the first violation
> to reporting them all.
> 
> Change-Id: I45b3502ff96b1d093574e1fecff93a582f8d00bd
> Signed-off-by: Stephen Smalley <sds@xxxxxxxxxxxxx>

Acked-by: Steve Lawrence <slawrence@xxxxxxxxxx>

> ---
>  libsepol/src/assertion.c | 99 +++++++++++++++++++++++++-----------------------
>  1 file changed, 52 insertions(+), 47 deletions(-)
> 
> diff --git a/libsepol/src/assertion.c b/libsepol/src/assertion.c
> index ebc011b..5e4c4e8 100644
> --- a/libsepol/src/assertion.c
> +++ b/libsepol/src/assertion.c
> @@ -27,38 +27,12 @@
>  
>  #include "debug.h"
>  
> -static int check_assertion_helper(sepol_handle_t * handle,
> -				  policydb_t * p,
> -				  avtab_t * te_avtab, avtab_t * te_cond_avtab,
> -				  unsigned int stype, unsigned int ttype,
> -				  avrule_t * avrule)
> +static void report_failure(sepol_handle_t *handle, policydb_t *p,
> +			   const avrule_t * avrule,
> +			   unsigned int stype, unsigned int ttype,
> +			   const class_perm_node_t *curperm,
> +			   const avtab_ptr_t node)
>  {
> -	avtab_key_t avkey;
> -	avtab_ptr_t node;
> -	class_perm_node_t *curperm;
> -
> -	for (curperm = avrule->perms; curperm != NULL; curperm = curperm->next) {
> -		avkey.source_type = stype + 1;
> -		avkey.target_type = ttype + 1;
> -		avkey.target_class = curperm->class;
> -		avkey.specified = AVTAB_ALLOWED;
> -		for (node = avtab_search_node(te_avtab, &avkey);
> -		     node != NULL;
> -		     node = avtab_search_node_next(node, avkey.specified)) {
> -			if (node->datum.data & curperm->data)
> -				goto err;
> -		}
> -		for (node = avtab_search_node(te_cond_avtab, &avkey);
> -		     node != NULL;
> -		     node = avtab_search_node_next(node, avkey.specified)) {
> -			if (node->datum.data & curperm->data)
> -				goto err;
> -		}
> -	}
> -
> -	return 0;
> -
> -      err:
>  	if (avrule->source_filename) {
>  		ERR(handle, "neverallow on line %lu of %s (or line %lu of policy.conf) violated by allow %s %s:%s {%s };",
>  		    avrule->source_line, avrule->source_filename, avrule->line,
> @@ -76,13 +50,49 @@ static int check_assertion_helper(sepol_handle_t * handle,
>  				       node->datum.data & curperm->data));
>  	} else {
>  		ERR(handle, "neverallow violated by allow %s %s:%s {%s };",
> -		    p->p_type_val_to_name[stype], 
> +		    p->p_type_val_to_name[stype],
>  		    p->p_type_val_to_name[ttype],
>  		    p->p_class_val_to_name[curperm->class - 1],
>  		    sepol_av_to_string(p, curperm->class,
>  				       node->datum.data & curperm->data));
>  	}
> -	return -1;
> +}
> +
> +static unsigned long check_assertion_helper(sepol_handle_t * handle,
> +				  policydb_t * p,
> +				  avtab_t * te_avtab, avtab_t * te_cond_avtab,
> +				  unsigned int stype, unsigned int ttype,
> +				  const avrule_t * avrule)
> +{
> +	avtab_key_t avkey;
> +	avtab_ptr_t node;
> +	class_perm_node_t *curperm;
> +	unsigned long errors = 0;
> +
> +	for (curperm = avrule->perms; curperm != NULL; curperm = curperm->next) {
> +		avkey.source_type = stype + 1;
> +		avkey.target_type = ttype + 1;
> +		avkey.target_class = curperm->class;
> +		avkey.specified = AVTAB_ALLOWED;
> +		for (node = avtab_search_node(te_avtab, &avkey);
> +		     node != NULL;
> +		     node = avtab_search_node_next(node, avkey.specified)) {
> +			if (node->datum.data & curperm->data) {
> +				report_failure(handle, p, avrule, stype, ttype, curperm, node);
> +				errors++;
> +			}
> +		}
> +		for (node = avtab_search_node(te_cond_avtab, &avkey);
> +		     node != NULL;
> +		     node = avtab_search_node_next(node, avkey.specified)) {
> +			if (node->datum.data & curperm->data) {
> +				report_failure(handle, p, avrule, stype, ttype, curperm, node);
> +				errors++;
> +			}
> +		}
> +	}
> +
> +	return errors;
>  }
>  
>  int check_assertions(sepol_handle_t * handle, policydb_t * p,
> @@ -92,7 +102,7 @@ int check_assertions(sepol_handle_t * handle, policydb_t * p,
>  	avtab_t te_avtab, te_cond_avtab;
>  	ebitmap_node_t *snode, *tnode;
>  	unsigned int i, j;
> -	int rc;
> +	unsigned long errors = 0;
>  
>  	if (!avrules) {
>  		/* Since assertions are stored in avrules, if it is NULL
> @@ -127,31 +137,26 @@ int check_assertions(sepol_handle_t * handle, policydb_t * p,
>  			if (!ebitmap_node_get_bit(snode, i))
>  				continue;
>  			if (a->flags & RULE_SELF) {
> -				if (check_assertion_helper
> +				errors += check_assertion_helper
>  				    (handle, p, &te_avtab, &te_cond_avtab, i, i,
> -				     a)) {
> -					rc = -1;
> -					goto out;
> -				}
> +				     a);
>  			}
>  			ebitmap_for_each_bit(ttypes, tnode, j) {
>  				if (!ebitmap_node_get_bit(tnode, j))
>  					continue;
> -				if (check_assertion_helper
> +				errors += check_assertion_helper
>  				    (handle, p, &te_avtab, &te_cond_avtab, i, j,
> -				     a)) {
> -					rc = -1;
> -					goto out;
> -				}
> +				     a);
>  			}
>  		}
>  	}
>  
> -	rc = 0;
> -out:
> +	if (errors)
> +		ERR(handle, "%lu neverallow failures occurred", errors);
> +
>  	avtab_destroy(&te_avtab);
>  	avtab_destroy(&te_cond_avtab);
> -	return rc;
> +	return errors ? -1 : 0;
>  
>        oom:
>  	ERR(handle, "Out of memory - unable to check neverallows");
> 

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux