2 * Copyright (C) 2010 IBM Corporation
5 * Mimi Zohar <zohar@us.ibm.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, version 2 of the License.
12 * - Used to signal when key is on keyring
13 * - Get the key and enable EVM
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18 #include <linux/audit.h>
19 #include <linux/uaccess.h>
20 #include <linux/module.h>
21 #include <linux/mutex.h>
24 static struct dentry
*evm_dir
;
25 static struct dentry
*evm_init_tpm
;
26 static struct dentry
*evm_symlink
;
28 #ifdef CONFIG_EVM_ADD_XATTRS
29 static struct dentry
*evm_xattrs
;
30 static DEFINE_MUTEX(xattr_list_mutex
);
31 static int evm_xattrs_locked
;
35 * evm_read_key - read() for <securityfs>/evm
37 * @filp: file pointer, not actually used
38 * @buf: where to put the result
39 * @count: maximum to send along
40 * @ppos: where to start
42 * Returns number of bytes read or error code, as appropriate
44 static ssize_t
evm_read_key(struct file
*filp
, char __user
*buf
,
45 size_t count
, loff_t
*ppos
)
53 sprintf(temp
, "%d", (evm_initialized
& ~EVM_SETUP_COMPLETE
));
54 rc
= simple_read_from_buffer(buf
, count
, ppos
, temp
, strlen(temp
));
60 * evm_write_key - write() for <securityfs>/evm
61 * @file: file pointer, not actually used
62 * @buf: where to get the data from
64 * @ppos: where to start
66 * Used to signal that key is on the kernel key ring.
67 * - get the integrity hmac key from the kernel key ring
68 * - create list of hmac protected extended attributes
69 * Returns number of bytes written or error code, as appropriate
71 static ssize_t
evm_write_key(struct file
*file
, const char __user
*buf
,
72 size_t count
, loff_t
*ppos
)
76 if (!capable(CAP_SYS_ADMIN
) || (evm_initialized
& EVM_SETUP_COMPLETE
))
79 ret
= kstrtoint_from_user(buf
, count
, 0, &i
);
84 /* Reject invalid values */
85 if (!i
|| (i
& ~EVM_INIT_MASK
) != 0)
88 /* Don't allow a request to freshly enable metadata writes if
91 if ((i
& EVM_ALLOW_METADATA_WRITES
) &&
92 ((evm_initialized
& EVM_KEY_MASK
) != 0) &&
93 !(evm_initialized
& EVM_ALLOW_METADATA_WRITES
))
96 if (i
& EVM_INIT_HMAC
) {
100 /* Forbid further writes after the symmetric key is loaded */
101 i
|= EVM_SETUP_COMPLETE
;
104 evm_initialized
|= i
;
106 /* Don't allow protected metadata modification if a symmetric key
109 if (evm_initialized
& EVM_INIT_HMAC
)
110 evm_initialized
&= ~(EVM_ALLOW_METADATA_WRITES
);
115 static const struct file_operations evm_key_ops
= {
116 .read
= evm_read_key
,
117 .write
= evm_write_key
,
120 #ifdef CONFIG_EVM_ADD_XATTRS
122 * evm_read_xattrs - read() for <securityfs>/evm_xattrs
124 * @filp: file pointer, not actually used
125 * @buf: where to put the result
126 * @count: maximum to send along
127 * @ppos: where to start
129 * Returns number of bytes read or error code, as appropriate
131 static ssize_t
evm_read_xattrs(struct file
*filp
, char __user
*buf
,
132 size_t count
, loff_t
*ppos
)
136 ssize_t rc
, size
= 0;
137 struct xattr_list
*xattr
;
142 rc
= mutex_lock_interruptible(&xattr_list_mutex
);
146 list_for_each_entry(xattr
, &evm_config_xattrnames
, list
)
147 size
+= strlen(xattr
->name
) + 1;
149 temp
= kmalloc(size
+ 1, GFP_KERNEL
);
151 mutex_unlock(&xattr_list_mutex
);
155 list_for_each_entry(xattr
, &evm_config_xattrnames
, list
) {
156 sprintf(temp
+ offset
, "%s\n", xattr
->name
);
157 offset
+= strlen(xattr
->name
) + 1;
160 mutex_unlock(&xattr_list_mutex
);
161 rc
= simple_read_from_buffer(buf
, count
, ppos
, temp
, strlen(temp
));
169 * evm_write_xattrs - write() for <securityfs>/evm_xattrs
170 * @file: file pointer, not actually used
171 * @buf: where to get the data from
173 * @ppos: where to start
175 * Returns number of bytes written or error code, as appropriate
177 static ssize_t
evm_write_xattrs(struct file
*file
, const char __user
*buf
,
178 size_t count
, loff_t
*ppos
)
181 struct xattr_list
*xattr
, *tmp
;
182 struct audit_buffer
*ab
;
183 struct iattr newattrs
;
186 if (!capable(CAP_SYS_ADMIN
) || evm_xattrs_locked
)
192 if (count
> XATTR_NAME_MAX
)
195 ab
= audit_log_start(NULL
, GFP_KERNEL
, AUDIT_INTEGRITY_EVM_XATTR
);
199 xattr
= kmalloc(sizeof(struct xattr_list
), GFP_KERNEL
);
205 xattr
->name
= memdup_user_nul(buf
, count
);
206 if (IS_ERR(xattr
->name
)) {
207 err
= PTR_ERR(xattr
->name
);
212 /* Remove any trailing newline */
213 len
= strlen(xattr
->name
);
214 if (len
&& xattr
->name
[len
-1] == '\n')
215 xattr
->name
[len
-1] = '\0';
217 if (strcmp(xattr
->name
, ".") == 0) {
218 evm_xattrs_locked
= 1;
219 newattrs
.ia_mode
= S_IFREG
| 0440;
220 newattrs
.ia_valid
= ATTR_MODE
;
221 inode
= evm_xattrs
->d_inode
;
223 err
= simple_setattr(evm_xattrs
, &newattrs
);
225 audit_log_format(ab
, "locked");
231 audit_log_format(ab
, "xattr=");
232 audit_log_untrustedstring(ab
, xattr
->name
);
234 if (strncmp(xattr
->name
, XATTR_SECURITY_PREFIX
,
235 XATTR_SECURITY_PREFIX_LEN
) != 0) {
240 /* Guard against races in evm_read_xattrs */
241 mutex_lock(&xattr_list_mutex
);
242 list_for_each_entry(tmp
, &evm_config_xattrnames
, list
) {
243 if (strcmp(xattr
->name
, tmp
->name
) == 0) {
245 mutex_unlock(&xattr_list_mutex
);
249 list_add_tail_rcu(&xattr
->list
, &evm_config_xattrnames
);
250 mutex_unlock(&xattr_list_mutex
);
252 audit_log_format(ab
, " res=0");
256 audit_log_format(ab
, " res=%d", err
);
265 static const struct file_operations evm_xattr_ops
= {
266 .read
= evm_read_xattrs
,
267 .write
= evm_write_xattrs
,
270 static int evm_init_xattrs(void)
272 evm_xattrs
= securityfs_create_file("evm_xattrs", 0660, evm_dir
, NULL
,
274 if (!evm_xattrs
|| IS_ERR(evm_xattrs
))
280 static int evm_init_xattrs(void)
286 int __init
evm_init_secfs(void)
290 evm_dir
= securityfs_create_dir("evm", integrity_dir
);
291 if (!evm_dir
|| IS_ERR(evm_dir
))
294 evm_init_tpm
= securityfs_create_file("evm", 0660,
295 evm_dir
, NULL
, &evm_key_ops
);
296 if (!evm_init_tpm
|| IS_ERR(evm_init_tpm
)) {
301 evm_symlink
= securityfs_create_symlink("evm", NULL
,
302 "integrity/evm/evm", NULL
);
303 if (!evm_symlink
|| IS_ERR(evm_symlink
)) {
308 if (evm_init_xattrs() != 0) {
315 securityfs_remove(evm_symlink
);
316 securityfs_remove(evm_init_tpm
);
317 securityfs_remove(evm_dir
);