diff options
| -rw-r--r-- | security/integrity/ima/ima.h | 4 | ||||
| -rw-r--r-- | security/integrity/ima/ima_appraise.c | 4 | ||||
| -rw-r--r-- | security/integrity/ima/ima_main.c | 8 | ||||
| -rw-r--r-- | security/integrity/ima/ima_policy.c | 23 |
4 files changed, 34 insertions, 5 deletions
diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index d61680dcd365..8ee997dff139 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h | |||
| @@ -43,6 +43,9 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 }; | |||
| 43 | #define IMA_TEMPLATE_IMA_NAME "ima" | 43 | #define IMA_TEMPLATE_IMA_NAME "ima" |
| 44 | #define IMA_TEMPLATE_IMA_FMT "d|n" | 44 | #define IMA_TEMPLATE_IMA_FMT "d|n" |
| 45 | 45 | ||
| 46 | /* current content of the policy */ | ||
| 47 | extern int ima_policy_flag; | ||
| 48 | |||
| 46 | /* set during initialization */ | 49 | /* set during initialization */ |
| 47 | extern int ima_initialized; | 50 | extern int ima_initialized; |
| 48 | extern int ima_used_chip; | 51 | extern int ima_used_chip; |
| @@ -153,6 +156,7 @@ int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, | |||
| 153 | int flags); | 156 | int flags); |
| 154 | void ima_init_policy(void); | 157 | void ima_init_policy(void); |
| 155 | void ima_update_policy(void); | 158 | void ima_update_policy(void); |
| 159 | void ima_update_policy_flag(void); | ||
| 156 | ssize_t ima_parse_add_rule(char *); | 160 | ssize_t ima_parse_add_rule(char *); |
| 157 | void ima_delete_rules(void); | 161 | void ima_delete_rules(void); |
| 158 | 162 | ||
diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c index 2dc13fbb7e91..922685483bd3 100644 --- a/security/integrity/ima/ima_appraise.c +++ b/security/integrity/ima/ima_appraise.c | |||
| @@ -318,7 +318,7 @@ void ima_inode_post_setattr(struct dentry *dentry) | |||
| 318 | struct integrity_iint_cache *iint; | 318 | struct integrity_iint_cache *iint; |
| 319 | int must_appraise, rc; | 319 | int must_appraise, rc; |
| 320 | 320 | ||
| 321 | if (!ima_initialized || !ima_appraise || !S_ISREG(inode->i_mode) | 321 | if (!(ima_policy_flag & IMA_APPRAISE) || !S_ISREG(inode->i_mode) |
| 322 | || !inode->i_op->removexattr) | 322 | || !inode->i_op->removexattr) |
| 323 | return; | 323 | return; |
| 324 | 324 | ||
| @@ -356,7 +356,7 @@ static void ima_reset_appraise_flags(struct inode *inode, int digsig) | |||
| 356 | { | 356 | { |
| 357 | struct integrity_iint_cache *iint; | 357 | struct integrity_iint_cache *iint; |
| 358 | 358 | ||
| 359 | if (!ima_initialized || !ima_appraise || !S_ISREG(inode->i_mode)) | 359 | if (!(ima_policy_flag & IMA_APPRAISE) || !S_ISREG(inode->i_mode)) |
| 360 | return; | 360 | return; |
| 361 | 361 | ||
| 362 | iint = integrity_iint_find(inode); | 362 | iint = integrity_iint_find(inode); |
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index ed7d9fa4f536..2191b36ad1da 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c | |||
| @@ -85,7 +85,7 @@ static void ima_rdwr_violation_check(struct file *file) | |||
| 85 | char *pathbuf = NULL; | 85 | char *pathbuf = NULL; |
| 86 | const char *pathname; | 86 | const char *pathname; |
| 87 | 87 | ||
| 88 | if (!S_ISREG(inode->i_mode) || !ima_initialized) | 88 | if (!S_ISREG(inode->i_mode) || !(ima_policy_flag & IMA_MEASURE)) |
| 89 | return; | 89 | return; |
| 90 | 90 | ||
| 91 | if (mode & FMODE_WRITE) { | 91 | if (mode & FMODE_WRITE) { |
| @@ -168,7 +168,7 @@ static int process_measurement(struct file *file, int mask, int function, | |||
| 168 | struct evm_ima_xattr_data *xattr_value = NULL, **xattr_ptr = NULL; | 168 | struct evm_ima_xattr_data *xattr_value = NULL, **xattr_ptr = NULL; |
| 169 | int xattr_len = 0; | 169 | int xattr_len = 0; |
| 170 | 170 | ||
| 171 | if (!ima_initialized || !S_ISREG(inode->i_mode)) | 171 | if (!ima_policy_flag || !S_ISREG(inode->i_mode)) |
| 172 | return 0; | 172 | return 0; |
| 173 | 173 | ||
| 174 | /* Return an IMA_MEASURE, IMA_APPRAISE, IMA_AUDIT action | 174 | /* Return an IMA_MEASURE, IMA_APPRAISE, IMA_AUDIT action |
| @@ -334,8 +334,10 @@ static int __init init_ima(void) | |||
| 334 | 334 | ||
| 335 | hash_setup(CONFIG_IMA_DEFAULT_HASH); | 335 | hash_setup(CONFIG_IMA_DEFAULT_HASH); |
| 336 | error = ima_init(); | 336 | error = ima_init(); |
| 337 | if (!error) | 337 | if (!error) { |
| 338 | ima_initialized = 1; | 338 | ima_initialized = 1; |
| 339 | ima_update_policy_flag(); | ||
| 340 | } | ||
| 339 | return error; | 341 | return error; |
| 340 | } | 342 | } |
| 341 | 343 | ||
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index 07099a8bc283..cdc620b2152f 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c | |||
| @@ -35,6 +35,8 @@ | |||
| 35 | #define DONT_APPRAISE 0x0008 | 35 | #define DONT_APPRAISE 0x0008 |
| 36 | #define AUDIT 0x0040 | 36 | #define AUDIT 0x0040 |
| 37 | 37 | ||
| 38 | int ima_policy_flag; | ||
| 39 | |||
| 38 | #define MAX_LSM_RULES 6 | 40 | #define MAX_LSM_RULES 6 |
| 39 | enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE, | 41 | enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE, |
| 40 | LSM_SUBJ_USER, LSM_SUBJ_ROLE, LSM_SUBJ_TYPE | 42 | LSM_SUBJ_USER, LSM_SUBJ_ROLE, LSM_SUBJ_TYPE |
| @@ -295,6 +297,26 @@ int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, | |||
| 295 | return action; | 297 | return action; |
| 296 | } | 298 | } |
| 297 | 299 | ||
| 300 | /* | ||
| 301 | * Initialize the ima_policy_flag variable based on the currently | ||
| 302 | * loaded policy. Based on this flag, the decision to short circuit | ||
| 303 | * out of a function or not call the function in the first place | ||
| 304 | * can be made earlier. | ||
| 305 | */ | ||
| 306 | void ima_update_policy_flag(void) | ||
| 307 | { | ||
| 308 | struct ima_rule_entry *entry; | ||
| 309 | |||
| 310 | ima_policy_flag = 0; | ||
| 311 | list_for_each_entry(entry, ima_rules, list) { | ||
| 312 | if (entry->action & IMA_DO_MASK) | ||
| 313 | ima_policy_flag |= entry->action; | ||
| 314 | } | ||
| 315 | |||
| 316 | if (!ima_appraise) | ||
| 317 | ima_policy_flag &= ~IMA_APPRAISE; | ||
| 318 | } | ||
| 319 | |||
| 298 | /** | 320 | /** |
| 299 | * ima_init_policy - initialize the default measure rules. | 321 | * ima_init_policy - initialize the default measure rules. |
| 300 | * | 322 | * |
| @@ -341,6 +363,7 @@ void ima_update_policy(void) | |||
| 341 | 363 | ||
| 342 | if (ima_rules == &ima_default_rules) { | 364 | if (ima_rules == &ima_default_rules) { |
| 343 | ima_rules = &ima_policy_rules; | 365 | ima_rules = &ima_policy_rules; |
| 366 | ima_update_policy_flag(); | ||
| 344 | cause = "complete"; | 367 | cause = "complete"; |
| 345 | result = 0; | 368 | result = 0; |
| 346 | } | 369 | } |
