Commit db0a6fb5 authored by Richard Guy Briggs's avatar Richard Guy Briggs Committed by Paul Moore

audit: add tty field to LOGIN event

The tty field was missing from AUDIT_LOGIN events.

Refactor code to create a new function audit_get_tty(), using it to
replace the call in audit_log_task_info() and to add it to
audit_log_set_loginuid().  Lock and bump the kref to protect it, adding
audit_put_tty() alias to decrement it.
Signed-off-by: default avatarRichard Guy Briggs <rgb@redhat.com>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 7ffb8e31
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <uapi/linux/audit.h> #include <uapi/linux/audit.h>
#include <linux/tty.h>
#define AUDIT_INO_UNSET ((unsigned long)-1) #define AUDIT_INO_UNSET ((unsigned long)-1)
#define AUDIT_DEV_UNSET ((dev_t)-1) #define AUDIT_DEV_UNSET ((dev_t)-1)
...@@ -343,6 +344,23 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk) ...@@ -343,6 +344,23 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
return tsk->sessionid; return tsk->sessionid;
} }
static inline struct tty_struct *audit_get_tty(struct task_struct *tsk)
{
struct tty_struct *tty = NULL;
unsigned long flags;
spin_lock_irqsave(&tsk->sighand->siglock, flags);
if (tsk->signal)
tty = tty_kref_get(tsk->signal->tty);
spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
return tty;
}
static inline void audit_put_tty(struct tty_struct *tty)
{
tty_kref_put(tty);
}
extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp); extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp);
extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode); extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode);
extern void __audit_bprm(struct linux_binprm *bprm); extern void __audit_bprm(struct linux_binprm *bprm);
...@@ -500,6 +518,12 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk) ...@@ -500,6 +518,12 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
{ {
return -1; return -1;
} }
static inline struct tty_struct *audit_get_tty(struct task_struct *tsk)
{
return NULL;
}
static inline void audit_put_tty(struct tty_struct *tty)
{ }
static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp) static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
{ } { }
static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid,
......
...@@ -64,7 +64,6 @@ ...@@ -64,7 +64,6 @@
#include <linux/security.h> #include <linux/security.h>
#endif #endif
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/tty.h>
#include <linux/pid_namespace.h> #include <linux/pid_namespace.h>
#include <net/netns/generic.h> #include <net/netns/generic.h>
...@@ -1871,21 +1870,14 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk) ...@@ -1871,21 +1870,14 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
{ {
const struct cred *cred; const struct cred *cred;
char comm[sizeof(tsk->comm)]; char comm[sizeof(tsk->comm)];
char *tty; struct tty_struct *tty;
if (!ab) if (!ab)
return; return;
/* tsk == current */ /* tsk == current */
cred = current_cred(); cred = current_cred();
tty = audit_get_tty(tsk);
spin_lock_irq(&tsk->sighand->siglock);
if (tsk->signal && tsk->signal->tty && tsk->signal->tty->name)
tty = tsk->signal->tty->name;
else
tty = "(none)";
spin_unlock_irq(&tsk->sighand->siglock);
audit_log_format(ab, audit_log_format(ab,
" ppid=%d pid=%d auid=%u uid=%u gid=%u" " ppid=%d pid=%d auid=%u uid=%u gid=%u"
" euid=%u suid=%u fsuid=%u" " euid=%u suid=%u fsuid=%u"
...@@ -1901,11 +1893,11 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk) ...@@ -1901,11 +1893,11 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
from_kgid(&init_user_ns, cred->egid), from_kgid(&init_user_ns, cred->egid),
from_kgid(&init_user_ns, cred->sgid), from_kgid(&init_user_ns, cred->sgid),
from_kgid(&init_user_ns, cred->fsgid), from_kgid(&init_user_ns, cred->fsgid),
tty, audit_get_sessionid(tsk)); tty ? tty_name(tty) : "(none)",
audit_get_sessionid(tsk));
audit_put_tty(tty);
audit_log_format(ab, " comm="); audit_log_format(ab, " comm=");
audit_log_untrustedstring(ab, get_task_comm(comm, tsk)); audit_log_untrustedstring(ab, get_task_comm(comm, tsk));
audit_log_d_path_exe(ab, tsk->mm); audit_log_d_path_exe(ab, tsk->mm);
audit_log_task_context(ab); audit_log_task_context(ab);
} }
......
...@@ -1980,6 +1980,7 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid, ...@@ -1980,6 +1980,7 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid,
{ {
struct audit_buffer *ab; struct audit_buffer *ab;
uid_t uid, oldloginuid, loginuid; uid_t uid, oldloginuid, loginuid;
struct tty_struct *tty;
if (!audit_enabled) if (!audit_enabled)
return; return;
...@@ -1987,14 +1988,17 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid, ...@@ -1987,14 +1988,17 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid,
uid = from_kuid(&init_user_ns, task_uid(current)); uid = from_kuid(&init_user_ns, task_uid(current));
oldloginuid = from_kuid(&init_user_ns, koldloginuid); oldloginuid = from_kuid(&init_user_ns, koldloginuid);
loginuid = from_kuid(&init_user_ns, kloginuid), loginuid = from_kuid(&init_user_ns, kloginuid),
tty = audit_get_tty(current);
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN); ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN);
if (!ab) if (!ab)
return; return;
audit_log_format(ab, "pid=%d uid=%u", task_pid_nr(current), uid); audit_log_format(ab, "pid=%d uid=%u", task_pid_nr(current), uid);
audit_log_task_context(ab); audit_log_task_context(ab);
audit_log_format(ab, " old-auid=%u auid=%u old-ses=%u ses=%u res=%d", audit_log_format(ab, " old-auid=%u auid=%u tty=%s old-ses=%u ses=%u res=%d",
oldloginuid, loginuid, oldsessionid, sessionid, !rc); oldloginuid, loginuid, tty ? tty_name(tty) : "(none)",
oldsessionid, sessionid, !rc);
audit_put_tty(tty);
audit_log_end(ab); audit_log_end(ab);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment