From: Alban Crequy <[email protected]>

This patch forces files to be re-measured, re-appraised and re-audited
on file systems with the feature flag FS_IMA_NO_CACHE. In that way,
cached integrity results won't be used.

Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: Alexander Viro <[email protected]>
Cc: Miklos Szeredi <[email protected]>
Cc: Mimi Zohar <[email protected]>
Cc: Dmitry Kasatkin <[email protected]>
Cc: James Morris <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Acked-by: "Serge E. Hallyn" <[email protected]>
Acked-by: Seth Forshee <[email protected]>
Tested-by: Dongsu Park <[email protected]>
Signed-off-by: Alban Crequy <[email protected]>
Signed-off-by: Dongsu Park <[email protected]>
---
 include/linux/fs.h                |  1 +
 security/integrity/ima/ima_main.c | 15 +++++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/linux/fs.h b/include/linux/fs.h
index 511fbaab..ced841ba 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2075,6 +2075,7 @@ struct file_system_type {
 #define FS_BINARY_MOUNTDATA    2
 #define FS_HAS_SUBTYPE         4
 #define FS_USERNS_MOUNT                8       /* Can be mounted by userns 
root */
+#define FS_IMA_NO_CACHE                16      /* Force IMA to re-measure, 
re-appraise, re-audit files */
 #define FS_RENAME_DOES_D_MOVE  32768   /* FS will handle d_move() during 
rename() internally. */
        struct dentry *(*mount) (struct file_system_type *, int,
                       const char *, void *);
diff --git a/security/integrity/ima/ima_main.c 
b/security/integrity/ima/ima_main.c
index 6d78cb26..83edbad8 100644
--- a/security/integrity/ima/ima_main.c
+++ b/security/integrity/ima/ima_main.c
@@ -24,6 +24,7 @@
 #include <linux/slab.h>
 #include <linux/xattr.h>
 #include <linux/ima.h>
+#include <linux/fs.h>
 
 #include "ima.h"
 
@@ -228,9 +229,19 @@ static int process_measurement(struct file *file, char 
*buf, loff_t size,
                                 IMA_APPRAISE_SUBMASK | IMA_APPRAISED_SUBMASK |
                                 IMA_ACTION_FLAGS);
 
-       if (test_and_clear_bit(IMA_CHANGE_XATTR, &iint->atomic_flags))
-               /* reset all flags if ima_inode_setxattr was called */
+       /*
+        * Reset the measure, appraise and audit cached flags either if:
+        * - ima_inode_setxattr was called, or
+        * - based on filesystem feature flag
+        * forcing the file to be re-evaluated.
+        */
+       if (test_and_clear_bit(IMA_CHANGE_XATTR, &iint->atomic_flags)) {
                iint->flags &= ~IMA_DONE_MASK;
+       } else if (inode->i_sb->s_type->fs_flags & FS_IMA_NO_CACHE) {
+               iint->flags &= ~IMA_DONE_MASK;
+               if (action & IMA_MEASURE)
+                       iint->measured_pcrs = 0;
+       }
 
        /* Determine if already appraised/measured based on bitmask
         * (IMA_MEASURE, IMA_MEASURED, IMA_XXXX_APPRAISE, IMA_XXXX_APPRAISED,
-- 
2.13.6

Reply via email to