Commit 725de7fa authored by Eric Richter's avatar Eric Richter Committed by Mimi Zohar

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: default avatarEric Richter <erichte@linux.vnet.ibm.com>
Signed-off-by: default avatarMimi Zohar <zohar@linux.vnet.ibm.com>
parent 0260643c
...@@ -154,7 +154,8 @@ enum ima_hooks { ...@@ -154,7 +154,8 @@ enum ima_hooks {
}; };
/* LIM API function definitions */ /* LIM API function definitions */
int ima_get_action(struct inode *inode, int mask, enum ima_hooks func); int ima_get_action(struct inode *inode, int mask,
enum ima_hooks func, int *pcr);
int ima_must_measure(struct inode *inode, int mask, enum ima_hooks func); int ima_must_measure(struct inode *inode, int mask, enum ima_hooks func);
int ima_collect_measurement(struct integrity_iint_cache *iint, int ima_collect_measurement(struct integrity_iint_cache *iint,
struct file *file, void *buf, loff_t size, struct file *file, void *buf, loff_t size,
...@@ -174,7 +175,7 @@ const char *ima_d_path(const struct path *path, char **pathbuf); ...@@ -174,7 +175,7 @@ const char *ima_d_path(const struct path *path, char **pathbuf);
/* IMA policy related functions */ /* IMA policy related functions */
int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
int flags); int flags, int *pcr);
void ima_init_policy(void); void ima_init_policy(void);
void ima_update_policy(void); void ima_update_policy(void);
void ima_update_policy_flag(void); void ima_update_policy_flag(void);
......
...@@ -157,6 +157,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename, ...@@ -157,6 +157,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename,
* @inode: pointer to inode to measure * @inode: pointer to inode to measure
* @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE) * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE)
* @func: caller identifier * @func: caller identifier
* @pcr: pointer filled in if matched measure policy sets pcr=
* *
* The policy is defined in terms of keypairs: * The policy is defined in terms of keypairs:
* subj=, obj=, type=, func=, mask=, fsmagic= * subj=, obj=, type=, func=, mask=, fsmagic=
...@@ -168,13 +169,13 @@ void ima_add_violation(struct file *file, const unsigned char *filename, ...@@ -168,13 +169,13 @@ void ima_add_violation(struct file *file, const unsigned char *filename,
* Returns IMA_MEASURE, IMA_APPRAISE mask. * Returns IMA_MEASURE, IMA_APPRAISE mask.
* *
*/ */
int ima_get_action(struct inode *inode, int mask, enum ima_hooks func) int ima_get_action(struct inode *inode, int mask, enum ima_hooks func, int *pcr)
{ {
int flags = IMA_MEASURE | IMA_AUDIT | IMA_APPRAISE; int flags = IMA_MEASURE | IMA_AUDIT | IMA_APPRAISE;
flags &= ima_policy_flag; flags &= ima_policy_flag;
return ima_match_policy(inode, func, mask, flags); return ima_match_policy(inode, func, mask, flags, pcr);
} }
/* /*
......
...@@ -41,7 +41,7 @@ int ima_must_appraise(struct inode *inode, int mask, enum ima_hooks func) ...@@ -41,7 +41,7 @@ int ima_must_appraise(struct inode *inode, int mask, enum ima_hooks func)
if (!ima_appraise) if (!ima_appraise)
return 0; return 0;
return ima_match_policy(inode, func, mask, IMA_APPRAISE); return ima_match_policy(inode, func, mask, IMA_APPRAISE, NULL);
} }
static int ima_fix_xattr(struct dentry *dentry, static int ima_fix_xattr(struct dentry *dentry,
......
...@@ -162,6 +162,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size, ...@@ -162,6 +162,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
char *pathbuf = NULL; char *pathbuf = NULL;
const char *pathname = NULL; const char *pathname = NULL;
int rc = -ENOMEM, action, must_appraise; int rc = -ENOMEM, action, must_appraise;
int pcr = CONFIG_IMA_MEASURE_PCR_IDX;
struct evm_ima_xattr_data *xattr_value = NULL; struct evm_ima_xattr_data *xattr_value = NULL;
int xattr_len = 0; int xattr_len = 0;
bool violation_check; bool violation_check;
...@@ -174,7 +175,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size, ...@@ -174,7 +175,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
* bitmask based on the appraise/audit/measurement policy. * bitmask based on the appraise/audit/measurement policy.
* Included is the appraise submask. * Included is the appraise submask.
*/ */
action = ima_get_action(inode, mask, func); action = ima_get_action(inode, mask, func, &pcr);
violation_check = ((func == FILE_CHECK || func == MMAP_CHECK) && violation_check = ((func == FILE_CHECK || func == MMAP_CHECK) &&
(ima_policy_flag & IMA_MEASURE)); (ima_policy_flag & IMA_MEASURE));
if (!action && !violation_check) if (!action && !violation_check)
......
...@@ -324,6 +324,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func) ...@@ -324,6 +324,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)
* @inode: pointer to an inode for which the policy decision is being made * @inode: pointer to an inode for which the policy decision is being made
* @func: IMA hook identifier * @func: IMA hook identifier
* @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC)
* @pcr: set the pcr to extend
* *
* Measure decision based on func/mask/fsmagic and LSM(subj/obj/type) * Measure decision based on func/mask/fsmagic and LSM(subj/obj/type)
* conditions. * conditions.
...@@ -333,7 +334,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func) ...@@ -333,7 +334,7 @@ static int get_subaction(struct ima_rule_entry *rule, enum ima_hooks func)
* than writes so ima_match_policy() is classical RCU candidate. * than writes so ima_match_policy() is classical RCU candidate.
*/ */
int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask, int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
int flags) int flags, int *pcr)
{ {
struct ima_rule_entry *entry; struct ima_rule_entry *entry;
int action = 0, actmask = flags | (flags << 1); 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,6 +359,9 @@ int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask,
else else
actmask &= ~(entry->action | entry->action >> 1); actmask &= ~(entry->action | entry->action >> 1);
if ((pcr) && (entry->flags & IMA_PCR))
*pcr = entry->pcr;
if (!actmask) if (!actmask)
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment