2 * Copyright (C) 2011 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.
11 #include <linux/module.h>
12 #include <linux/file.h>
14 #include <linux/xattr.h>
15 #include <linux/magic.h>
16 #include <linux/ima.h>
17 #include <linux/evm.h>
21 static int __init
default_appraise_setup(char *str
)
23 if (strncmp(str
, "off", 3) == 0)
25 else if (strncmp(str
, "fix", 3) == 0)
26 ima_appraise
= IMA_APPRAISE_FIX
;
30 __setup("ima_appraise=", default_appraise_setup
);
33 * ima_must_appraise - set appraise flag
35 * Return 1 to appraise
37 int ima_must_appraise(struct inode
*inode
, int mask
, enum ima_hooks func
)
42 return ima_match_policy(inode
, func
, mask
, IMA_APPRAISE
);
45 static int ima_fix_xattr(struct dentry
*dentry
,
46 struct integrity_iint_cache
*iint
)
48 iint
->ima_xattr
.type
= IMA_XATTR_DIGEST
;
49 return __vfs_setxattr_noperm(dentry
, XATTR_NAME_IMA
,
50 (u8
*)&iint
->ima_xattr
,
51 sizeof(iint
->ima_xattr
), 0);
54 /* Return specific func appraised cached result */
55 enum integrity_status
ima_get_cache_status(struct integrity_iint_cache
*iint
,
60 return iint
->ima_mmap_status
;
62 return iint
->ima_bprm_status
;
64 return iint
->ima_module_status
;
67 return iint
->ima_file_status
;
71 static void ima_set_cache_status(struct integrity_iint_cache
*iint
,
72 int func
, enum integrity_status status
)
76 iint
->ima_mmap_status
= status
;
79 iint
->ima_bprm_status
= status
;
82 iint
->ima_module_status
= status
;
86 iint
->ima_file_status
= status
;
91 static void ima_cache_flags(struct integrity_iint_cache
*iint
, int func
)
95 iint
->flags
|= (IMA_MMAP_APPRAISED
| IMA_APPRAISED
);
98 iint
->flags
|= (IMA_BPRM_APPRAISED
| IMA_APPRAISED
);
101 iint
->flags
|= (IMA_MODULE_APPRAISED
| IMA_APPRAISED
);
105 iint
->flags
|= (IMA_FILE_APPRAISED
| IMA_APPRAISED
);
111 * ima_appraise_measurement - appraise file measurement
113 * Call evm_verifyxattr() to verify the integrity of 'security.ima'.
114 * Assuming success, compare the xattr hash with the collected measurement.
116 * Return 0 on success, error code otherwise
118 int ima_appraise_measurement(int func
, struct integrity_iint_cache
*iint
,
119 struct file
*file
, const unsigned char *filename
)
121 struct dentry
*dentry
= file
->f_dentry
;
122 struct inode
*inode
= dentry
->d_inode
;
123 struct evm_ima_xattr_data
*xattr_value
= NULL
;
124 enum integrity_status status
= INTEGRITY_UNKNOWN
;
125 const char *op
= "appraise_data";
126 char *cause
= "unknown";
131 if (!inode
->i_op
->getxattr
)
132 return INTEGRITY_UNKNOWN
;
134 rc
= vfs_getxattr_alloc(dentry
, XATTR_NAME_IMA
, (char **)&xattr_value
,
137 if (rc
&& rc
!= -ENODATA
)
140 cause
= "missing-hash";
142 (inode
->i_size
== 0) ? INTEGRITY_PASS
: INTEGRITY_NOLABEL
;
146 status
= evm_verifyxattr(dentry
, XATTR_NAME_IMA
, xattr_value
, rc
, iint
);
147 if ((status
!= INTEGRITY_PASS
) && (status
!= INTEGRITY_UNKNOWN
)) {
148 if ((status
== INTEGRITY_NOLABEL
)
149 || (status
== INTEGRITY_NOXATTRS
))
150 cause
= "missing-HMAC";
151 else if (status
== INTEGRITY_FAIL
)
152 cause
= "invalid-HMAC";
155 switch (xattr_value
->type
) {
156 case IMA_XATTR_DIGEST
:
157 if (iint
->flags
& IMA_DIGSIG_REQUIRED
) {
158 cause
= "IMA signature required";
159 status
= INTEGRITY_FAIL
;
162 rc
= memcmp(xattr_value
->digest
, iint
->ima_xattr
.digest
,
165 cause
= "invalid-hash";
166 status
= INTEGRITY_FAIL
;
169 status
= INTEGRITY_PASS
;
171 case EVM_IMA_XATTR_DIGSIG
:
172 iint
->flags
|= IMA_DIGSIG
;
173 rc
= integrity_digsig_verify(INTEGRITY_KEYRING_IMA
,
174 xattr_value
->digest
, rc
- 1,
175 iint
->ima_xattr
.digest
,
177 if (rc
== -EOPNOTSUPP
) {
178 status
= INTEGRITY_UNKNOWN
;
180 cause
= "invalid-signature";
181 status
= INTEGRITY_FAIL
;
183 status
= INTEGRITY_PASS
;
187 status
= INTEGRITY_UNKNOWN
;
188 cause
= "unknown-ima-data";
193 if (status
!= INTEGRITY_PASS
) {
194 if ((ima_appraise
& IMA_APPRAISE_FIX
) &&
196 xattr_value
->type
!= EVM_IMA_XATTR_DIGSIG
)) {
197 if (!ima_fix_xattr(dentry
, iint
))
198 status
= INTEGRITY_PASS
;
200 integrity_audit_msg(AUDIT_INTEGRITY_DATA
, inode
, filename
,
203 ima_cache_flags(iint
, func
);
205 ima_set_cache_status(iint
, func
, status
);
211 * ima_update_xattr - update 'security.ima' hash value
213 void ima_update_xattr(struct integrity_iint_cache
*iint
, struct file
*file
)
215 struct dentry
*dentry
= file
->f_dentry
;
218 /* do not collect and update hash for digital signatures */
219 if (iint
->flags
& IMA_DIGSIG
)
222 rc
= ima_collect_measurement(iint
, file
);
226 ima_fix_xattr(dentry
, iint
);
230 * ima_inode_post_setattr - reflect file metadata changes
231 * @dentry: pointer to the affected dentry
233 * Changes to a dentry's metadata might result in needing to appraise.
235 * This function is called from notify_change(), which expects the caller
236 * to lock the inode's i_mutex.
238 void ima_inode_post_setattr(struct dentry
*dentry
)
240 struct inode
*inode
= dentry
->d_inode
;
241 struct integrity_iint_cache
*iint
;
242 int must_appraise
, rc
;
244 if (!ima_initialized
|| !ima_appraise
|| !S_ISREG(inode
->i_mode
)
245 || !inode
->i_op
->removexattr
)
248 must_appraise
= ima_must_appraise(inode
, MAY_ACCESS
, POST_SETATTR
);
249 iint
= integrity_iint_find(inode
);
251 iint
->flags
&= ~(IMA_APPRAISE
| IMA_APPRAISED
|
252 IMA_APPRAISE_SUBMASK
| IMA_APPRAISED_SUBMASK
|
255 iint
->flags
|= IMA_APPRAISE
;
258 rc
= inode
->i_op
->removexattr(dentry
, XATTR_NAME_IMA
);
263 * ima_protect_xattr - protect 'security.ima'
265 * Ensure that not just anyone can modify or remove 'security.ima'.
267 static int ima_protect_xattr(struct dentry
*dentry
, const char *xattr_name
,
268 const void *xattr_value
, size_t xattr_value_len
)
270 if (strcmp(xattr_name
, XATTR_NAME_IMA
) == 0) {
271 if (!capable(CAP_SYS_ADMIN
))
278 static void ima_reset_appraise_flags(struct inode
*inode
)
280 struct integrity_iint_cache
*iint
;
282 if (!ima_initialized
|| !ima_appraise
|| !S_ISREG(inode
->i_mode
))
285 iint
= integrity_iint_find(inode
);
289 iint
->flags
&= ~IMA_DONE_MASK
;
293 int ima_inode_setxattr(struct dentry
*dentry
, const char *xattr_name
,
294 const void *xattr_value
, size_t xattr_value_len
)
298 result
= ima_protect_xattr(dentry
, xattr_name
, xattr_value
,
301 ima_reset_appraise_flags(dentry
->d_inode
);
307 int ima_inode_removexattr(struct dentry
*dentry
, const char *xattr_name
)
311 result
= ima_protect_xattr(dentry
, xattr_name
, NULL
, 0);
313 ima_reset_appraise_flags(dentry
->d_inode
);