summaryrefslogtreecommitdiffstats
path: root/security/integrity
diff options
context:
space:
mode:
authorEric Richter <erichte@linux.vnet.ibm.com>2016-06-01 14:14:02 -0400
committerMimi Zohar <zohar@linux.vnet.ibm.com>2016-06-30 01:14:20 -0400
commit725de7fabb9fe4ca388c780ad4644352f2f06ccc (patch)
treeae95889e652b85b4fa1801bd13a5a37b03f7874c /security/integrity
parent0260643ce8047d2a58f76222d09f161149622465 (diff)
ima: extend ima_get_action() to return the policy pcr
Different policy rules may extend different PCRs. This patch retrieves the specific PCR for the matched rule. Subsequent patches will include the rule specific PCR in the measurement list and extend the appropriate PCR. Signed-off-by: Eric Richter <erichte@linux.vnet.ibm.com> Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
Diffstat (limited to 'security/integrity')
-rw-r--r--security/integrity/ima/ima.h5
-rw-r--r--security/integrity/ima/ima_api.c5
-rw-r--r--security/integrity/ima/ima_appraise.c2
-rw-r--r--security/integrity/ima/ima_main.c3
-rw-r--r--security/integrity/ima/ima_policy.c6
5 files changed, 14 insertions, 7 deletions
diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
index d3a939bf2781..3c8e71e9e049 100644
--- a/security/integrity/ima/ima.h
+++ b/security/integrity/ima/ima.h
@@ -154,7 +154,8 @@ enum ima_hooks {
154}; 154};
155 155
156/* LIM API function definitions */ 156/* LIM API function definitions */
157int ima_get_action(struct inode *inode, int mask, enum ima_hooks func); 157int ima_get_action(struct inode *inode, int mask,
158 enum ima_hooks func, int *pcr);
158int ima_must_measure(struct inode *inode, int mask, enum ima_hooks func); 159int ima_must_measure(struct inode *inode, int mask, enum ima_hooks func);
159int ima_collect_measurement(struct integrity_iint_cache *iint, 160int ima_collect_measurement(struct integrity_iint_cache *iint,
160 struct file *file, void *buf, loff_t size, 161 struct file *file, void *buf, loff_t size,
@@ -174,7 +175,7 @@ const char *ima_d_path(const struct path *path, char **pathbuf);
174 175
175/* IMA policy related functions */ 176/* IMA policy related functions */
176int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, 177int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
177 int flags); 178 int flags, int *pcr);
178void ima_init_policy(void); 179void ima_init_policy(void);
179void ima_update_policy(void); 180void ima_update_policy(void);
180void ima_update_policy_flag(void); 181void ima_update_policy_flag(void);
diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c
index 5a2218fe877a..225b9cede300 100644
--- a/security/integrity/ima/ima_api.c
+++ b/security/integrity/ima/ima_api.c
@@ -157,6 +157,7 @@ err_out:
157 * @inode: pointer to inode to measure 157 * @inode: pointer to inode to measure
158 * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE) 158 * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE)
159 * @func: caller identifier 159 * @func: caller identifier
160 * @pcr: pointer filled in if matched measure policy sets pcr=
160 * 161 *
161 * The policy is defined in terms of keypairs: 162 * The policy is defined in terms of keypairs:
162 * subj=, obj=, type=, func=, mask=, fsmagic= 163 * subj=, obj=, type=, func=, mask=, fsmagic=
@@ -168,13 +169,13 @@ err_out:
168 * Returns IMA_MEASURE, IMA_APPRAISE mask. 169 * Returns IMA_MEASURE, IMA_APPRAISE mask.
169 * 170 *
170 */ 171 */
171int ima_get_action(struct inode *inode, int mask, enum ima_hooks func) 172int ima_get_action(struct inode *inode, int mask, enum ima_hooks func, int *pcr)
172{ 173{
173 int flags = IMA_MEASURE | IMA_AUDIT | IMA_APPRAISE; 174 int flags = IMA_MEASURE | IMA_AUDIT | IMA_APPRAISE;
174 175
175 flags &= ima_policy_flag; 176 flags &= ima_policy_flag;
176 177
177 return ima_match_policy(inode, func, mask, flags); 178 return ima_match_policy(inode, func, mask, flags, pcr);
178} 179}
179 180
180/* 181/*
diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c
index 1bcbc12e03d9..fe8e92360d77 100644
--- a/security/integrity/ima/ima_appraise.c
+++ b/security/integrity/ima/ima_appraise.c
@@ -41,7 +41,7 @@ int ima_must_appraise(struct inode *inode, int mask, enum ima_hooks func)
41 if (!ima_appraise) 41 if (!ima_appraise)
42 return 0; 42 return 0;
43 43
44 return ima_match_policy(inode, func, mask, IMA_APPRAISE); 44 return ima_match_policy(inode, func, mask, IMA_APPRAISE, NULL);
45} 45}
46 46
47static int ima_fix_xattr(struct dentry *dentry, 47static int ima_fix_xattr(struct dentry *dentry,
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
index 68b26c340acd..58b08b25437a 100644
--- a/security/integrity/ima/ima_main.c
+++ b/security/integrity/ima/ima_main.c
@@ -162,6 +162,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
162 char *pathbuf = NULL; 162 char *pathbuf = NULL;
163 const char *pathname = NULL; 163 const char *pathname = NULL;
164 int rc = -ENOMEM, action, must_appraise; 164 int rc = -ENOMEM, action, must_appraise;
165 int pcr = CONFIG_IMA_MEASURE_PCR_IDX;
165 struct evm_ima_xattr_data *xattr_value = NULL; 166 struct evm_ima_xattr_data *xattr_value = NULL;
166 int xattr_len = 0; 167 int xattr_len = 0;
167 bool violation_check; 168 bool violation_check;
@@ -174,7 +175,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
174 * bitmask based on the appraise/audit/measurement policy. 175 * bitmask based on the appraise/audit/measurement policy.
175 * Included is the appraise submask. 176 * Included is the appraise submask.
176 */ 177 */
177 action = ima_get_action(inode, mask, func); 178 action = ima_get_action(inode, mask, func, &pcr);
178 violation_check = ((func == FILE_CHECK || func == MMAP_CHECK) && 179 violation_check = ((func == FILE_CHECK || func == MMAP_CHECK) &&
179 (ima_policy_flag & IMA_MEASURE)); 180 (ima_policy_flag & IMA_MEASURE));
180 if (!action && !violation_check) 181 if (!action && !violation_check)
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
index 3d35fbe3be0b..aed47b777a57 100644
--- a/security/integrity/ima/ima_policy.c
+++ b/security/integrity/ima/ima_policy.c
@@ -324,6 +324,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)
324 * @inode: pointer to an inode for which the policy decision is being made 324 * @inode: pointer to an inode for which the policy decision is being made
325 * @func: IMA hook identifier 325 * @func: IMA hook identifier
326 * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) 326 * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC)
327 * @pcr: set the pcr to extend
327 * 328 *
328 * Measure decision based on func/mask/fsmagic and LSM(subj/obj/type) 329 * Measure decision based on func/mask/fsmagic and LSM(subj/obj/type)
329 * conditions. 330 * conditions.
@@ -333,7 +334,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)
333 * than writes so ima_match_policy() is classical RCU candidate. 334 * than writes so ima_match_policy() is classical RCU candidate.
334 */ 335 */
335int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, 336int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
336 int flags) 337 int flags, int *pcr)
337{ 338{
338 struct ima_rule_entry *entry; 339 struct ima_rule_entry *entry;
339 int action = 0, actmask = flags | (flags << 1); 340 int action = 0, actmask = flags | (flags << 1);
@@ -358,6 +359,9 @@ int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
358 else 359 else
359 actmask &= ~(entry->action | entry->action >> 1); 360 actmask &= ~(entry->action | entry->action >> 1);
360 361
362 if ((pcr) && (entry->flags & IMA_PCR))
363 *pcr = entry->pcr;
364
361 if (!actmask) 365 if (!actmask)
362 break; 366 break;
363 } 367 }