audit.c 28.0 KB
Newer Older
1
/* audit.c -- Auditing support
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
 * Gateway between the kernel (e.g., selinux) and the user-space audit daemon.
 * System-call specific features have moved to auditsc.c
 *
 * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
 * All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Written by Rickard E. (Rik) Faith <faith@redhat.com>
 *
 * Goals: 1) Integrate fully with SELinux.
 *	  2) Minimal run-time overhead:
 *	     a) Minimal when syscall auditing is disabled (audit_enable=0).
 *	     b) Small when syscall auditing is enabled and no audit record
 *		is generated (defer as much work as possible to record
 *		generation time):
 *		i) context is allocated,
 *		ii) names from getname are stored without a copy, and
 *		iii) inode information stored from path_lookup.
 *	  3) Ability to disable syscall auditing at boot time (audit=0).
 *	  4) Usable by other parts of the kernel (if audit_log* is called,
 *	     then a syscall record will be generated automatically for the
 *	     current syscall).
 *	  5) Netlink interface to user-space.
 *	  6) Support low-overhead kernel-based filtering to minimize the
 *	     information that must be passed to user-space.
 *
41
 * Example user-space utilities: http://people.redhat.com/sgrubb/audit/
L
Linus Torvalds 已提交
42 43 44 45
 */

#include <linux/init.h>
#include <asm/types.h>
A
Alan Cox 已提交
46
#include <asm/atomic.h>
L
Linus Torvalds 已提交
47 48
#include <linux/mm.h>
#include <linux/module.h>
49 50
#include <linux/err.h>
#include <linux/kthread.h>
L
Linus Torvalds 已提交
51 52 53 54

#include <linux/audit.h>

#include <net/sock.h>
55
#include <net/netlink.h>
L
Linus Torvalds 已提交
56 57
#include <linux/skbuff.h>
#include <linux/netlink.h>
58 59 60
#include <linux/selinux.h>

#include "audit.h"
L
Linus Torvalds 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

/* No auditing will take place until audit_initialized != 0.
 * (Initialization happens after skb_init is called.) */
static int	audit_initialized;

/* No syscall auditing will take place unless audit_enabled != 0. */
int		audit_enabled;

/* Default state when kernel boots without any parameters. */
static int	audit_default;

/* If auditing cannot proceed, audit_failure selects what happens. */
static int	audit_failure = AUDIT_FAIL_PRINTK;

/* If audit records are to be written to the netlink socket, audit_pid
 * contains the (non-zero) pid. */
77
int		audit_pid;
L
Linus Torvalds 已提交
78

79
/* If audit_rate_limit is non-zero, limit the rate of sending audit records
L
Linus Torvalds 已提交
80 81 82 83 84 85
 * to that number per second.  This prevents DoS attacks, but results in
 * audit records being dropped. */
static int	audit_rate_limit;

/* Number of outstanding audit_buffers allowed. */
static int	audit_backlog_limit = 64;
86 87
static int	audit_backlog_wait_time = 60 * HZ;
static int	audit_backlog_wait_overflow = 0;
L
Linus Torvalds 已提交
88

89 90 91 92
/* The identity of the user shutting down the audit system. */
uid_t		audit_sig_uid = -1;
pid_t		audit_sig_pid = -1;

L
Linus Torvalds 已提交
93 94 95 96 97 98 99 100 101 102 103 104
/* Records can be lost in several ways:
   0) [suppressed in audit_alloc]
   1) out of memory in audit_log_start [kmalloc of struct audit_buffer]
   2) out of memory in audit_log_move [alloc_skb]
   3) suppressed due to audit_rate_limit
   4) suppressed due to audit_backlog_limit
*/
static atomic_t    audit_lost = ATOMIC_INIT(0);

/* The netlink socket. */
static struct sock *audit_sock;

105
/* The audit_freelist is a list of pre-allocated audit buffers (if more
L
Linus Torvalds 已提交
106 107 108
 * than AUDIT_MAXFREE are in use, the audit buffer is freed instead of
 * being placed on the freelist). */
static DEFINE_SPINLOCK(audit_freelist_lock);
109
static int	   audit_freelist_count;
L
Linus Torvalds 已提交
110 111
static LIST_HEAD(audit_freelist);

112 113 114
static struct sk_buff_head audit_skb_queue;
static struct task_struct *kauditd_task;
static DECLARE_WAIT_QUEUE_HEAD(kauditd_wait);
115
static DECLARE_WAIT_QUEUE_HEAD(audit_backlog_wait);
L
Linus Torvalds 已提交
116 117

/* The netlink socket is only to be read by 1 CPU, which lets us assume
S
Steve Grubb 已提交
118
 * that list additions and deletions never happen simultaneously in
L
Linus Torvalds 已提交
119
 * auditsc.c */
120
DEFINE_MUTEX(audit_netlink_mutex);
L
Linus Torvalds 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

/* AUDIT_BUFSIZ is the size of the temporary buffer used for formatting
 * audit records.  Since printk uses a 1024 byte buffer, this buffer
 * should be at least that large. */
#define AUDIT_BUFSIZ 1024

/* AUDIT_MAXFREE is the number of empty audit_buffers we keep on the
 * audit_freelist.  Doing so eliminates many kmalloc/kfree calls. */
#define AUDIT_MAXFREE  (2*NR_CPUS)

/* The audit_buffer is used when formatting an audit record.  The caller
 * locks briefly to get the record off the freelist or to allocate the
 * buffer, and locks briefly to send the buffer to the netlink layer or
 * to place it on a transmit queue.  Multiple audit_buffers can be in
 * use simultaneously. */
struct audit_buffer {
	struct list_head     list;
138
	struct sk_buff       *skb;	/* formatted skb ready to send */
L
Linus Torvalds 已提交
139
	struct audit_context *ctx;	/* NULL or associated context */
A
Al Viro 已提交
140
	gfp_t		     gfp_mask;
L
Linus Torvalds 已提交
141 142
};

143 144 145 146 147 148
static void audit_set_pid(struct audit_buffer *ab, pid_t pid)
{
	struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data;
	nlh->nlmsg_pid = pid;
}

149
void audit_panic(const char *message)
L
Linus Torvalds 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
{
	switch (audit_failure)
	{
	case AUDIT_FAIL_SILENT:
		break;
	case AUDIT_FAIL_PRINTK:
		printk(KERN_ERR "audit: %s\n", message);
		break;
	case AUDIT_FAIL_PANIC:
		panic("audit: %s\n", message);
		break;
	}
}

static inline int audit_rate_check(void)
{
	static unsigned long	last_check = 0;
	static int		messages   = 0;
	static DEFINE_SPINLOCK(lock);
	unsigned long		flags;
	unsigned long		now;
	unsigned long		elapsed;
	int			retval	   = 0;

	if (!audit_rate_limit) return 1;

	spin_lock_irqsave(&lock, flags);
	if (++messages < audit_rate_limit) {
		retval = 1;
	} else {
		now     = jiffies;
		elapsed = now - last_check;
		if (elapsed > HZ) {
			last_check = now;
			messages   = 0;
			retval     = 1;
		}
	}
	spin_unlock_irqrestore(&lock, flags);

	return retval;
}

193 194 195 196 197 198 199 200
/**
 * audit_log_lost - conditionally log lost audit message event
 * @message: the message stating reason for lost audit message
 *
 * Emit at least 1 message per second, even if audit_rate_check is
 * throttling.
 * Always increment the lost messages counter.
*/
L
Linus Torvalds 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
void audit_log_lost(const char *message)
{
	static unsigned long	last_msg = 0;
	static DEFINE_SPINLOCK(lock);
	unsigned long		flags;
	unsigned long		now;
	int			print;

	atomic_inc(&audit_lost);

	print = (audit_failure == AUDIT_FAIL_PANIC || !audit_rate_limit);

	if (!print) {
		spin_lock_irqsave(&lock, flags);
		now = jiffies;
		if (now - last_msg > HZ) {
			print = 1;
			last_msg = now;
		}
		spin_unlock_irqrestore(&lock, flags);
	}

	if (print) {
		printk(KERN_WARNING
225
		       "audit: audit_lost=%d audit_rate_limit=%d audit_backlog_limit=%d\n",
L
Linus Torvalds 已提交
226 227 228 229 230 231 232
		       atomic_read(&audit_lost),
		       audit_rate_limit,
		       audit_backlog_limit);
		audit_panic(message);
	}
}

233
static int audit_set_rate_limit(int limit, uid_t loginuid)
L
Linus Torvalds 已提交
234 235 236
{
	int old		 = audit_rate_limit;
	audit_rate_limit = limit;
237
	audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, 
238
			"audit_rate_limit=%d old=%d by auid=%u",
239
			audit_rate_limit, old, loginuid);
L
Linus Torvalds 已提交
240 241 242
	return old;
}

243
static int audit_set_backlog_limit(int limit, uid_t loginuid)
L
Linus Torvalds 已提交
244 245 246
{
	int old		 = audit_backlog_limit;
	audit_backlog_limit = limit;
247
	audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE,
248
			"audit_backlog_limit=%d old=%d by auid=%u",
249
			audit_backlog_limit, old, loginuid);
L
Linus Torvalds 已提交
250 251 252
	return old;
}

253
static int audit_set_enabled(int state, uid_t loginuid)
L
Linus Torvalds 已提交
254 255 256 257 258
{
	int old		 = audit_enabled;
	if (state != 0 && state != 1)
		return -EINVAL;
	audit_enabled = state;
259
	audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE,
260
			"audit_enabled=%d old=%d by auid=%u",
261
			audit_enabled, old, loginuid);
L
Linus Torvalds 已提交
262 263 264
	return old;
}

265
static int audit_set_failure(int state, uid_t loginuid)
L
Linus Torvalds 已提交
266 267 268 269 270 271 272
{
	int old		 = audit_failure;
	if (state != AUDIT_FAIL_SILENT
	    && state != AUDIT_FAIL_PRINTK
	    && state != AUDIT_FAIL_PANIC)
		return -EINVAL;
	audit_failure = state;
273
	audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE,
274
			"audit_failure=%d old=%d by auid=%u",
275
			audit_failure, old, loginuid);
L
Linus Torvalds 已提交
276 277 278
	return old;
}

A
Adrian Bunk 已提交
279
static int kauditd_thread(void *dummy)
280 281 282 283 284
{
	struct sk_buff *skb;

	while (1) {
		skb = skb_dequeue(&audit_skb_queue);
285
		wake_up(&audit_backlog_wait);
286 287 288 289 290 291 292 293 294
		if (skb) {
			if (audit_pid) {
				int err = netlink_unicast(audit_sock, skb, audit_pid, 0);
				if (err < 0) {
					BUG_ON(err != -ECONNREFUSED); /* Shoudn't happen */
					printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid);
					audit_pid = 0;
				}
			} else {
295
				printk(KERN_NOTICE "%s\n", skb->data + NLMSG_SPACE(0));
296 297 298 299 300 301 302
				kfree_skb(skb);
			}
		} else {
			DECLARE_WAITQUEUE(wait, current);
			set_current_state(TASK_INTERRUPTIBLE);
			add_wait_queue(&kauditd_wait, &wait);

303 304
			if (!skb_queue_len(&audit_skb_queue)) {
				try_to_freeze();
305
				schedule();
306
			}
307 308 309 310 311

			__set_current_state(TASK_RUNNING);
			remove_wait_queue(&kauditd_wait, &wait);
		}
	}
312
	return 0;
313 314
}

315 316 317 318 319 320 321 322 323 324 325 326 327
/**
 * audit_send_reply - send an audit reply message via netlink
 * @pid: process id to send reply to
 * @seq: sequence number
 * @type: audit message type
 * @done: done (last) flag
 * @multi: multi-part message flag
 * @payload: payload data
 * @size: payload size
 *
 * Allocates an skb, builds the netlink message, and sends it to the pid.
 * No failure notifications.
 */
L
Linus Torvalds 已提交
328 329 330 331 332 333 334 335 336 337 338 339
void audit_send_reply(int pid, int seq, int type, int done, int multi,
		      void *payload, int size)
{
	struct sk_buff	*skb;
	struct nlmsghdr	*nlh;
	int		len = NLMSG_SPACE(size);
	void		*data;
	int		flags = multi ? NLM_F_MULTI : 0;
	int		t     = done  ? NLMSG_DONE  : type;

	skb = alloc_skb(len, GFP_KERNEL);
	if (!skb)
340
		return;
L
Linus Torvalds 已提交
341

342
	nlh		 = NLMSG_PUT(skb, pid, seq, t, size);
L
Linus Torvalds 已提交
343 344 345
	nlh->nlmsg_flags = flags;
	data		 = NLMSG_DATA(nlh);
	memcpy(data, payload, size);
346 347 348 349

	/* Ignore failure. It'll only happen if the sender goes away,
	   because our timeout is set to infinite. */
	netlink_unicast(audit_sock, skb, pid, 0);
L
Linus Torvalds 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
	return;

nlmsg_failure:			/* Used by NLMSG_PUT */
	if (skb)
		kfree_skb(skb);
}

/*
 * Check for appropriate CAP_AUDIT_ capabilities on incoming audit
 * control messages.
 */
static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type)
{
	int err = 0;

	switch (msg_type) {
	case AUDIT_GET:
	case AUDIT_LIST:
368
	case AUDIT_LIST_RULES:
L
Linus Torvalds 已提交
369 370
	case AUDIT_SET:
	case AUDIT_ADD:
371
	case AUDIT_ADD_RULE:
L
Linus Torvalds 已提交
372
	case AUDIT_DEL:
373
	case AUDIT_DEL_RULE:
374
	case AUDIT_SIGNAL_INFO:
L
Linus Torvalds 已提交
375 376 377
		if (!cap_raised(eff_cap, CAP_AUDIT_CONTROL))
			err = -EPERM;
		break;
378
	case AUDIT_USER:
379
	case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
380
	case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
L
Linus Torvalds 已提交
381 382 383 384 385 386 387 388 389 390 391 392
		if (!cap_raised(eff_cap, CAP_AUDIT_WRITE))
			err = -EPERM;
		break;
	default:  /* bad msg */
		err = -EINVAL;
	}

	return err;
}

static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
393
	u32			uid, pid, seq, sid;
L
Linus Torvalds 已提交
394 395 396
	void			*data;
	struct audit_status	*status_get, status_set;
	int			err;
397
	struct audit_buffer	*ab;
L
Linus Torvalds 已提交
398
	u16			msg_type = nlh->nlmsg_type;
399
	uid_t			loginuid; /* loginuid of sender */
400
	struct audit_sig_info   sig_data;
L
Linus Torvalds 已提交
401 402 403 404 405

	err = audit_netlink_ok(NETLINK_CB(skb).eff_cap, msg_type);
	if (err)
		return err;

406 407
	/* As soon as there's any sign of userspace auditd,
	 * start kauditd to talk to it */
408 409 410 411 412 413 414 415
	if (!kauditd_task)
		kauditd_task = kthread_run(kauditd_thread, NULL, "kauditd");
	if (IS_ERR(kauditd_task)) {
		err = PTR_ERR(kauditd_task);
		kauditd_task = NULL;
		return err;
	}

L
Linus Torvalds 已提交
416 417
	pid  = NETLINK_CREDS(skb)->pid;
	uid  = NETLINK_CREDS(skb)->uid;
418
	loginuid = NETLINK_CB(skb).loginuid;
419
	sid  = NETLINK_CB(skb).sid;
L
Linus Torvalds 已提交
420 421 422 423 424 425 426 427 428 429 430
	seq  = nlh->nlmsg_seq;
	data = NLMSG_DATA(nlh);

	switch (msg_type) {
	case AUDIT_GET:
		status_set.enabled	 = audit_enabled;
		status_set.failure	 = audit_failure;
		status_set.pid		 = audit_pid;
		status_set.rate_limit	 = audit_rate_limit;
		status_set.backlog_limit = audit_backlog_limit;
		status_set.lost		 = atomic_read(&audit_lost);
431
		status_set.backlog	 = skb_queue_len(&audit_skb_queue);
L
Linus Torvalds 已提交
432 433 434 435 436 437 438 439
		audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_GET, 0, 0,
				 &status_set, sizeof(status_set));
		break;
	case AUDIT_SET:
		if (nlh->nlmsg_len < sizeof(struct audit_status))
			return -EINVAL;
		status_get   = (struct audit_status *)data;
		if (status_get->mask & AUDIT_STATUS_ENABLED) {
440
			err = audit_set_enabled(status_get->enabled, loginuid);
L
Linus Torvalds 已提交
441 442 443
			if (err < 0) return err;
		}
		if (status_get->mask & AUDIT_STATUS_FAILURE) {
444
			err = audit_set_failure(status_get->failure, loginuid);
L
Linus Torvalds 已提交
445 446 447 448 449
			if (err < 0) return err;
		}
		if (status_get->mask & AUDIT_STATUS_PID) {
			int old   = audit_pid;
			audit_pid = status_get->pid;
450
			audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE,
451
				"audit_pid=%d old=%d by auid=%u",
452
				  audit_pid, old, loginuid);
L
Linus Torvalds 已提交
453 454
		}
		if (status_get->mask & AUDIT_STATUS_RATE_LIMIT)
455
			audit_set_rate_limit(status_get->rate_limit, loginuid);
L
Linus Torvalds 已提交
456
		if (status_get->mask & AUDIT_STATUS_BACKLOG_LIMIT)
457 458
			audit_set_backlog_limit(status_get->backlog_limit,
							loginuid);
L
Linus Torvalds 已提交
459
		break;
460
	case AUDIT_USER:
461
	case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
462
	case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
463 464 465
		if (!audit_enabled && msg_type != AUDIT_USER_AVC)
			return 0;

466
		err = audit_filter_user(&NETLINK_CB(skb), msg_type);
467 468
		if (err == 1) {
			err = 0;
469
			ab = audit_log_start(NULL, GFP_KERNEL, msg_type);
470 471
			if (ab) {
				audit_log_format(ab,
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
						 "user pid=%d uid=%u auid=%u",
						 pid, uid, loginuid);
				if (sid) {
					char *ctx = NULL;
					u32 len;
					if (selinux_ctxid_to_string(
							sid, &ctx, &len)) {
						audit_log_format(ab, 
							" subj=%u", sid);
						/* Maybe call audit_panic? */
					} else
						audit_log_format(ab, 
							" subj=%s", ctx);
					kfree(ctx);
				}
				audit_log_format(ab, " msg='%.1024s'",
					 (char *)data);
489 490 491
				audit_set_pid(ab, pid);
				audit_log_end(ab);
			}
492
		}
L
Linus Torvalds 已提交
493 494 495
		break;
	case AUDIT_ADD:
	case AUDIT_DEL:
496
		if (nlmsg_len(nlh) < sizeof(struct audit_rule))
L
Linus Torvalds 已提交
497 498 499 500
			return -EINVAL;
		/* fallthrough */
	case AUDIT_LIST:
		err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid,
501 502 503 504 505 506 507 508 509 510 511 512
					   uid, seq, data, nlmsg_len(nlh),
					   loginuid);
		break;
	case AUDIT_ADD_RULE:
	case AUDIT_DEL_RULE:
		if (nlmsg_len(nlh) < sizeof(struct audit_rule_data))
			return -EINVAL;
		/* fallthrough */
	case AUDIT_LIST_RULES:
		err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid,
					   uid, seq, data, nlmsg_len(nlh),
					   loginuid);
L
Linus Torvalds 已提交
513
		break;
514 515 516 517 518 519
	case AUDIT_SIGNAL_INFO:
		sig_data.uid = audit_sig_uid;
		sig_data.pid = audit_sig_pid;
		audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_SIGNAL_INFO, 
				0, 0, &sig_data, sizeof(sig_data));
		break;
L
Linus Torvalds 已提交
520 521 522 523 524 525 526 527
	default:
		err = -EINVAL;
		break;
	}

	return err < 0 ? err : 0;
}

528 529
/*
 * Get message from skb (based on rtnetlink_rcv_skb).  Each message is
L
Linus Torvalds 已提交
530
 * processed by audit_receive_msg.  Malformed skbs with wrong length are
531 532
 * discarded silently.
 */
533
static void audit_receive_skb(struct sk_buff *skb)
L
Linus Torvalds 已提交
534 535 536 537 538 539 540 541
{
	int		err;
	struct nlmsghdr	*nlh;
	u32		rlen;

	while (skb->len >= NLMSG_SPACE(0)) {
		nlh = (struct nlmsghdr *)skb->data;
		if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
542
			return;
L
Linus Torvalds 已提交
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
		rlen = NLMSG_ALIGN(nlh->nlmsg_len);
		if (rlen > skb->len)
			rlen = skb->len;
		if ((err = audit_receive_msg(skb, nlh))) {
			netlink_ack(skb, nlh, err);
		} else if (nlh->nlmsg_flags & NLM_F_ACK)
			netlink_ack(skb, nlh, 0);
		skb_pull(skb, rlen);
	}
}

/* Receive messages from netlink socket. */
static void audit_receive(struct sock *sk, int length)
{
	struct sk_buff  *skb;
558
	unsigned int qlen;
L
Linus Torvalds 已提交
559

560
	mutex_lock(&audit_netlink_mutex);
L
Linus Torvalds 已提交
561

562 563 564 565
	for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
		skb = skb_dequeue(&sk->sk_receive_queue);
		audit_receive_skb(skb);
		kfree_skb(skb);
L
Linus Torvalds 已提交
566
	}
567
	mutex_unlock(&audit_netlink_mutex);
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575
}


/* Initialize audit support at boot time. */
static int __init audit_init(void)
{
	printk(KERN_INFO "audit: initializing netlink socket (%s)\n",
	       audit_default ? "enabled" : "disabled");
576
	audit_sock = netlink_kernel_create(NETLINK_AUDIT, 0, audit_receive,
577
					   THIS_MODULE);
L
Linus Torvalds 已提交
578 579
	if (!audit_sock)
		audit_panic("cannot initialize netlink socket");
580 581
	else
		audit_sock->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT;
L
Linus Torvalds 已提交
582

583
	skb_queue_head_init(&audit_skb_queue);
L
Linus Torvalds 已提交
584 585
	audit_initialized = 1;
	audit_enabled = audit_default;
586 587 588 589 590

	/* Register the callback with selinux.  This callback will be invoked
	 * when a new policy is loaded. */
	selinux_audit_set_callback(&selinux_audit_rule_update);

591
	audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL, "initialized");
L
Linus Torvalds 已提交
592 593 594 595 596 597 598 599 600 601 602 603 604
	return 0;
}
__initcall(audit_init);

/* Process kernel command-line parameter at boot time.  audit=0 or audit=1. */
static int __init audit_enable(char *str)
{
	audit_default = !!simple_strtol(str, NULL, 0);
	printk(KERN_INFO "audit: %s%s\n",
	       audit_default ? "enabled" : "disabled",
	       audit_initialized ? "" : " (after initialization)");
	if (audit_initialized)
		audit_enabled = audit_default;
605
	return 1;
L
Linus Torvalds 已提交
606 607 608 609
}

__setup("audit=", audit_enable);

610 611 612 613
static void audit_buffer_free(struct audit_buffer *ab)
{
	unsigned long flags;

614 615 616
	if (!ab)
		return;

617 618
	if (ab->skb)
		kfree_skb(ab->skb);
619

620 621 622 623 624 625 626 627
	spin_lock_irqsave(&audit_freelist_lock, flags);
	if (++audit_freelist_count > AUDIT_MAXFREE)
		kfree(ab);
	else
		list_add(&ab->list, &audit_freelist);
	spin_unlock_irqrestore(&audit_freelist_lock, flags);
}

628
static struct audit_buffer * audit_buffer_alloc(struct audit_context *ctx,
A
Al Viro 已提交
629
						gfp_t gfp_mask, int type)
630 631 632
{
	unsigned long flags;
	struct audit_buffer *ab = NULL;
633
	struct nlmsghdr *nlh;
634 635 636 637 638 639 640 641 642 643 644

	spin_lock_irqsave(&audit_freelist_lock, flags);
	if (!list_empty(&audit_freelist)) {
		ab = list_entry(audit_freelist.next,
				struct audit_buffer, list);
		list_del(&ab->list);
		--audit_freelist_count;
	}
	spin_unlock_irqrestore(&audit_freelist_lock, flags);

	if (!ab) {
645
		ab = kmalloc(sizeof(*ab), gfp_mask);
646
		if (!ab)
647
			goto err;
648
	}
649

650
	ab->skb = alloc_skb(AUDIT_BUFSIZ, gfp_mask);
651
	if (!ab->skb)
652 653
		goto err;

654
	ab->ctx = ctx;
655
	ab->gfp_mask = gfp_mask;
656 657 658 659 660
	nlh = (struct nlmsghdr *)skb_put(ab->skb, NLMSG_SPACE(0));
	nlh->nlmsg_type = type;
	nlh->nlmsg_flags = 0;
	nlh->nlmsg_pid = 0;
	nlh->nlmsg_seq = 0;
661
	return ab;
662 663 664
err:
	audit_buffer_free(ab);
	return NULL;
665
}
L
Linus Torvalds 已提交
666

667 668 669 670
/**
 * audit_serial - compute a serial number for the audit record
 *
 * Compute a serial number for the audit record.  Audit records are
671 672 673 674 675 676 677 678 679 680 681
 * written to user-space as soon as they are generated, so a complete
 * audit record may be written in several pieces.  The timestamp of the
 * record and this serial number are used by the user-space tools to
 * determine which pieces belong to the same audit record.  The
 * (timestamp,serial) tuple is unique for each syscall and is live from
 * syscall entry to syscall exit.
 *
 * NOTE: Another possibility is to store the formatted records off the
 * audit context (for those records that have a context), and emit them
 * all at syscall exit.  However, this could delay the reporting of
 * significant errors until syscall exit (or never, if the system
682 683
 * halts).
 */
684 685
unsigned int audit_serial(void)
{
686 687 688 689 690
	static spinlock_t serial_lock = SPIN_LOCK_UNLOCKED;
	static unsigned int serial = 0;

	unsigned long flags;
	unsigned int ret;
691

692
	spin_lock_irqsave(&serial_lock, flags);
693
	do {
694 695
		ret = ++serial;
	} while (unlikely(!ret));
696
	spin_unlock_irqrestore(&serial_lock, flags);
697

698
	return ret;
699 700 701 702 703 704 705 706 707 708 709 710 711
}

static inline void audit_get_stamp(struct audit_context *ctx, 
				   struct timespec *t, unsigned int *serial)
{
	if (ctx)
		auditsc_get_stamp(ctx, t, serial);
	else {
		*t = CURRENT_TIME;
		*serial = audit_serial();
	}
}

L
Linus Torvalds 已提交
712 713 714 715 716 717
/* Obtain an audit buffer.  This routine does locking to obtain the
 * audit buffer, but then no locking is required for calls to
 * audit_log_*format.  If the tsk is a task that is currently in a
 * syscall, then the syscall is marked as auditable and an audit record
 * will be written at syscall exit.  If there is no associated task, tsk
 * should be NULL. */
718

719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
/**
 * audit_log_start - obtain an audit buffer
 * @ctx: audit_context (may be NULL)
 * @gfp_mask: type of allocation
 * @type: audit message type
 *
 * Returns audit_buffer pointer on success or NULL on error.
 *
 * Obtain an audit buffer.  This routine does locking to obtain the
 * audit buffer, but then no locking is required for calls to
 * audit_log_*format.  If the task (ctx) is a task that is currently in a
 * syscall, then the syscall is marked as auditable and an audit record
 * will be written at syscall exit.  If there is no associated task, then
 * task context (ctx) should be NULL.
 */
A
Al Viro 已提交
734
struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
735
				     int type)
L
Linus Torvalds 已提交
736 737 738
{
	struct audit_buffer	*ab	= NULL;
	struct timespec		t;
739
	unsigned int		serial;
740
	int reserve;
741
	unsigned long timeout_start = jiffies;
L
Linus Torvalds 已提交
742 743 744 745

	if (!audit_initialized)
		return NULL;

746 747 748
	if (unlikely(audit_filter_type(type)))
		return NULL;

749 750 751 752 753 754 755 756
	if (gfp_mask & __GFP_WAIT)
		reserve = 0;
	else
		reserve = 5; /* Allow atomic callers to go up to five 
				entries over the normal backlog limit */

	while (audit_backlog_limit
	       && skb_queue_len(&audit_skb_queue) > audit_backlog_limit + reserve) {
757 758 759
		if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time
		    && time_before(jiffies, timeout_start + audit_backlog_wait_time)) {

760 761 762 763 764 765 766
			/* Wait for auditd to drain the queue a little */
			DECLARE_WAITQUEUE(wait, current);
			set_current_state(TASK_INTERRUPTIBLE);
			add_wait_queue(&audit_backlog_wait, &wait);

			if (audit_backlog_limit &&
			    skb_queue_len(&audit_skb_queue) > audit_backlog_limit)
767
				schedule_timeout(timeout_start + audit_backlog_wait_time - jiffies);
768 769 770

			__set_current_state(TASK_RUNNING);
			remove_wait_queue(&audit_backlog_wait, &wait);
771
			continue;
772
		}
773 774 775 776 777 778 779
		if (audit_rate_check())
			printk(KERN_WARNING
			       "audit: audit_backlog=%d > "
			       "audit_backlog_limit=%d\n",
			       skb_queue_len(&audit_skb_queue),
			       audit_backlog_limit);
		audit_log_lost("backlog limit exceeded");
780 781
		audit_backlog_wait_time = audit_backlog_wait_overflow;
		wake_up(&audit_backlog_wait);
782 783 784
		return NULL;
	}

785
	ab = audit_buffer_alloc(ctx, gfp_mask, type);
L
Linus Torvalds 已提交
786 787 788 789 790
	if (!ab) {
		audit_log_lost("out of memory in audit_log_start");
		return NULL;
	}

791
	audit_get_stamp(ab->ctx, &t, &serial);
792

L
Linus Torvalds 已提交
793 794 795 796 797
	audit_log_format(ab, "audit(%lu.%03lu:%u): ",
			 t.tv_sec, t.tv_nsec/1000000, serial);
	return ab;
}

798
/**
799
 * audit_expand - expand skb in the audit buffer
800
 * @ab: audit_buffer
801
 * @extra: space to add at tail of the skb
802 803 804 805
 *
 * Returns 0 (no space) on failed expansion, or available space if
 * successful.
 */
806
static inline int audit_expand(struct audit_buffer *ab, int extra)
807
{
808
	struct sk_buff *skb = ab->skb;
809
	int ret = pskb_expand_head(skb, skb_headroom(skb), extra,
810
				   ab->gfp_mask);
811 812
	if (ret < 0) {
		audit_log_lost("out of memory in audit_expand");
813
		return 0;
814 815
	}
	return skb_tailroom(skb);
816
}
L
Linus Torvalds 已提交
817

818 819
/*
 * Format an audit message into the audit buffer.  If there isn't enough
L
Linus Torvalds 已提交
820 821
 * room in the audit buffer, more room will be allocated and vsnprint
 * will be called a second time.  Currently, we assume that a printk
822 823
 * can't format message larger than 1024 bytes, so we don't either.
 */
L
Linus Torvalds 已提交
824 825 826 827
static void audit_log_vformat(struct audit_buffer *ab, const char *fmt,
			      va_list args)
{
	int len, avail;
828
	struct sk_buff *skb;
D
David Woodhouse 已提交
829
	va_list args2;
L
Linus Torvalds 已提交
830 831 832 833

	if (!ab)
		return;

834 835 836 837
	BUG_ON(!ab->skb);
	skb = ab->skb;
	avail = skb_tailroom(skb);
	if (avail == 0) {
838
		avail = audit_expand(ab, AUDIT_BUFSIZ);
839 840
		if (!avail)
			goto out;
L
Linus Torvalds 已提交
841
	}
D
David Woodhouse 已提交
842
	va_copy(args2, args);
843
	len = vsnprintf(skb->tail, avail, fmt, args);
L
Linus Torvalds 已提交
844 845 846 847
	if (len >= avail) {
		/* The printk buffer is 1024 bytes long, so if we get
		 * here and AUDIT_BUFSIZ is at least 1024, then we can
		 * log everything that printk could have logged. */
848 849
		avail = audit_expand(ab,
			max_t(unsigned, AUDIT_BUFSIZ, 1+len-avail));
850 851
		if (!avail)
			goto out;
D
David Woodhouse 已提交
852
		len = vsnprintf(skb->tail, avail, fmt, args2);
L
Linus Torvalds 已提交
853
	}
854 855
	if (len > 0)
		skb_put(skb, len);
856 857
out:
	return;
L
Linus Torvalds 已提交
858 859
}

860 861 862 863 864 865 866 867
/**
 * audit_log_format - format a message into the audit buffer.
 * @ab: audit_buffer
 * @fmt: format string
 * @...: optional parameters matching @fmt string
 *
 * All the work is done in audit_log_vformat.
 */
L
Linus Torvalds 已提交
868 869 870 871 872 873 874 875 876 877 878
void audit_log_format(struct audit_buffer *ab, const char *fmt, ...)
{
	va_list args;

	if (!ab)
		return;
	va_start(args, fmt);
	audit_log_vformat(ab, fmt, args);
	va_end(args);
}

879 880 881 882 883 884 885 886 887 888 889 890
/**
 * audit_log_hex - convert a buffer to hex and append it to the audit skb
 * @ab: the audit_buffer
 * @buf: buffer to convert to hex
 * @len: length of @buf to be converted
 *
 * No return value; failure to expand is silently ignored.
 *
 * This function will take the passed buf and convert it into a string of
 * ascii hex digits. The new string is placed onto the skb.
 */
void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf,
891
		size_t len)
892
{
893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
	int i, avail, new_len;
	unsigned char *ptr;
	struct sk_buff *skb;
	static const unsigned char *hex = "0123456789ABCDEF";

	BUG_ON(!ab->skb);
	skb = ab->skb;
	avail = skb_tailroom(skb);
	new_len = len<<1;
	if (new_len >= avail) {
		/* Round the buffer request up to the next multiple */
		new_len = AUDIT_BUFSIZ*(((new_len-avail)/AUDIT_BUFSIZ) + 1);
		avail = audit_expand(ab, new_len);
		if (!avail)
			return;
	}
909

910 911 912 913 914 915 916
	ptr = skb->tail;
	for (i=0; i<len; i++) {
		*ptr++ = hex[(buf[i] & 0xF0)>>4]; /* Upper nibble */
		*ptr++ = hex[buf[i] & 0x0F];	  /* Lower nibble */
	}
	*ptr = 0;
	skb_put(skb, len << 1); /* new string is twice the old string */
917 918
}

919 920 921 922 923 924 925
/**
 * audit_log_unstrustedstring - log a string that may contain random characters
 * @ab: audit_buffer
 * @string: string to be logged
 *
 * This code will escape a string that is passed to it if the string
 * contains a control character, unprintable character, double quote mark,
926
 * or a space. Unescaped strings will start and end with a double quote mark.
927 928
 * Strings that are escaped are printed in hex (2 digits per char).
 */
929 930
void audit_log_untrustedstring(struct audit_buffer *ab, const char *string)
{
931
	const unsigned char *p = string;
932 933

	while (*p) {
934
		if (*p == '"' || *p < 0x21 || *p > 0x7f) {
935 936 937 938 939 940 941 942
			audit_log_hex(ab, string, strlen(string));
			return;
		}
		p++;
	}
	audit_log_format(ab, "\"%s\"", string);
}

943
/* This is a helper-function to print the escaped d_path */
L
Linus Torvalds 已提交
944 945 946
void audit_log_d_path(struct audit_buffer *ab, const char *prefix,
		      struct dentry *dentry, struct vfsmount *vfsmnt)
{
947
	char *p, *path;
L
Linus Torvalds 已提交
948

949 950
	if (prefix)
		audit_log_format(ab, " %s", prefix);
L
Linus Torvalds 已提交
951

952
	/* We will allow 11 spaces for ' (deleted)' to be appended */
953
	path = kmalloc(PATH_MAX+11, ab->gfp_mask);
954 955 956
	if (!path) {
		audit_log_format(ab, "<no memory>");
		return;
L
Linus Torvalds 已提交
957
	}
958 959 960 961 962 963 964
	p = d_path(dentry, vfsmnt, path, PATH_MAX+11);
	if (IS_ERR(p)) { /* Should never happen since we send PATH_MAX */
		/* FIXME: can we save some information here? */
		audit_log_format(ab, "<too long>");
	} else 
		audit_log_untrustedstring(ab, p);
	kfree(path);
L
Linus Torvalds 已提交
965 966
}

967 968 969 970 971 972
/**
 * audit_log_end - end one audit record
 * @ab: the audit_buffer
 *
 * The netlink_* functions cannot be called inside an irq context, so
 * the audit buffer is placed on a queue and a tasklet is scheduled to
L
Linus Torvalds 已提交
973
 * remove them from the queue outside the irq context.  May be called in
974 975
 * any context.
 */
976
void audit_log_end(struct audit_buffer *ab)
L
Linus Torvalds 已提交
977 978 979 980 981 982
{
	if (!ab)
		return;
	if (!audit_rate_check()) {
		audit_log_lost("rate limit exceeded");
	} else {
983 984 985 986 987 988 989
		if (audit_pid) {
			struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data;
			nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0);
			skb_queue_tail(&audit_skb_queue, ab->skb);
			ab->skb = NULL;
			wake_up_interruptible(&kauditd_wait);
		} else {
990
			printk(KERN_NOTICE "%s\n", ab->skb->data + NLMSG_SPACE(0));
991
		}
L
Linus Torvalds 已提交
992
	}
993
	audit_buffer_free(ab);
L
Linus Torvalds 已提交
994 995
}

996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
/**
 * audit_log - Log an audit record
 * @ctx: audit context
 * @gfp_mask: type of allocation
 * @type: audit message type
 * @fmt: format string to use
 * @...: variable parameters matching the format string
 *
 * This is a convenience function that calls audit_log_start,
 * audit_log_vformat, and audit_log_end.  It may be called
 * in any context.
 */
A
Al Viro 已提交
1008
void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type, 
1009
	       const char *fmt, ...)
L
Linus Torvalds 已提交
1010 1011 1012 1013
{
	struct audit_buffer *ab;
	va_list args;

1014
	ab = audit_log_start(ctx, gfp_mask, type);
L
Linus Torvalds 已提交
1015 1016 1017 1018 1019 1020 1021
	if (ab) {
		va_start(args, fmt);
		audit_log_vformat(ab, fmt, args);
		va_end(args);
		audit_log_end(ab);
	}
}
1022 1023 1024 1025 1026

EXPORT_SYMBOL(audit_log_start);
EXPORT_SYMBOL(audit_log_end);
EXPORT_SYMBOL(audit_log_format);
EXPORT_SYMBOL(audit_log);