-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Signed-off-by: Andrew G. Morgan <[EMAIL PROTECTED]>

Cheers

Andrew

Casey Schaufler wrote:
> From: Casey Schaufler <[EMAIL PROTECTED]>
> 
> This patch takes advantage of the increase in capability bits
> to allocate capabilities for Mandatory Access Control. Whereas
> Smack was overloading a previously allocated capability it is
> now using a pair, one for overriding access control checks and
> the other for changes to the MAC configuration.
> 
> The two capabilities allocated should be obvious in their intent.
> The comments in capability.h are intended to make it clear that
> there is no intention that implementations of MAC LSM modules
> be any more constrained by the presence of these capabilities
> than an implementation of DAC LSM modules are by the analogous
> DAC capabilities.
> 
> 
> Signed-off-by: Casey Schaufler <[EMAIL PROTECTED]>
> 
> ---
> 
> The companion patch for libcap-2.02 is provided as an attachment.
> The attachment is not a kernel patch, although it would be easy to
> mistake it for one.
> 
> Introduces CAP_FS_MASK_B1 and uses it as appropriate. I think that
> I found all the places it needs to be used, but don't hesitate to
> let me know if I missed something.
> 
> Thank you.
> 
>  include/linux/capability.h |   24 ++++++++++++++++++++++--
>  security/smack/smack.h     |    8 --------
>  security/smack/smack_lsm.c |    8 ++++----
>  security/smack/smackfs.c   |   12 ++++++------
>  4 files changed, 32 insertions(+), 20 deletions(-)
> 
> diff -uprN -X linux-2.6.24-rc3-mm1-base/Documentation/dontdiff 
> linux-2.6.24-rc3-mm1-base/include/linux/capability.h 
> linux-2.6.24-rc3-mm1-smack/include/linux/capability.h
> --- linux-2.6.24-rc3-mm1-base/include/linux/capability.h      2007-11-22 
> 01:51:36.000000000 -0800
> +++ linux-2.6.24-rc3-mm1-smack/include/linux/capability.h     2007-11-25 
> 21:38:34.000000000 -0800
> @@ -314,6 +314,23 @@ typedef struct kernel_cap_struct {
>  
>  #define CAP_SETFCAP       31
>  
> +/* Override MAC access.
> +   The base kernel enforces no MAC policy.
> +   An LSM may enforce a MAC policy, and if it does and it chooses
> +   to implement capability based overrides of that policy, this is
> +   the capability it should use to do so. */
> +
> +#define CAP_MAC_OVERRIDE     32
> +
> +/* Allow MAC configuration or state changes.
> +   The base kernel requires no MAC configuration.
> +   An LSM may enforce a MAC policy, and if it does and it chooses
> +   to implement capability based checks on modifications to that
> +   policy or the data required to maintain it, this is the
> +   capability it should use to do so. */
> +
> +#define CAP_MAC_ADMIN        33
> +
>  /*
>   * Bit location of each capability (used by user-space library and kernel)
>   */
> @@ -336,6 +353,8 @@ typedef struct kernel_cap_struct {
>                           | CAP_TO_MASK(CAP_FOWNER)           \
>                           | CAP_TO_MASK(CAP_FSETID))
>  
> +# define CAP_FS_MASK_B1     (CAP_TO_MASK(CAP_MAC_OVERRIDE))
> +
>  #if _LINUX_CAPABILITY_U32S != 2
>  # error Fix up hand-coded capability macro initializers
>  #else /* HAND-CODED capability initializers */
> @@ -343,8 +362,9 @@ typedef struct kernel_cap_struct {
>  # define CAP_EMPTY_SET    {{ 0, 0 }}
>  # define CAP_FULL_SET     {{ ~0, ~0 }}
>  # define CAP_INIT_EFF_SET {{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }}
> -# define CAP_FS_SET       {{ CAP_FS_MASK_B0, 0 }}
> -# define CAP_NFSD_SET     {{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), 0 
> }}
> +# define CAP_FS_SET       {{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } }
> +# define CAP_NFSD_SET     {{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
> +                          CAP_FS_MASK_B1 } }
>  
>  #endif /* _LINUX_CAPABILITY_U32S != 2 */
>  
> diff -uprN -X linux-2.6.24-rc3-mm1-base/Documentation/dontdiff 
> linux-2.6.24-rc3-mm1-base/security/smack/smackfs.c 
> linux-2.6.24-rc3-mm1-smack/security/smack/smackfs.c
> --- linux-2.6.24-rc3-mm1-base/security/smack/smackfs.c        2007-11-22 
> 01:51:43.000000000 -0800
> +++ linux-2.6.24-rc3-mm1-smack/security/smack/smackfs.c       2007-11-24 
> 11:29:29.000000000 -0800
> @@ -241,7 +241,7 @@ static ssize_t smk_write_load(struct fil
>        * No partial writes.
>        * Enough data must be present.
>        */
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>       if (*ppos != 0)
>               return -EINVAL;
> @@ -474,7 +474,7 @@ static ssize_t smk_write_cipso(struct fi
>        * No partial writes.
>        * Enough data must be present.
>        */
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>       if (*ppos != 0)
>               return -EINVAL;
> @@ -601,7 +601,7 @@ static ssize_t smk_write_doi(struct file
>       char temp[80];
>       int i;
>  
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       if (count >= sizeof(temp) || count == 0)
> @@ -666,7 +666,7 @@ static ssize_t smk_write_direct(struct f
>       char temp[80];
>       int i;
>  
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       if (count >= sizeof(temp) || count == 0)
> @@ -747,7 +747,7 @@ static ssize_t smk_write_ambient(struct 
>       char in[SMK_LABELLEN];
>       char *smack;
>  
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       if (count >= SMK_LABELLEN)
> @@ -840,7 +840,7 @@ static ssize_t smk_write_nltype(struct f
>       char *cp;
>       int i;
>  
> -     if (!capable(CAP_MAC_OVERRIDE))
> +     if (!capable(CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       if (count >= 40)
> diff -uprN -X linux-2.6.24-rc3-mm1-base/Documentation/dontdiff 
> linux-2.6.24-rc3-mm1-base/security/smack/smack.h 
> linux-2.6.24-rc3-mm1-smack/security/smack/smack.h
> --- linux-2.6.24-rc3-mm1-base/security/smack/smack.h  2007-11-22 
> 01:51:43.000000000 -0800
> +++ linux-2.6.24-rc3-mm1-smack/security/smack/smack.h 2007-11-22 
> 03:03:19.000000000 -0800
> @@ -162,14 +162,6 @@ struct smack_known {
>  #define MAY_NOT              0
>  
>  /*
> - * There are not enough CAP bits available to make this
> - * real, so Casey borrowed the capability that looks to
> - * him like it has the best balance of similarity amd
> - * low use.
> - */
> -#define CAP_MAC_OVERRIDE CAP_LINUX_IMMUTABLE
> -
> -/*
>   * These functions are in smack_lsm.c
>   */
>  struct inode_smack *new_inode_smack(char *);
> diff -uprN -X linux-2.6.24-rc3-mm1-base/Documentation/dontdiff 
> linux-2.6.24-rc3-mm1-base/security/smack/smack_lsm.c 
> linux-2.6.24-rc3-mm1-smack/security/smack/smack_lsm.c
> --- linux-2.6.24-rc3-mm1-base/security/smack/smack_lsm.c      2007-11-22 
> 01:51:43.000000000 -0800
> +++ linux-2.6.24-rc3-mm1-smack/security/smack/smack_lsm.c     2007-11-24 
> 11:31:43.000000000 -0800
> @@ -585,7 +585,7 @@ static int smack_inode_setxattr(struct d
>                               void *value, size_t size, int flags)
>  {
>       if (strcmp(name, XATTR_NAME_SMACK) == 0 &&
> -             !__capable(current, CAP_MAC_OVERRIDE))
> +             !__capable(current, CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       return smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
> @@ -649,14 +649,14 @@ static int smack_inode_getxattr(struct d
>   * @dentry: the object
>   * @name: name of the attribute
>   *
> - * Removing the Smack attribute requires CAP_MAC_OVERRIDE
> + * Removing the Smack attribute requires CAP_MAC_ADMIN
>   *
>   * Returns 0 if access is permitted, an error code otherwise
>   */
>  static int smack_inode_removexattr(struct dentry *dentry, char *name)
>  {
>       if (strcmp(name, XATTR_NAME_SMACK) == 0 &&
> -             !__capable(current, CAP_MAC_OVERRIDE))
> +             !__capable(current, CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       return smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
> @@ -1956,7 +1956,7 @@ static int smack_setprocattr(struct task
>  {
>       char *newsmack;
>  
> -     if (!__capable(p, CAP_MAC_OVERRIDE))
> +     if (!__capable(p, CAP_MAC_ADMIN))
>               return -EPERM;
>  
>       /*
> 
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)

iD8DBQFHS42JQheEq9QabfIRAjNBAJ4juUkQSitc4D6WZvUr/X2hQNw6gwCfZgDh
cQh53qWZndH2ZRHATg9/Ho0=
=vEuK
-----END PGP SIGNATURE-----
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to