aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/audit.c
diff options
context:
space:
mode:
authorRichard Guy Briggs <rgb@redhat.com>2013-05-03 14:03:50 -0400
committerEric Paris <eparis@redhat.com>2013-04-30 15:31:28 -0400
commit46e959ea2969cc1668d09b0dc55226946cf781f1 (patch)
tree40481f42587257039bd7b898c2aec95e1c01656f /kernel/audit.c
parentbde02ca858448cf54a4226774dd1481f3bcc455e (diff)
audit: add an option to control logging of passwords with pam_tty_audit
Most commands are entered one line at a time and processed as complete lines in non-canonical mode. Commands that interactively require a password, enter canonical mode to do this while shutting off echo. This pair of features (icanon and !echo) can be used to avoid logging passwords by audit while still logging the rest of the command. Adding a member (log_passwd) to the struct audit_tty_status passed in by pam_tty_audit allows control of canonical mode without echo per task. Signed-off-by: Richard Guy Briggs <rgb@redhat.com> Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'kernel/audit.c')
-rw-r--r--kernel/audit.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/kernel/audit.c b/kernel/audit.c
index 241aa8593fa8..998a0d4155cf 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -49,6 +49,7 @@
49#include <linux/slab.h> 49#include <linux/slab.h>
50#include <linux/err.h> 50#include <linux/err.h>
51#include <linux/kthread.h> 51#include <linux/kthread.h>
52#include <linux/kernel.h>
52 53
53#include <linux/audit.h> 54#include <linux/audit.h>
54 55
@@ -808,6 +809,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
808 809
809 spin_lock_irqsave(&tsk->sighand->siglock, flags); 810 spin_lock_irqsave(&tsk->sighand->siglock, flags);
810 s.enabled = tsk->signal->audit_tty != 0; 811 s.enabled = tsk->signal->audit_tty != 0;
812 s.log_passwd = tsk->signal->audit_tty_log_passwd;
811 spin_unlock_irqrestore(&tsk->sighand->siglock, flags); 813 spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
812 814
813 audit_send_reply(NETLINK_CB(skb).portid, seq, 815 audit_send_reply(NETLINK_CB(skb).portid, seq,
@@ -815,18 +817,20 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
815 break; 817 break;
816 } 818 }
817 case AUDIT_TTY_SET: { 819 case AUDIT_TTY_SET: {
818 struct audit_tty_status *s; 820 struct audit_tty_status s;
819 struct task_struct *tsk = current; 821 struct task_struct *tsk = current;
820 unsigned long flags; 822 unsigned long flags;
821 823
822 if (nlh->nlmsg_len < sizeof(struct audit_tty_status)) 824 memset(&s, 0, sizeof(s));
823 return -EINVAL; 825 /* guard against past and future API changes */
824 s = data; 826 memcpy(&s, data, min(sizeof(s), (size_t)nlh->nlmsg_len));
825 if (s->enabled != 0 && s->enabled != 1) 827 if ((s.enabled != 0 && s.enabled != 1) ||
828 (s.log_passwd != 0 && s.log_passwd != 1))
826 return -EINVAL; 829 return -EINVAL;
827 830
828 spin_lock_irqsave(&tsk->sighand->siglock, flags); 831 spin_lock_irqsave(&tsk->sighand->siglock, flags);
829 tsk->signal->audit_tty = s->enabled != 0; 832 tsk->signal->audit_tty = s.enabled;
833 tsk->signal->audit_tty_log_passwd = s.log_passwd;
830 spin_unlock_irqrestore(&tsk->sighand->siglock, flags); 834 spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
831 break; 835 break;
832 } 836 }