aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--security/integrity/ima/ima_appraise.c2
-rw-r--r--security/integrity/ima/ima_main.c4
-rw-r--r--security/integrity/ima/ima_policy.c21
-rw-r--r--security/integrity/integrity.h18
4 files changed, 26 insertions, 19 deletions
diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c
index 4cdf36ad884a..0aa43bde441c 100644
--- a/security/integrity/ima/ima_appraise.c
+++ b/security/integrity/ima/ima_appraise.c
@@ -232,7 +232,7 @@ static void ima_reset_appraise_flags(struct inode *inode)
232 if (!iint) 232 if (!iint)
233 return; 233 return;
234 234
235 iint->flags &= ~(IMA_COLLECTED | IMA_APPRAISED | IMA_MEASURED); 235 iint->flags &= ~IMA_DONE_MASK;
236 return; 236 return;
237} 237}
238 238
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
index 60b047e96f4e..5da08b75d367 100644
--- a/security/integrity/ima/ima_main.c
+++ b/security/integrity/ima/ima_main.c
@@ -117,7 +117,7 @@ static void ima_check_last_writer(struct integrity_iint_cache *iint,
117 mutex_lock(&inode->i_mutex); 117 mutex_lock(&inode->i_mutex);
118 if (atomic_read(&inode->i_writecount) == 1 && 118 if (atomic_read(&inode->i_writecount) == 1 &&
119 iint->version != inode->i_version) { 119 iint->version != inode->i_version) {
120 iint->flags &= ~(IMA_COLLECTED | IMA_APPRAISED | IMA_MEASURED); 120 iint->flags &= ~IMA_DONE_MASK;
121 if (iint->flags & IMA_APPRAISE) 121 if (iint->flags & IMA_APPRAISE)
122 ima_update_xattr(iint, file); 122 ima_update_xattr(iint, file);
123 } 123 }
@@ -173,7 +173,7 @@ static int process_measurement(struct file *file, const unsigned char *filename,
173 /* Determine if already appraised/measured based on bitmask 173 /* Determine if already appraised/measured based on bitmask
174 * (IMA_MEASURE, IMA_MEASURED, IMA_APPRAISE, IMA_APPRAISED) */ 174 * (IMA_MEASURE, IMA_MEASURED, IMA_APPRAISE, IMA_APPRAISED) */
175 iint->flags |= action; 175 iint->flags |= action;
176 action &= ~((iint->flags & (IMA_MEASURED | IMA_APPRAISED)) >> 1); 176 action &= ~((iint->flags & IMA_DONE_MASK) >> 1);
177 177
178 /* Nothing to do, just return existing appraised status */ 178 /* Nothing to do, just return existing appraised status */
179 if (!action) { 179 if (!action) {
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
index 0d6d60b4ba6f..f46f685a1711 100644
--- a/security/integrity/ima/ima_policy.c
+++ b/security/integrity/ima/ima_policy.c
@@ -26,13 +26,11 @@
26#define IMA_UID 0x0008 26#define IMA_UID 0x0008
27#define IMA_FOWNER 0x0010 27#define IMA_FOWNER 0x0010
28 28
29#define UNKNOWN 0 29#define UNKNOWN 0
30#define MEASURE 1 /* same as IMA_MEASURE */ 30#define MEASURE 0x0001 /* same as IMA_MEASURE */
31#define DONT_MEASURE 2 31#define DONT_MEASURE 0x0002
32#define MEASURE_MASK 3 32#define APPRAISE 0x0004 /* same as IMA_APPRAISE */
33#define APPRAISE 4 /* same as IMA_APPRAISE */ 33#define DONT_APPRAISE 0x0008
34#define DONT_APPRAISE 8
35#define APPRAISE_MASK 12
36 34
37#define MAX_LSM_RULES 6 35#define MAX_LSM_RULES 6
38enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE, 36enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE,
@@ -209,9 +207,12 @@ int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
209 if (!ima_match_rules(entry, inode, func, mask)) 207 if (!ima_match_rules(entry, inode, func, mask))
210 continue; 208 continue;
211 209
212 action |= (entry->action & (IMA_APPRAISE | IMA_MEASURE)); 210 action |= entry->action & IMA_DO_MASK;
213 actmask &= (entry->action & APPRAISE_MASK) ? 211 if (entry->action & IMA_DO_MASK)
214 ~APPRAISE_MASK : ~MEASURE_MASK; 212 actmask &= ~(entry->action | entry->action << 1);
213 else
214 actmask &= ~(entry->action | entry->action >> 1);
215
215 if (!actmask) 216 if (!actmask)
216 break; 217 break;
217 } 218 }
diff --git a/security/integrity/integrity.h b/security/integrity/integrity.h
index 4eec1b14193e..564ba7db5f6a 100644
--- a/security/integrity/integrity.h
+++ b/security/integrity/integrity.h
@@ -15,13 +15,19 @@
15#include <linux/integrity.h> 15#include <linux/integrity.h>
16#include <crypto/sha.h> 16#include <crypto/sha.h>
17 17
18/* iint action cache flags */
19#define IMA_MEASURE 0x0001
20#define IMA_MEASURED 0x0002
21#define IMA_APPRAISE 0x0004
22#define IMA_APPRAISED 0x0008
23/*#define IMA_COLLECT 0x0010 do not use this flag */
24#define IMA_COLLECTED 0x0020
25
18/* iint cache flags */ 26/* iint cache flags */
19#define IMA_MEASURE 0x01 27#define IMA_DIGSIG 0x0100
20#define IMA_MEASURED 0x02 28
21#define IMA_APPRAISE 0x04 29#define IMA_DO_MASK (IMA_MEASURE | IMA_APPRAISE)
22#define IMA_APPRAISED 0x08 30#define IMA_DONE_MASK (IMA_MEASURED | IMA_APPRAISED | IMA_COLLECTED)
23#define IMA_COLLECTED 0x10
24#define IMA_DIGSIG 0x20
25 31
26enum evm_ima_xattr_type { 32enum evm_ima_xattr_type {
27 IMA_XATTR_DIGEST = 0x01, 33 IMA_XATTR_DIGEST = 0x01,