RE: [PATCH] Fix extended permissions neverallow checking

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

 



> -----Original Message-----
> From: Selinux [mailto:selinux-bounces@xxxxxxxxxxxxx] On Behalf Of Jeff Vander
> Stoep
> Sent: Wednesday, April 20, 2016 1:50 PM
> To: selinux@xxxxxxxxxxxxx
> Cc: sds@xxxxxxxxxxxxx
> Subject: [PATCH] Fix extended permissions neverallow checking
> 
> Commit 99fc177b "Add neverallow support for ioctl extended permissions"
> first checks to see if the ioctl permission is granted, then checks to see if the
> same source/target violates a neverallowed ioctl command.
> Unfortunately this does not address the case where the ioctl permission and
> extended permissions are granted on different attributes. Example, the following
> will incorrectly cause a neverallow violation.
> 
> allow untrusted_app self:tcp_socket ioctl; allowxperm domain
> domain:tcp_socket unpriv_sock_ioctls; neverallowxperm untrusted_app
> domain:tcp_socket ~unpriv_sock_ioctls;
> 
> The fix is to enumerate over the source and target attributes when looking for
> extended permission violations.
> 
> Note: The bug this addresses incorrectly asserts that a violation has occurred.
> Actual neverallow violations are always caught.
> 
Tested-by: William Roberts <william.c.roberts@xxxxxxxxx>
> Signed-off-by: Jeff Vander Stoep <jeffv@xxxxxxxxxx>
> ---
>  libsepol/src/assertion.c | 93 +++++++++++++++++++++++++++++++--------------
> ---
>  1 file changed, 60 insertions(+), 33 deletions(-)
> 
> diff --git a/libsepol/src/assertion.c b/libsepol/src/assertion.c index
> fbf397f..f4429ad 100644
> --- a/libsepol/src/assertion.c
> +++ b/libsepol/src/assertion.c
> @@ -147,36 +147,49 @@ static int
> report_assertion_extended_permissions(sepol_handle_t *handle,
>  	avtab_key_t tmp_key;
>  	avtab_extended_perms_t *xperms;
>  	avtab_extended_perms_t error;
> +	ebitmap_t *sattr = &p->type_attr_map[k->source_type - 1];
> +	ebitmap_t *tattr = &p->type_attr_map[k->target_type - 1];
> +	ebitmap_node_t *snode, *tnode;
> +	unsigned int i, j;
>  	int rc = 1;
>  	int ret = 0;
> 
>  	memcpy(&tmp_key, k, sizeof(avtab_key_t));
>  	tmp_key.specified = AVTAB_XPERMS_ALLOWED;
> 
> -	for (node = avtab_search_node(avtab, &tmp_key);
> -	     node;
> -	     node = avtab_search_node_next(node, tmp_key.specified)) {
> -		xperms = node->datum.xperms;
> -		if ((xperms->specified != AVTAB_XPERMS_IOCTLFUNCTION)
> -				&& (xperms->specified !=
> AVTAB_XPERMS_IOCTLDRIVER))
> +	ebitmap_for_each_bit(sattr, snode, i) {
> +		if (!ebitmap_node_get_bit(snode, i))
>  			continue;
> +		ebitmap_for_each_bit(tattr, tnode, j) {
> +			if (!ebitmap_node_get_bit(tnode, j))
> +				continue;
> +			tmp_key.source_type = i + 1;
> +			tmp_key.target_type = j + 1;
> +			for (node = avtab_search_node(avtab, &tmp_key);
> +			     node;
> +			     node = avtab_search_node_next(node,
> tmp_key.specified)) {
> +				xperms = node->datum.xperms;
> +				if ((xperms->specified !=
> AVTAB_XPERMS_IOCTLFUNCTION)
> +						&& (xperms->specified !=
> AVTAB_XPERMS_IOCTLDRIVER))
> +					continue;
> 
> -		rc = check_extended_permissions(avrule->xperms, xperms);
> -		/* failure on the extended permission
> check_extended_permissionss */
> -		if (rc) {
> -			extended_permissions_violated(&error, avrule->xperms,
> xperms);
> -			ERR(handle, "neverallowxperm on line %lu of %s (or line
> %lu of policy.conf) violated by\n"
> -					"allowxperm %s %s:%s %s;",
> -					avrule->source_line, avrule-
> >source_filename, avrule->line,
> -					p->p_type_val_to_name[stype],
> -					p->p_type_val_to_name[ttype],
> -					p->p_class_val_to_name[curperm-
> >tclass - 1],
> -
> 	sepol_extended_perms_to_string(&error));
> -
> -			rc = 0;
> -			ret++;
> +				rc = check_extended_permissions(avrule-
> >xperms, xperms);
> +				/* failure on the extended permission
> check_extended_permissionss */
> +				if (rc) {
> +					extended_permissions_violated(&error,
> avrule->xperms, xperms);
> +					ERR(handle, "neverallowxperm on line
> %lu of %s (or line %lu of policy.conf) violated by\n"
> +							"allowxperm %s %s:%s
> %s;",
> +							avrule->source_line,
> avrule->source_filename, avrule->line,
> +							p-
> >p_type_val_to_name[stype],
> +							p-
> >p_type_val_to_name[ttype],
> +							p-
> >p_class_val_to_name[curperm->tclass - 1],
> +
> 	sepol_extended_perms_to_string(&error));
> +
> +					rc = 0;
> +					ret++;
> +				}
> +			}
>  		}
> -
>  	}
> 
>  	/* failure on the regular permissions */ @@ -319,28 +332,42 @@ oom:
>   *    granted
>   */
>  static int check_assertion_extended_permissions(avrule_t *avrule, avtab_t
> *avtab,
> -						avtab_key_t *k)
> +						avtab_key_t *k, policydb_t *p)
>  {
>  	avtab_ptr_t node;
>  	avtab_key_t tmp_key;
>  	avtab_extended_perms_t *xperms;
>  	av_extended_perms_t *neverallow_xperms = avrule->xperms;
> +	ebitmap_t *sattr = &p->type_attr_map[k->source_type - 1];
> +	ebitmap_t *tattr = &p->type_attr_map[k->target_type - 1];
> +	ebitmap_node_t *snode, *tnode;
> +	unsigned int i, j;
>  	int rc = 1;
> 
>  	memcpy(&tmp_key, k, sizeof(avtab_key_t));
>  	tmp_key.specified = AVTAB_XPERMS_ALLOWED;
> 
> -	for (node = avtab_search_node(avtab, &tmp_key);
> -	     node;
> -	     node = avtab_search_node_next(node, tmp_key.specified)) {
> -		xperms = node->datum.xperms;
> -		if ((xperms->specified != AVTAB_XPERMS_IOCTLFUNCTION)
> -				&& (xperms->specified !=
> AVTAB_XPERMS_IOCTLDRIVER))
> +	ebitmap_for_each_bit(sattr, snode, i) {
> +		if (!ebitmap_node_get_bit(snode, i))
>  			continue;
> -
> -		rc = check_extended_permissions(neverallow_xperms, xperms);
> -		if (rc)
> -			break;
> +		ebitmap_for_each_bit(tattr, tnode, j) {
> +			if (!ebitmap_node_get_bit(tnode, j))
> +				continue;
> +			tmp_key.source_type = i + 1;
> +			tmp_key.target_type = j + 1;
> +			for (node = avtab_search_node(avtab, &tmp_key);
> +			     node;
> +			     node = avtab_search_node_next(node,
> tmp_key.specified)) {
> +				xperms = node->datum.xperms;
> +
> +				if ((xperms->specified !=
> AVTAB_XPERMS_IOCTLFUNCTION)
> +						&& (xperms->specified !=
> AVTAB_XPERMS_IOCTLDRIVER))
> +					continue;
> +				rc =
> check_extended_permissions(neverallow_xperms, xperms);
> +				if (rc)
> +					break;
> +			}
> +		}
>  	}
> 
>  	return rc;
> @@ -386,7 +413,7 @@ static int check_assertion_avtab_match(avtab_key_t *k,
> avtab_datum_t *d, void *a
>  		goto exit;
> 
>  	if (avrule->specified == AVRULE_XPERMS_NEVERALLOW) {
> -		rc = check_assertion_extended_permissions(avrule, avtab, k);
> +		rc = check_assertion_extended_permissions(avrule, avtab, k, p);
>  		if (rc == 0)
>  			goto exit;
>  	}
> --
> 2.8.0.rc3.226.g39d4020
> 
> _______________________________________________
> 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.

_______________________________________________
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