|
@@ -43,6 +43,7 @@
|
|
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
|
|
|
|
+#include <linux/file.h>
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/types.h>
|
|
#include <linux/types.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/atomic.h>
|
|
@@ -107,6 +108,7 @@ static u32 audit_rate_limit;
|
|
* When set to zero, this means unlimited. */
|
|
* When set to zero, this means unlimited. */
|
|
static u32 audit_backlog_limit = 64;
|
|
static u32 audit_backlog_limit = 64;
|
|
#define AUDIT_BACKLOG_WAIT_TIME (60 * HZ)
|
|
#define AUDIT_BACKLOG_WAIT_TIME (60 * HZ)
|
|
|
|
+static u32 audit_backlog_wait_time_master = AUDIT_BACKLOG_WAIT_TIME;
|
|
static u32 audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME;
|
|
static u32 audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME;
|
|
static u32 audit_backlog_wait_overflow = 0;
|
|
static u32 audit_backlog_wait_overflow = 0;
|
|
|
|
|
|
@@ -338,13 +340,13 @@ static int audit_set_backlog_limit(u32 limit)
|
|
static int audit_set_backlog_wait_time(u32 timeout)
|
|
static int audit_set_backlog_wait_time(u32 timeout)
|
|
{
|
|
{
|
|
return audit_do_config_change("audit_backlog_wait_time",
|
|
return audit_do_config_change("audit_backlog_wait_time",
|
|
- &audit_backlog_wait_time, timeout);
|
|
|
|
|
|
+ &audit_backlog_wait_time_master, timeout);
|
|
}
|
|
}
|
|
|
|
|
|
static int audit_set_enabled(u32 state)
|
|
static int audit_set_enabled(u32 state)
|
|
{
|
|
{
|
|
int rc;
|
|
int rc;
|
|
- if (state < AUDIT_OFF || state > AUDIT_LOCKED)
|
|
|
|
|
|
+ if (state > AUDIT_LOCKED)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
rc = audit_do_config_change("audit_enabled", &audit_enabled, state);
|
|
rc = audit_do_config_change("audit_enabled", &audit_enabled, state);
|
|
@@ -663,7 +665,7 @@ static int audit_netlink_ok(struct sk_buff *skb, u16 msg_type)
|
|
case AUDIT_MAKE_EQUIV:
|
|
case AUDIT_MAKE_EQUIV:
|
|
/* Only support auditd and auditctl in initial pid namespace
|
|
/* Only support auditd and auditctl in initial pid namespace
|
|
* for now. */
|
|
* for now. */
|
|
- if ((task_active_pid_ns(current) != &init_pid_ns))
|
|
|
|
|
|
+ if (task_active_pid_ns(current) != &init_pid_ns)
|
|
return -EPERM;
|
|
return -EPERM;
|
|
|
|
|
|
if (!netlink_capable(skb, CAP_AUDIT_CONTROL))
|
|
if (!netlink_capable(skb, CAP_AUDIT_CONTROL))
|
|
@@ -834,7 +836,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
s.lost = atomic_read(&audit_lost);
|
|
s.lost = atomic_read(&audit_lost);
|
|
s.backlog = skb_queue_len(&audit_skb_queue);
|
|
s.backlog = skb_queue_len(&audit_skb_queue);
|
|
s.feature_bitmap = AUDIT_FEATURE_BITMAP_ALL;
|
|
s.feature_bitmap = AUDIT_FEATURE_BITMAP_ALL;
|
|
- s.backlog_wait_time = audit_backlog_wait_time;
|
|
|
|
|
|
+ s.backlog_wait_time = audit_backlog_wait_time_master;
|
|
audit_send_reply(skb, seq, AUDIT_GET, 0, 0, &s, sizeof(s));
|
|
audit_send_reply(skb, seq, AUDIT_GET, 0, 0, &s, sizeof(s));
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -877,8 +879,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
if (s.mask & AUDIT_STATUS_BACKLOG_WAIT_TIME) {
|
|
if (s.mask & AUDIT_STATUS_BACKLOG_WAIT_TIME) {
|
|
if (sizeof(s) > (size_t)nlh->nlmsg_len)
|
|
if (sizeof(s) > (size_t)nlh->nlmsg_len)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
- if (s.backlog_wait_time < 0 ||
|
|
|
|
- s.backlog_wait_time > 10*AUDIT_BACKLOG_WAIT_TIME)
|
|
|
|
|
|
+ if (s.backlog_wait_time > 10*AUDIT_BACKLOG_WAIT_TIME)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
err = audit_set_backlog_wait_time(s.backlog_wait_time);
|
|
err = audit_set_backlog_wait_time(s.backlog_wait_time);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
@@ -1385,7 +1386,8 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
- audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME;
|
|
|
|
|
|
+ if (!reserve)
|
|
|
|
+ audit_backlog_wait_time = audit_backlog_wait_time_master;
|
|
|
|
|
|
ab = audit_buffer_alloc(ctx, gfp_mask, type);
|
|
ab = audit_buffer_alloc(ctx, gfp_mask, type);
|
|
if (!ab) {
|
|
if (!ab) {
|
|
@@ -1759,7 +1761,7 @@ void audit_log_name(struct audit_context *context, struct audit_names *n,
|
|
} else
|
|
} else
|
|
audit_log_format(ab, " name=(null)");
|
|
audit_log_format(ab, " name=(null)");
|
|
|
|
|
|
- if (n->ino != (unsigned long)-1) {
|
|
|
|
|
|
+ if (n->ino != (unsigned long)-1)
|
|
audit_log_format(ab, " inode=%lu"
|
|
audit_log_format(ab, " inode=%lu"
|
|
" dev=%02x:%02x mode=%#ho"
|
|
" dev=%02x:%02x mode=%#ho"
|
|
" ouid=%u ogid=%u rdev=%02x:%02x",
|
|
" ouid=%u ogid=%u rdev=%02x:%02x",
|
|
@@ -1771,7 +1773,6 @@ void audit_log_name(struct audit_context *context, struct audit_names *n,
|
|
from_kgid(&init_user_ns, n->gid),
|
|
from_kgid(&init_user_ns, n->gid),
|
|
MAJOR(n->rdev),
|
|
MAJOR(n->rdev),
|
|
MINOR(n->rdev));
|
|
MINOR(n->rdev));
|
|
- }
|
|
|
|
if (n->osid != 0) {
|
|
if (n->osid != 0) {
|
|
char *ctx = NULL;
|
|
char *ctx = NULL;
|
|
u32 len;
|
|
u32 len;
|
|
@@ -1838,11 +1839,29 @@ error_path:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(audit_log_task_context);
|
|
EXPORT_SYMBOL(audit_log_task_context);
|
|
|
|
|
|
|
|
+void audit_log_d_path_exe(struct audit_buffer *ab,
|
|
|
|
+ struct mm_struct *mm)
|
|
|
|
+{
|
|
|
|
+ struct file *exe_file;
|
|
|
|
+
|
|
|
|
+ if (!mm)
|
|
|
|
+ goto out_null;
|
|
|
|
+
|
|
|
|
+ exe_file = get_mm_exe_file(mm);
|
|
|
|
+ if (!exe_file)
|
|
|
|
+ goto out_null;
|
|
|
|
+
|
|
|
|
+ audit_log_d_path(ab, " exe=", &exe_file->f_path);
|
|
|
|
+ fput(exe_file);
|
|
|
|
+ return;
|
|
|
|
+out_null:
|
|
|
|
+ audit_log_format(ab, " exe=(null)");
|
|
|
|
+}
|
|
|
|
+
|
|
void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
|
|
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)];
|
|
- struct mm_struct *mm = tsk->mm;
|
|
|
|
char *tty;
|
|
char *tty;
|
|
|
|
|
|
if (!ab)
|
|
if (!ab)
|
|
@@ -1878,13 +1897,7 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
|
|
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));
|
|
|
|
|
|
- if (mm) {
|
|
|
|
- down_read(&mm->mmap_sem);
|
|
|
|
- if (mm->exe_file)
|
|
|
|
- audit_log_d_path(ab, " exe=", &mm->exe_file->f_path);
|
|
|
|
- up_read(&mm->mmap_sem);
|
|
|
|
- } else
|
|
|
|
- audit_log_format(ab, " exe=(null)");
|
|
|
|
|
|
+ audit_log_d_path_exe(ab, tsk->mm);
|
|
audit_log_task_context(ab);
|
|
audit_log_task_context(ab);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(audit_log_task_info);
|
|
EXPORT_SYMBOL(audit_log_task_info);
|