aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-09-11 02:10:16 -0400
committerEric W. Biederman <ebiederm@xmission.com>2012-09-17 21:03:31 -0400
commit02276bda4a2bf094fcde89fb5db4d9e86347ebf4 (patch)
tree7f06da4dd9757c353133b9c512334daf96cfec1e
parent34e36d8ecbd958bc15f8e63deade1227de337eb1 (diff)
audit: Use current instead of NETLINK_CREDS() in audit_filter
Get caller process uid and gid and pid values from the current task instead of the NETLINK_CB. This is simpler than passing NETLINK_CREDS from from audit_receive_msg to audit_filter_user_rules and avoid the chance of being hit by the occassional bugs in netlink uid/gid credential passing. This is a safe changes because all netlink requests are processed in the task of the sending process. Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Eric Paris <eparis@redhat.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-rw-r--r--include/linux/audit.h2
-rw-r--r--kernel/audit.c2
-rw-r--r--kernel/auditfilter.c13
3 files changed, 8 insertions, 9 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h
index 36abf2aa7e68..9c9af0e95f93 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -700,7 +700,7 @@ extern void audit_log_secctx(struct audit_buffer *ab, u32 secid);
700extern int audit_update_lsm_rules(void); 700extern int audit_update_lsm_rules(void);
701 701
702 /* Private API (for audit.c only) */ 702 /* Private API (for audit.c only) */
703extern int audit_filter_user(struct netlink_skb_parms *cb); 703extern int audit_filter_user(void);
704extern int audit_filter_type(int type); 704extern int audit_filter_type(int type);
705extern int audit_receive_filter(int type, int pid, int uid, int seq, 705extern int audit_receive_filter(int type, int pid, int uid, int seq,
706 void *data, size_t datasz, uid_t loginuid, 706 void *data, size_t datasz, uid_t loginuid,
diff --git a/kernel/audit.c b/kernel/audit.c
index 7b7268e3073b..fecb1507b485 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -744,7 +744,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
744 if (!audit_enabled && msg_type != AUDIT_USER_AVC) 744 if (!audit_enabled && msg_type != AUDIT_USER_AVC)
745 return 0; 745 return 0;
746 746
747 err = audit_filter_user(&NETLINK_CB(skb)); 747 err = audit_filter_user();
748 if (err == 1) { 748 if (err == 1) {
749 err = 0; 749 err = 0;
750 if (msg_type == AUDIT_USER_TTY) { 750 if (msg_type == AUDIT_USER_TTY) {
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
index a6c3f1abd206..b754f43bc56c 100644
--- a/kernel/auditfilter.c
+++ b/kernel/auditfilter.c
@@ -1236,8 +1236,7 @@ int audit_compare_dname_path(const char *dname, const char *path,
1236 return strncmp(p, dname, dlen); 1236 return strncmp(p, dname, dlen);
1237} 1237}
1238 1238
1239static int audit_filter_user_rules(struct netlink_skb_parms *cb, 1239static int audit_filter_user_rules(struct audit_krule *rule,
1240 struct audit_krule *rule,
1241 enum audit_state *state) 1240 enum audit_state *state)
1242{ 1241{
1243 int i; 1242 int i;
@@ -1249,13 +1248,13 @@ static int audit_filter_user_rules(struct netlink_skb_parms *cb,
1249 1248
1250 switch (f->type) { 1249 switch (f->type) {
1251 case AUDIT_PID: 1250 case AUDIT_PID:
1252 result = audit_comparator(cb->creds.pid, f->op, f->val); 1251 result = audit_comparator(task_pid_vnr(current), f->op, f->val);
1253 break; 1252 break;
1254 case AUDIT_UID: 1253 case AUDIT_UID:
1255 result = audit_comparator(cb->creds.uid, f->op, f->val); 1254 result = audit_comparator(current_uid(), f->op, f->val);
1256 break; 1255 break;
1257 case AUDIT_GID: 1256 case AUDIT_GID:
1258 result = audit_comparator(cb->creds.gid, f->op, f->val); 1257 result = audit_comparator(current_gid(), f->op, f->val);
1259 break; 1258 break;
1260 case AUDIT_LOGINUID: 1259 case AUDIT_LOGINUID:
1261 result = audit_comparator(audit_get_loginuid(current), 1260 result = audit_comparator(audit_get_loginuid(current),
@@ -1287,7 +1286,7 @@ static int audit_filter_user_rules(struct netlink_skb_parms *cb,
1287 return 1; 1286 return 1;
1288} 1287}
1289 1288
1290int audit_filter_user(struct netlink_skb_parms *cb) 1289int audit_filter_user(void)
1291{ 1290{
1292 enum audit_state state = AUDIT_DISABLED; 1291 enum audit_state state = AUDIT_DISABLED;
1293 struct audit_entry *e; 1292 struct audit_entry *e;
@@ -1295,7 +1294,7 @@ int audit_filter_user(struct netlink_skb_parms *cb)
1295 1294
1296 rcu_read_lock(); 1295 rcu_read_lock();
1297 list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_USER], list) { 1296 list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_USER], list) {
1298 if (audit_filter_user_rules(cb, &e->rule, &state)) { 1297 if (audit_filter_user_rules(&e->rule, &state)) {
1299 if (state == AUDIT_DISABLED) 1298 if (state == AUDIT_DISABLED)
1300 ret = 0; 1299 ret = 0;
1301 break; 1300 break;