1 /* 2 * Copyright (C) 2005-2010 IBM Corporation 3 * 4 * Author: 5 * Mimi Zohar <zohar@us.ibm.com> 6 * Kylene Hall <kjhall@us.ibm.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation, version 2 of the License. 11 * 12 * File: evm_main.c 13 * implements evm_inode_setxattr, evm_inode_post_setxattr, 14 * evm_inode_removexattr, and evm_verifyxattr 15 */ 16 17 #include <linux/module.h> 18 #include <linux/crypto.h> 19 #include <linux/xattr.h> 20 #include <linux/integrity.h> 21 #include <linux/evm.h> 22 #include <crypto/hash.h> 23 #include "evm.h" 24 25 int evm_initialized; 26 27 char *evm_hmac = "hmac(sha1)"; 28 char *evm_hash = "sha1"; 29 30 char *evm_config_xattrnames[] = { 31 #ifdef CONFIG_SECURITY_SELINUX 32 XATTR_NAME_SELINUX, 33 #endif 34 #ifdef CONFIG_SECURITY_SMACK 35 XATTR_NAME_SMACK, 36 #endif 37 XATTR_NAME_CAPS, 38 NULL 39 }; 40 41 static int evm_fixmode; 42 static int __init evm_set_fixmode(char *str) 43 { 44 if (strncmp(str, "fix", 3) == 0) 45 evm_fixmode = 1; 46 return 0; 47 } 48 __setup("evm=", evm_set_fixmode); 49 50 static int evm_find_protected_xattrs(struct dentry *dentry) 51 { 52 struct inode *inode = dentry->d_inode; 53 char **xattr; 54 int error; 55 int count = 0; 56 57 if (!inode->i_op || !inode->i_op->getxattr) 58 return -EOPNOTSUPP; 59 60 for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) { 61 error = inode->i_op->getxattr(dentry, *xattr, NULL, 0); 62 if (error < 0) { 63 if (error == -ENODATA) 64 continue; 65 return error; 66 } 67 count++; 68 } 69 70 return count; 71 } 72 73 /* 74 * evm_verify_hmac - calculate and compare the HMAC with the EVM xattr 75 * 76 * Compute the HMAC on the dentry's protected set of extended attributes 77 * and compare it against the stored security.evm xattr. 78 * 79 * For performance: 80 * - use the previoulsy retrieved xattr value and length to calculate the 81 * HMAC.) 82 * - cache the verification result in the iint, when available. 83 * 84 * Returns integrity status 85 */ 86 static enum integrity_status evm_verify_hmac(struct dentry *dentry, 87 const char *xattr_name, 88 char *xattr_value, 89 size_t xattr_value_len, 90 struct integrity_iint_cache *iint) 91 { 92 struct evm_ima_xattr_data *xattr_data = NULL; 93 struct evm_ima_xattr_data calc; 94 enum integrity_status evm_status = INTEGRITY_PASS; 95 int rc, xattr_len; 96 97 if (iint && iint->evm_status == INTEGRITY_PASS) 98 return iint->evm_status; 99 100 /* if status is not PASS, try to check again - against -ENOMEM */ 101 102 /* first need to know the sig type */ 103 rc = vfs_getxattr_alloc(dentry, XATTR_NAME_EVM, (char **)&xattr_data, 0, 104 GFP_NOFS); 105 if (rc <= 0) { 106 if (rc == 0) 107 evm_status = INTEGRITY_FAIL; /* empty */ 108 else if (rc == -ENODATA) { 109 rc = evm_find_protected_xattrs(dentry); 110 if (rc > 0) 111 evm_status = INTEGRITY_NOLABEL; 112 else if (rc == 0) 113 evm_status = INTEGRITY_NOXATTRS; /* new file */ 114 } 115 goto out; 116 } 117 118 xattr_len = rc - 1; 119 120 /* check value type */ 121 switch (xattr_data->type) { 122 case EVM_XATTR_HMAC: 123 rc = evm_calc_hmac(dentry, xattr_name, xattr_value, 124 xattr_value_len, calc.digest); 125 if (rc) 126 break; 127 rc = memcmp(xattr_data->digest, calc.digest, 128 sizeof(calc.digest)); 129 if (rc) 130 rc = -EINVAL; 131 break; 132 case EVM_IMA_XATTR_DIGSIG: 133 rc = evm_calc_hash(dentry, xattr_name, xattr_value, 134 xattr_value_len, calc.digest); 135 if (rc) 136 break; 137 rc = integrity_digsig_verify(INTEGRITY_KEYRING_EVM, 138 xattr_data->digest, xattr_len, 139 calc.digest, sizeof(calc.digest)); 140 if (!rc) { 141 /* we probably want to replace rsa with hmac here */ 142 evm_update_evmxattr(dentry, xattr_name, xattr_value, 143 xattr_value_len); 144 } 145 break; 146 default: 147 rc = -EINVAL; 148 break; 149 } 150 151 if (rc) 152 evm_status = (rc == -ENODATA) ? 153 INTEGRITY_NOXATTRS : INTEGRITY_FAIL; 154 out: 155 if (iint) 156 iint->evm_status = evm_status; 157 kfree(xattr_data); 158 return evm_status; 159 } 160 161 static int evm_protected_xattr(const char *req_xattr_name) 162 { 163 char **xattrname; 164 int namelen; 165 int found = 0; 166 167 namelen = strlen(req_xattr_name); 168 for (xattrname = evm_config_xattrnames; *xattrname != NULL; xattrname++) { 169 if ((strlen(*xattrname) == namelen) 170 && (strncmp(req_xattr_name, *xattrname, namelen) == 0)) { 171 found = 1; 172 break; 173 } 174 if (strncmp(req_xattr_name, 175 *xattrname + XATTR_SECURITY_PREFIX_LEN, 176 strlen(req_xattr_name)) == 0) { 177 found = 1; 178 break; 179 } 180 } 181 return found; 182 } 183 184 /** 185 * evm_verifyxattr - verify the integrity of the requested xattr 186 * @dentry: object of the verify xattr 187 * @xattr_name: requested xattr 188 * @xattr_value: requested xattr value 189 * @xattr_value_len: requested xattr value length 190 * 191 * Calculate the HMAC for the given dentry and verify it against the stored 192 * security.evm xattr. For performance, use the xattr value and length 193 * previously retrieved to calculate the HMAC. 194 * 195 * Returns the xattr integrity status. 196 * 197 * This function requires the caller to lock the inode's i_mutex before it 198 * is executed. 199 */ 200 enum integrity_status evm_verifyxattr(struct dentry *dentry, 201 const char *xattr_name, 202 void *xattr_value, size_t xattr_value_len, 203 struct integrity_iint_cache *iint) 204 { 205 if (!evm_initialized || !evm_protected_xattr(xattr_name)) 206 return INTEGRITY_UNKNOWN; 207 208 if (!iint) { 209 iint = integrity_iint_find(dentry->d_inode); 210 if (!iint) 211 return INTEGRITY_UNKNOWN; 212 } 213 return evm_verify_hmac(dentry, xattr_name, xattr_value, 214 xattr_value_len, iint); 215 } 216 EXPORT_SYMBOL_GPL(evm_verifyxattr); 217 218 /* 219 * evm_verify_current_integrity - verify the dentry's metadata integrity 220 * @dentry: pointer to the affected dentry 221 * 222 * Verify and return the dentry's metadata integrity. The exceptions are 223 * before EVM is initialized or in 'fix' mode. 224 */ 225 static enum integrity_status evm_verify_current_integrity(struct dentry *dentry) 226 { 227 struct inode *inode = dentry->d_inode; 228 229 if (!evm_initialized || !S_ISREG(inode->i_mode) || evm_fixmode) 230 return 0; 231 return evm_verify_hmac(dentry, NULL, NULL, 0, NULL); 232 } 233 234 /* 235 * evm_protect_xattr - protect the EVM extended attribute 236 * 237 * Prevent security.evm from being modified or removed without the 238 * necessary permissions or when the existing value is invalid. 239 * 240 * The posix xattr acls are 'system' prefixed, which normally would not 241 * affect security.evm. An interesting side affect of writing posix xattr 242 * acls is their modifying of the i_mode, which is included in security.evm. 243 * For posix xattr acls only, permit security.evm, even if it currently 244 * doesn't exist, to be updated. 245 */ 246 static int evm_protect_xattr(struct dentry *dentry, const char *xattr_name, 247 const void *xattr_value, size_t xattr_value_len) 248 { 249 enum integrity_status evm_status; 250 251 if (strcmp(xattr_name, XATTR_NAME_EVM) == 0) { 252 if (!capable(CAP_SYS_ADMIN)) 253 return -EPERM; 254 } else if (!evm_protected_xattr(xattr_name)) { 255 if (!posix_xattr_acl(xattr_name)) 256 return 0; 257 evm_status = evm_verify_current_integrity(dentry); 258 if ((evm_status == INTEGRITY_PASS) || 259 (evm_status == INTEGRITY_NOXATTRS)) 260 return 0; 261 return -EPERM; 262 } 263 evm_status = evm_verify_current_integrity(dentry); 264 return evm_status == INTEGRITY_PASS ? 0 : -EPERM; 265 } 266 267 /** 268 * evm_inode_setxattr - protect the EVM extended attribute 269 * @dentry: pointer to the affected dentry 270 * @xattr_name: pointer to the affected extended attribute name 271 * @xattr_value: pointer to the new extended attribute value 272 * @xattr_value_len: pointer to the new extended attribute value length 273 * 274 * Updating 'security.evm' requires CAP_SYS_ADMIN privileges and that 275 * the current value is valid. 276 */ 277 int evm_inode_setxattr(struct dentry *dentry, const char *xattr_name, 278 const void *xattr_value, size_t xattr_value_len) 279 { 280 return evm_protect_xattr(dentry, xattr_name, xattr_value, 281 xattr_value_len); 282 } 283 284 /** 285 * evm_inode_removexattr - protect the EVM extended attribute 286 * @dentry: pointer to the affected dentry 287 * @xattr_name: pointer to the affected extended attribute name 288 * 289 * Removing 'security.evm' requires CAP_SYS_ADMIN privileges and that 290 * the current value is valid. 291 */ 292 int evm_inode_removexattr(struct dentry *dentry, const char *xattr_name) 293 { 294 return evm_protect_xattr(dentry, xattr_name, NULL, 0); 295 } 296 297 /** 298 * evm_inode_post_setxattr - update 'security.evm' to reflect the changes 299 * @dentry: pointer to the affected dentry 300 * @xattr_name: pointer to the affected extended attribute name 301 * @xattr_value: pointer to the new extended attribute value 302 * @xattr_value_len: pointer to the new extended attribute value length 303 * 304 * Update the HMAC stored in 'security.evm' to reflect the change. 305 * 306 * No need to take the i_mutex lock here, as this function is called from 307 * __vfs_setxattr_noperm(). The caller of which has taken the inode's 308 * i_mutex lock. 309 */ 310 void evm_inode_post_setxattr(struct dentry *dentry, const char *xattr_name, 311 const void *xattr_value, size_t xattr_value_len) 312 { 313 if (!evm_initialized || (!evm_protected_xattr(xattr_name) 314 && !posix_xattr_acl(xattr_name))) 315 return; 316 317 evm_update_evmxattr(dentry, xattr_name, xattr_value, xattr_value_len); 318 return; 319 } 320 321 /** 322 * evm_inode_post_removexattr - update 'security.evm' after removing the xattr 323 * @dentry: pointer to the affected dentry 324 * @xattr_name: pointer to the affected extended attribute name 325 * 326 * Update the HMAC stored in 'security.evm' to reflect removal of the xattr. 327 */ 328 void evm_inode_post_removexattr(struct dentry *dentry, const char *xattr_name) 329 { 330 struct inode *inode = dentry->d_inode; 331 332 if (!evm_initialized || !evm_protected_xattr(xattr_name)) 333 return; 334 335 mutex_lock(&inode->i_mutex); 336 evm_update_evmxattr(dentry, xattr_name, NULL, 0); 337 mutex_unlock(&inode->i_mutex); 338 return; 339 } 340 341 /** 342 * evm_inode_setattr - prevent updating an invalid EVM extended attribute 343 * @dentry: pointer to the affected dentry 344 */ 345 int evm_inode_setattr(struct dentry *dentry, struct iattr *attr) 346 { 347 unsigned int ia_valid = attr->ia_valid; 348 enum integrity_status evm_status; 349 350 if (!(ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))) 351 return 0; 352 evm_status = evm_verify_current_integrity(dentry); 353 if ((evm_status == INTEGRITY_PASS) || 354 (evm_status == INTEGRITY_NOXATTRS)) 355 return 0; 356 return -EPERM; 357 } 358 359 /** 360 * evm_inode_post_setattr - update 'security.evm' after modifying metadata 361 * @dentry: pointer to the affected dentry 362 * @ia_valid: for the UID and GID status 363 * 364 * For now, update the HMAC stored in 'security.evm' to reflect UID/GID 365 * changes. 366 * 367 * This function is called from notify_change(), which expects the caller 368 * to lock the inode's i_mutex. 369 */ 370 void evm_inode_post_setattr(struct dentry *dentry, int ia_valid) 371 { 372 if (!evm_initialized) 373 return; 374 375 if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) 376 evm_update_evmxattr(dentry, NULL, NULL, 0); 377 return; 378 } 379 380 /* 381 * evm_inode_init_security - initializes security.evm 382 */ 383 int evm_inode_init_security(struct inode *inode, 384 const struct xattr *lsm_xattr, 385 struct xattr *evm_xattr) 386 { 387 struct evm_ima_xattr_data *xattr_data; 388 int rc; 389 390 if (!evm_initialized || !evm_protected_xattr(lsm_xattr->name)) 391 return 0; 392 393 xattr_data = kzalloc(sizeof(*xattr_data), GFP_NOFS); 394 if (!xattr_data) 395 return -ENOMEM; 396 397 xattr_data->type = EVM_XATTR_HMAC; 398 rc = evm_init_hmac(inode, lsm_xattr, xattr_data->digest); 399 if (rc < 0) 400 goto out; 401 402 evm_xattr->value = xattr_data; 403 evm_xattr->value_len = sizeof(*xattr_data); 404 evm_xattr->name = kstrdup(XATTR_EVM_SUFFIX, GFP_NOFS); 405 return 0; 406 out: 407 kfree(xattr_data); 408 return rc; 409 } 410 EXPORT_SYMBOL_GPL(evm_inode_init_security); 411 412 static int __init init_evm(void) 413 { 414 int error; 415 416 error = evm_init_secfs(); 417 if (error < 0) { 418 printk(KERN_INFO "EVM: Error registering secfs\n"); 419 goto err; 420 } 421 422 return 0; 423 err: 424 return error; 425 } 426 427 static void __exit cleanup_evm(void) 428 { 429 evm_cleanup_secfs(); 430 if (hmac_tfm) 431 crypto_free_shash(hmac_tfm); 432 if (hash_tfm) 433 crypto_free_shash(hash_tfm); 434 } 435 436 /* 437 * evm_display_config - list the EVM protected security extended attributes 438 */ 439 static int __init evm_display_config(void) 440 { 441 char **xattrname; 442 443 for (xattrname = evm_config_xattrnames; *xattrname != NULL; xattrname++) 444 printk(KERN_INFO "EVM: %s\n", *xattrname); 445 return 0; 446 } 447 448 pure_initcall(evm_display_config); 449 late_initcall(init_evm); 450 451 MODULE_DESCRIPTION("Extended Verification Module"); 452 MODULE_LICENSE("GPL"); 453