Re: [PATCH V6] EVM: Allow runtime modification of the set of verified xattrs

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

 



On Thu, May 31, 2018 at 11:47 AM, Mimi Zohar <zohar@xxxxxxxxxxxxxxxxxx> wrote:
> Hi Matthew,
>
> On Tue, 2018-05-15 at 10:38 -0700, Matthew Garrett wrote:
>
> Based on the "IMA: work on audit records produced by IMA" discussion,
> should this new audit record be adding the task info by calling
> "audit_log_task_info(ab, current);" too?

Independent of what info Steve decides he wants in the
AUDIT_INTEGRITY_EVM_XATTR record, the first parameter to
audit_log_start() should be either audit_context() (heading to Linus
during the upcoming merge window) or current->context if this goes in
before then (it doesn't look like it given the timing of things).

> Could you provide Steve with an example of the audit rule?
>
> thanks!
>
> Mimi
>
> [...]
>
>> +/**
>> + * evm_write_xattrs - write() for <securityfs>/evm_xattrs
>> + * @file: file pointer, not actually used
>> + * @buf: where to get the data from
>> + * @count: bytes sent
>> + * @ppos: where to start
>> + *
>> + * Returns number of bytes written or error code, as appropriate
>> + */
>> +static ssize_t evm_write_xattrs(struct file *file, const char __user *buf,
>> +                             size_t count, loff_t *ppos)
>> +{
>> +     int len, err;
>> +     struct xattr_list *xattr, *tmp;
>> +     struct audit_buffer *ab;
>> +     struct iattr newattrs;
>> +     struct inode *inode;
>> +
>> +     if (!capable(CAP_SYS_ADMIN) || evm_xattrs_locked)
>> +             return -EPERM;
>> +
>> +     if (*ppos != 0)
>> +             return -EINVAL;
>> +
>> +     if (count > XATTR_NAME_MAX)
>> +             return -E2BIG;
>> +
>> +     ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_INTEGRITY_EVM_XATTR);
>> +     if (IS_ERR(ab))
>> +             return PTR_ERR(ab);
>> +
>> +     xattr = kmalloc(sizeof(struct xattr_list), GFP_KERNEL);
>> +     if (!xattr) {
>> +             err = -ENOMEM;
>> +             goto out;
>> +     }
>> +
>> +     xattr->name = memdup_user_nul(buf, count);
>> +     if (IS_ERR(xattr->name)) {
>> +             err = PTR_ERR(xattr->name);
>> +             xattr->name = NULL;
>> +             goto out;
>> +     }
>> +
>> +     /* Remove any trailing newline */
>> +     len = strlen(xattr->name);
>> +     if (xattr->name[len-1] == '\n')
>> +             xattr->name[len-1] = '\0';
>> +
>> +     if (strcmp(xattr->name, ".") == 0) {
>> +             evm_xattrs_locked = 1;
>> +             newattrs.ia_mode = S_IFREG | 0440;
>> +             newattrs.ia_valid = ATTR_MODE;
>> +             inode = evm_xattrs->d_inode;
>> +             inode_lock(inode);
>> +             err = simple_setattr(evm_xattrs, &newattrs);
>> +             inode_unlock(inode);
>> +             audit_log_format(ab, "locked");
>> +             if (!err)
>> +                     err = count;
>> +             goto out;
>> +     }
>> +
>> +     audit_log_format(ab, "xattr=");
>> +     audit_log_untrustedstring(ab, xattr->name);
>> +
>> +     if (strncmp(xattr->name, XATTR_SECURITY_PREFIX,
>> +                 XATTR_SECURITY_PREFIX_LEN) != 0) {
>> +             err = -EINVAL;
>> +             goto out;
>> +     }
>> +
>> +     /* Guard against races in evm_read_xattrs */
>> +     mutex_lock(&xattr_list_mutex);
>> +     list_for_each_entry(tmp, &evm_config_xattrnames, list) {
>> +             if (strcmp(xattr->name, tmp->name) == 0) {
>> +                     err = -EEXIST;
>> +                     mutex_unlock(&xattr_list_mutex);
>> +                     goto out;
>> +             }
>> +     }
>> +     list_add_tail_rcu(&xattr->list, &evm_config_xattrnames);
>> +     mutex_unlock(&xattr_list_mutex);
>> +
>> +     audit_log_format(ab, " res=0");
>> +     audit_log_end(ab);
>> +     return count;
>> +out:
>> +     audit_log_format(ab, " res=%d", err);
>> +     audit_log_end(ab);
>> +     kfree(xattr->name);
>> +     kfree(xattr);
>> +     return err;
>> +}
>



-- 
paul moore
www.paul-moore.com



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux Kernel Hardening]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux