evm: add file system uuid to EVM hmac
authorDmitry Kasatkin <dmitry.kasatkin@intel.com>
Mon, 10 Sep 2012 07:37:20 +0000 (10:37 +0300)
committerMimi Zohar <zohar@linux.vnet.ibm.com>
Wed, 6 Feb 2013 15:40:28 +0000 (10:40 -0500)
EVM uses the same key for all file systems to calculate the HMAC,
making it possible to paste inodes from one file system on to another
one, without EVM being able to detect it.  To prevent such an attack,
it is necessary to make the EVM HMAC file system specific.

This patch uses the file system UUID, a file system unique identifier,
to bind the EVM HMAC to the file system. The value inode->i_sb->s_uuid
is used for the HMAC hash calculation, instead of using it for deriving
the file system specific key.  Initializing the key for every inode HMAC
calculation is a bit more expensive operation than adding the uuid to
the HMAC hash.

Changing the HMAC calculation method or adding additional info to the
calculation, requires existing EVM labeled file systems to be relabeled.
This patch adds a Kconfig HMAC version option for backwards compatability.

Changelog v1:
- squash "hmac version setting"
Changelog v0:
- add missing Kconfig depends (Mimi)

Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@intel.com>
Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
security/integrity/evm/Kconfig
security/integrity/evm/evm.h
security/integrity/evm/evm_crypto.c
security/integrity/evm/evm_main.c

index afbb59dd262d57f9ee635c3dcd6caeff6751d932..fea9749c37562b1006885cf56410361a64f31db1 100644 (file)
@@ -11,3 +11,16 @@ config EVM
          integrity attacks.
 
          If you are unsure how to answer this question, answer N.
+
+config EVM_HMAC_VERSION
+       int "EVM HMAC version"
+       depends on EVM
+       default 2
+       help
+         This options adds EVM HMAC version support.
+         1 - original version
+         2 - add per filesystem unique identifier (UUID) (default)
+
+         WARNING: changing the HMAC calculation method or adding 
+         additional info to the calculation, requires existing EVM
+         labeled file systems to be relabeled.  
index 3eb30c6db4194d870c66a1ee7ea359ffa002a355..30bd1ec0232e1ddd2a7d7585e752ae6c6bedcdc9 100644 (file)
@@ -24,6 +24,7 @@
 extern int evm_initialized;
 extern char *evm_hmac;
 extern char *evm_hash;
+extern int evm_hmac_version;
 
 extern struct crypto_shash *hmac_tfm;
 extern struct crypto_shash *hash_tfm;
index dfb26918699c5be5cffcfe4f37295914561096d4..ff8e2abf8f2114bd4fc106e0ff5d13cd771f296e 100644 (file)
@@ -110,6 +110,9 @@ static void hmac_add_misc(struct shash_desc *desc, struct inode *inode,
        hmac_misc.gid = from_kgid(&init_user_ns, inode->i_gid);
        hmac_misc.mode = inode->i_mode;
        crypto_shash_update(desc, (const u8 *)&hmac_misc, sizeof hmac_misc);
+       if (evm_hmac_version > 1)
+               crypto_shash_update(desc, inode->i_sb->s_uuid,
+                                   sizeof(inode->i_sb->s_uuid));
        crypto_shash_final(desc, digest);
 }
 
index a78a5e21ef70ea3b951db6ddc347c2268e1363b2..cdbde1762189f56ebdcd133e3cf6fdfba37b3933 100644 (file)
@@ -26,6 +26,7 @@ int evm_initialized;
 
 char *evm_hmac = "hmac(sha1)";
 char *evm_hash = "sha1";
+int evm_hmac_version = CONFIG_EVM_HMAC_VERSION;
 
 char *evm_config_xattrnames[] = {
 #ifdef CONFIG_SECURITY_SELINUX