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