Merge branch 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorri...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Jun 2018 22:40:37 +0000 (15:40 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Jun 2018 22:40:37 +0000 (15:40 -0700)
Pull integrity updates from James Morris:
 "From Mimi:

   - add run time support for specifying additional security xattrs
     included in the security.evm HMAC/signature

   - some code clean up and bug fixes"

* 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
  EVM: unlock on error path in evm_read_xattrs()
  EVM: prevent array underflow in evm_write_xattrs()
  EVM: Fix null dereference on xattr when xattr fails to allocate
  EVM: fix memory leak of temporary buffer 'temp'
  IMA: use list_splice_tail_init_rcu() instead of its open coded variant
  ima: use match_string() helper
  ima: fix updating the ima_appraise flag
  ima: based on policy verify firmware signatures (pre-allocated buffer)
  ima: define a new policy condition based on the filesystem name
  EVM: Allow runtime modification of the set of verified xattrs
  EVM: turn evm_config_xattrnames into a list
  integrity: Add an integrity directory in securityfs
  ima: Remove unused variable ima_initialized
  ima: Unify logging
  ima: Reflect correct permissions for policy

1  2 
include/uapi/linux/audit.h
security/integrity/evm/evm_crypto.c

index 04f9bd249094efdec6e58940613dcdd726e53d25,65d9293f1fb83b3f71df89c40c7ebcab8bdbba72..c35aee9ad4a6f7f7ffc3819f5c69425f42353a7f
  #define AUDIT_INTEGRITY_HASH      1803 /* Integrity HASH type */
  #define AUDIT_INTEGRITY_PCR       1804 /* PCR invalidation msgs */
  #define AUDIT_INTEGRITY_RULE      1805 /* policy rule */
+ #define AUDIT_INTEGRITY_EVM_XATTR   1806 /* New EVM-covered xattr */
  
  #define AUDIT_KERNEL          2000    /* Asynchronous audit record. NOT A REQUEST. */
  
@@@ -465,7 -466,6 +466,7 @@@ struct audit_tty_status 
  };
  
  #define AUDIT_UID_UNSET (unsigned int)-1
 +#define AUDIT_SID_UNSET ((unsigned int)-1)
  
  /* audit_rule_data supports filter rules with both integer and string
   * fields.  It corresponds with AUDIT_ADD_RULE, AUDIT_DEL_RULE and
index facf9cdd577d963a9fa1ecb185652bd306951f3d,494da5fcc092a83737c40aff0174cb09c8fd1938..b605243108556d399f71cc9a248b12eea9db3d1e
@@@ -192,16 -192,15 +192,16 @@@ static int evm_calc_hmac_or_hash(struc
                                char type, char *digest)
  {
        struct inode *inode = d_backing_inode(dentry);
+       struct xattr_list *xattr;
        struct shash_desc *desc;
-       char **xattrname;
        size_t xattr_size = 0;
        char *xattr_value = NULL;
        int error;
        int size;
        bool ima_present = false;
  
 -      if (!(inode->i_opflags & IOP_XATTR))
 +      if (!(inode->i_opflags & IOP_XATTR) ||
 +          inode->i_sb->s_user_ns != &init_user_ns)
                return -EOPNOTSUPP;
  
        desc = init_desc(type);
                return PTR_ERR(desc);
  
        error = -ENODATA;
-       for (xattrname = evm_config_xattrnames; *xattrname != NULL; xattrname++) {
+       list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) {
                bool is_ima = false;
  
-               if (strcmp(*xattrname, XATTR_NAME_IMA) == 0)
+               if (strcmp(xattr->name, XATTR_NAME_IMA) == 0)
                        is_ima = true;
  
                if ((req_xattr_name && req_xattr_value)
-                   && !strcmp(*xattrname, req_xattr_name)) {
+                   && !strcmp(xattr->name, req_xattr_name)) {
                        error = 0;
                        crypto_shash_update(desc, (const u8 *)req_xattr_value,
                                             req_xattr_value_len);
                                ima_present = true;
                        continue;
                }
-               size = vfs_getxattr_alloc(dentry, *xattrname,
+               size = vfs_getxattr_alloc(dentry, xattr->name,
                                          &xattr_value, xattr_size, GFP_NOFS);
                if (size == -ENOMEM) {
                        error = -ENOMEM;