On 15-12-01 13:40:05, Mimi Zohar wrote:
> On Tue, 2015-12-01 at 18:51 +0200, Petko Manolov wrote:
> >
> > I'll also send you something resembling a patch about iint invalidation
> > based on
> > .ima_blacklist updates. I've got a few questions.
>
> Ok. At some point, we really to take this back online.
Here we go.
First off, this is not a real patch rather than my idea in a C form. I feel
uncertain about a few points:
0) does keyrings keep a timestamp when created or last updated? David?
1) is jiffies(_64) the best thing to use for timestamping?
sched_clock() is known to stop at suspend/sleep.
2) the code below is not optimal - it removes the node from the RB tree
and then walks it again to find the right place. Mimi, any
objections to restructure integrity_inode_get() for speed when
dealing with timestamps?
0) is crucial. If there is no such thing as "time of the last update" for
keyrings i guess we'll either have to implement it or use another mechanism to
get similar result.
---
diff --git a/security/integrity/iint.c b/security/integrity/iint.c
index 2de9c82..a1c0062 100644
--- a/security/integrity/iint.c
+++ b/security/integrity/iint.c
@@ -96,15 +96,21 @@ struct integrity_iint_cache *integrity_inode_get(struct
inode *inode)
struct integrity_iint_cache *iint, *test_iint;
iint = integrity_iint_find(inode);
- if (iint)
+ if (iint && (iint->timestamp > blacklist_timestamp)) {
return iint;
+ } else {
+ write_lock(&integrity_iint_lock);
+ rb_erase(&iint->rb_node, &integrity_iint_tree);
+ init_once(iint);
+ goto init;
+ }
iint = kmem_cache_alloc(iint_cache, GFP_NOFS);
if (!iint)
return NULL;
write_lock(&integrity_iint_lock);
-
+init:
p = &integrity_iint_tree.rb_node;
while (*p) {
parent = *p;
@@ -116,6 +122,7 @@ struct integrity_iint_cache *integrity_inode_get(struct
inode *inode)
p = &(*p)->rb_right;
}
+ iint->timestamp = jiffies_64;
iint->inode = inode;
node = &iint->rb_node;
inode->i_flags |= S_IMA;
diff --git a/security/integrity/integrity.h b/security/integrity/integrity.h
index 5efe2ec..2642bf8 100644
--- a/security/integrity/integrity.h
+++ b/security/integrity/integrity.h
@@ -105,6 +105,7 @@ struct integrity_iint_cache {
struct rb_node rb_node; /* rooted in integrity_iint_tree */
struct inode *inode; /* back pointer to inode in question */
u64 version; /* track inode changes */
+ u64 timestamp; /* compare against blacklisted keys */
unsigned long flags;
enum integrity_status ima_file_status:4;
enum integrity_status ima_mmap_status:4;
---
Petko
--
To unsubscribe from this list: send the line "unsubscribe
linux-security-module" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html