aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2007-10-07 03:24:36 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-07 19:28:43 -0400
commit291041e935e6d0513f2b7e4a300aa9f02ec1d925 (patch)
tree626b06b52d5ce0a41c7bf21ce4314e2a9fbe79ff
parent7a5c5d5735e785a700a377a5fce913b8ad45a58f (diff)
fix bogus reporting of signals by audit
Async signals should not be reported as sent by current in audit log. As it is, we call audit_signal_info() too early in check_kill_permission(). Note that check_kill_permission() has that test already - it needs to know if it should apply current-based permission checks. So the solution is to move the call of audit_signal_info() between those. Bogosity in question is easily reproduced - add a rule watching for e.g. kill(2) from specific process (so that audit_signal_info() would not short-circuit to nothing), say load_policy, watch the bogus OBJ_PID entry in audit logs claiming that write(2) on selinuxfs file issued by load_policy(8) had somehow managed to send a signal to syslogd... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Acked-by: Steve Grubb <sgrubb@redhat.com> Acked-by: Eric Paris <eparis@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--kernel/signal.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 9fb91a32edd..79295238109 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -531,18 +531,18 @@ static int check_kill_permission(int sig, struct siginfo *info,
531 if (!valid_signal(sig)) 531 if (!valid_signal(sig))
532 return error; 532 return error;
533 533
534 error = audit_signal_info(sig, t); /* Let audit system see the signal */ 534 if (info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info))) {
535 if (error) 535 error = audit_signal_info(sig, t); /* Let audit system see the signal */
536 return error; 536 if (error)
537 537 return error;
538 error = -EPERM; 538 error = -EPERM;
539 if ((info == SEND_SIG_NOINFO || (!is_si_special(info) && SI_FROMUSER(info))) 539 if (((sig != SIGCONT) ||
540 && ((sig != SIGCONT) || 540 (process_session(current) != process_session(t)))
541 (process_session(current) != process_session(t))) 541 && (current->euid ^ t->suid) && (current->euid ^ t->uid)
542 && (current->euid ^ t->suid) && (current->euid ^ t->uid) 542 && (current->uid ^ t->suid) && (current->uid ^ t->uid)
543 && (current->uid ^ t->suid) && (current->uid ^ t->uid) 543 && !capable(CAP_KILL))
544 && !capable(CAP_KILL))
545 return error; 544 return error;
545 }
546 546
547 return security_task_kill(t, info, sig, 0); 547 return security_task_kill(t, info, sig, 0);
548} 548}