aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2012-01-03 14:23:07 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2012-01-17 16:16:59 -0500
commitefaffd6e4417860c67576ac760dd6e8bbd15f006 (patch)
treea59ee886b609bbf761fb75744e5e468264c67ab5
parent6422e78de6880c66a82af512d9bd0c85eb62e661 (diff)
audit: allow matching on obj_uid
Allow syscall exit filter matching based on the uid of the owner of an inode used in a syscall. aka: auditctl -a always,exit -S open -F obj_uid=0 -F perm=wa Signed-off-by: Eric Paris <eparis@redhat.com>
-rw-r--r--include/linux/audit.h1
-rw-r--r--kernel/auditfilter.c1
-rw-r--r--kernel/auditsc.c12
3 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h
index 67b66c37a254..55cb3daaf474 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -223,6 +223,7 @@
223#define AUDIT_PERM 106 223#define AUDIT_PERM 106
224#define AUDIT_DIR 107 224#define AUDIT_DIR 107
225#define AUDIT_FILETYPE 108 225#define AUDIT_FILETYPE 108
226#define AUDIT_OBJ_UID 109
226 227
227#define AUDIT_ARG0 200 228#define AUDIT_ARG0 200
228#define AUDIT_ARG1 (AUDIT_ARG0+1) 229#define AUDIT_ARG1 (AUDIT_ARG0+1)
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
index 903caa269b5c..13e997423dcd 100644
--- a/kernel/auditfilter.c
+++ b/kernel/auditfilter.c
@@ -461,6 +461,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,
461 case AUDIT_ARG1: 461 case AUDIT_ARG1:
462 case AUDIT_ARG2: 462 case AUDIT_ARG2:
463 case AUDIT_ARG3: 463 case AUDIT_ARG3:
464 case AUDIT_OBJ_UID:
464 break; 465 break;
465 case AUDIT_ARCH: 466 case AUDIT_ARCH:
466 entry->rule.arch_f = f; 467 entry->rule.arch_f = f;
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index 4d8920f5ab88..5cf3ecc01517 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -586,6 +586,18 @@ static int audit_filter_rules(struct task_struct *tsk,
586 } 586 }
587 } 587 }
588 break; 588 break;
589 case AUDIT_OBJ_UID:
590 if (name) {
591 result = audit_comparator(name->uid, f->op, f->val);
592 } else if (ctx) {
593 list_for_each_entry(n, &ctx->names_list, list) {
594 if (audit_comparator(n->uid, f->op, f->val)) {
595 ++result;
596 break;
597 }
598 }
599 }
600 break;
589 case AUDIT_WATCH: 601 case AUDIT_WATCH:
590 if (name) 602 if (name)
591 result = audit_watch_compare(rule->watch, name->ino, name->dev); 603 result = audit_watch_compare(rule->watch, name->ino, name->dev);