Re: [PATCH] libselinux: introduce enforcing mode override option

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

 



On Mon, 2007-11-05 at 15:15 -0500, Eamon Walsh wrote:
> Introduces an enforcing mode override option, so the object manager
> can bring up the AVC in permissive mode on an enforcing system, or
> vice versa.

I don't see a way for the object manager to change the enforcing status
after avc_open().

attribute aligned diffs can be a separate patch.

> 
> Signed-off-by: Eamon Walsh <ewalsh@xxxxxxxxxxxxx>
> ---
> 
>  include/selinux/avc.h |   11 ++++++++++-
>  src/avc.c             |   29 ++++++++++++++++++++---------
>  src/avc_internal.c    |    7 +++++--
>  src/avc_internal.h    |    1 +
>  4 files changed, 36 insertions(+), 12 deletions(-)
> 
> 
> Index: libselinux/include/selinux/avc.h
> ===================================================================
> --- libselinux/include/selinux/avc.h	(revision 2671)
> +++ libselinux/include/selinux/avc.h	(working copy)
> @@ -157,6 +157,15 @@
>  };
>  
>  /*
> + * Available options
> + */
> +
> +/* no-op option, useful for unused slots in an array of options */
> +#define AVC_OPT_UNUSED		0
> +/* override kernel enforcing mode (boolean value) */
> +#define AVC_OPT_SETENFORCE	1
> +
> +/*
>   * AVC operations
>   */
>  
> @@ -188,7 +197,7 @@
>   *
>   * This function is identical to avc_init(), except the message prefix
>   * is set to "avc" and any callbacks desired should be specified via
> - * selinux_set_callback().  No options are currently supported.
> + * selinux_set_callback().  Available options are listed above.
>   */
>  int avc_open(struct selinux_opt *opts, unsigned nopts);
>  
> Index: libselinux/src/avc.c
> ===================================================================
> --- libselinux/src/avc.c	(revision 2671)
> +++ libselinux/src/avc.c	(working copy)
> @@ -157,10 +157,19 @@
>  	return rc;
>  }
>  
> -int avc_open(struct selinux_opt *opts __attribute__((unused)),
> -	     unsigned nopts __attribute__((unused)))
> +int avc_open(struct selinux_opt *opts, unsigned nopts)
>  {
> -    return avc_init("avc", NULL, NULL, NULL, NULL);
> +	avc_setenforce = 0;
> +
> +	while (nopts--)
> +		switch(opts[nopts].type) {
> +		case AVC_OPT_SETENFORCE:
> +			avc_setenforce = 1;
> +			avc_enforcing = !!opts[nopts].value;
> +			break;
> +		}
> +
> +	return avc_init("avc", NULL, NULL, NULL, NULL);
>  }
>  
>  int avc_init(const char *prefix,
> @@ -213,13 +222,15 @@
>  		avc_node_freelist = new;
>  	}
>  
> -	rc = security_getenforce();
> -	if (rc < 0) {
> -		avc_log("%s:  could not determine enforcing mode\n",
> -			avc_prefix);
> -		goto out;
> +	if (!avc_setenforce) {
> +		rc = security_getenforce();
> +		if (rc < 0) {
> +			avc_log("%s:  could not determine enforcing mode\n",
> +				avc_prefix);
> +			goto out;
> +		}
> +		avc_enforcing = rc;
>  	}
> -	avc_enforcing = rc;
>  
>  	rc = avc_netlink_open(avc_using_threads);
>  	if (rc < 0) {
> Index: libselinux/src/avc_internal.h
> ===================================================================
> --- libselinux/src/avc_internal.h	(revision 2671)
> +++ libselinux/src/avc_internal.h	(working copy)
> @@ -74,6 +74,7 @@
>  extern char avc_prefix[AVC_PREFIX_SIZE] hidden;
>  extern int avc_running hidden;
>  extern int avc_enforcing hidden;
> +extern int avc_setenforce hidden;
>  
>  /* user-supplied callback interface for avc */
>  static inline void *avc_malloc(size_t size)
> Index: libselinux/src/avc_internal.c
> ===================================================================
> --- libselinux/src/avc_internal.c	(revision 2671)
> +++ libselinux/src/avc_internal.c	(working copy)
> @@ -46,6 +46,7 @@
>  char avc_prefix[AVC_PREFIX_SIZE] = "uavc";
>  int avc_running = 0;
>  int avc_enforcing = 1;
> +int avc_setenforce = 0;
>  int avc_netlink_trouble = 0;
>  
>  /* netlink socket code */
> @@ -151,6 +152,8 @@
>  		struct selnl_msg_setenforce *msg = NLMSG_DATA(nlh);
>  		avc_log("%s:  received setenforce notice (enforcing=%d)\n",
>  			avc_prefix, msg->val);
> +		if (avc_setenforce)
> +			break;
>  		avc_enforcing = msg->val;
>  		if (avc_enforcing && (rc = avc_ss_reset(0)) < 0) {
>  			avc_log("%s:  cache reset returned %d (errno %d)\n",
> @@ -183,7 +186,7 @@
>  int avc_netlink_check_nb(void)
>  {
>  	int rc;
> -	char buf[1024];
> +	char buf[1024] __attribute__ ((aligned));
>  
>  	while (1) {
>  		errno = 0;
> @@ -209,7 +212,7 @@
>  void avc_netlink_loop(void)
>  {
>  	int rc;
> -	char buf[1024];
> +	char buf[1024] __attribute__ ((aligned));
>  
>  	while (1) {
>  		errno = 0;
> 
> -- 
> Eamon Walsh <ewalsh@xxxxxxxxxxxxx>
> National Security Agency
> 
> 
> --
> This message was distributed to subscribers of the selinux mailing list.
> If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
> the words "unsubscribe selinux" without quotes as the message.
-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux