audit.c 27.4 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#include <linux/skbuff.h>
#include <linux/netlink.h>

/* 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. */
74
int		audit_pid;
L
Linus Torvalds 已提交
75

76
/* If audit_rate_limit is non-zero, limit the rate of sending audit records
L
Linus Torvalds 已提交
77 78 79 80 81 82
 * 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;
83 84
static int	audit_backlog_wait_time = 60 * HZ;
static int	audit_backlog_wait_overflow = 0;
L
Linus Torvalds 已提交
85

86 87 88 89
/* 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 已提交
90 91 92 93 94 95 96 97 98 99 100 101
/* 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;

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

109 110 111
static struct sk_buff_head audit_skb_queue;
static struct task_struct *kauditd_task;
static DECLARE_WAIT_QUEUE_HEAD(kauditd_wait);
112
static DECLARE_WAIT_QUEUE_HEAD(audit_backlog_wait);
L
Linus Torvalds 已提交
113 114

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

/* 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;
135
	struct sk_buff       *skb;	/* formatted skb ready to send */
L
Linus Torvalds 已提交
136
	struct audit_context *ctx;	/* NULL or associated context */
A
Al Viro 已提交
137
	gfp_t		     gfp_mask;
L
Linus Torvalds 已提交
138 139
};

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

146
void audit_panic(const char *message)
L
Linus Torvalds 已提交
147 148 149 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
{
	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;
}

190 191 192 193 194 195 196 197
/**
 * 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 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
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
222
		       "audit: audit_lost=%d audit_rate_limit=%d audit_backlog_limit=%d\n",
L
Linus Torvalds 已提交
223 224 225 226 227 228 229
		       atomic_read(&audit_lost),
		       audit_rate_limit,
		       audit_backlog_limit);
		audit_panic(message);
	}
}

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

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

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

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

A
Adrian Bunk 已提交
276
static int kauditd_thread(void *dummy)
277 278 279 280 281
{
	struct sk_buff *skb;

	while (1) {
		skb = skb_dequeue(&audit_skb_queue);
282
		wake_up(&audit_backlog_wait);
283 284 285 286 287 288 289 290 291
		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 {
292
				printk(KERN_NOTICE "%s\n", skb->data + NLMSG_SPACE(0));
293 294 295 296 297 298 299
				kfree_skb(skb);
			}
		} else {
			DECLARE_WAITQUEUE(wait, current);
			set_current_state(TASK_INTERRUPTIBLE);
			add_wait_queue(&kauditd_wait, &wait);

300 301
			if (!skb_queue_len(&audit_skb_queue)) {
				try_to_freeze();
302
				schedule();
303
			}
304 305 306 307 308

			__set_current_state(TASK_RUNNING);
			remove_wait_queue(&kauditd_wait, &wait);
		}
	}
309
	return 0;
310 311
}

312 313 314 315 316 317 318 319 320 321 322 323 324
/**
 * 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 已提交
325 326 327 328 329 330 331 332 333 334 335 336
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)
337
		return;
L
Linus Torvalds 已提交
338

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

	/* 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 已提交
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
	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:
365
	case AUDIT_LIST_RULES:
L
Linus Torvalds 已提交
366 367
	case AUDIT_SET:
	case AUDIT_ADD:
368
	case AUDIT_ADD_RULE:
L
Linus Torvalds 已提交
369
	case AUDIT_DEL:
370
	case AUDIT_DEL_RULE:
371
	case AUDIT_SIGNAL_INFO:
L
Linus Torvalds 已提交
372 373 374
		if (!cap_raised(eff_cap, CAP_AUDIT_CONTROL))
			err = -EPERM;
		break;
375
	case AUDIT_USER:
376
	case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
377
	case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
L
Linus Torvalds 已提交
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
		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)
{
	u32			uid, pid, seq;
	void			*data;
	struct audit_status	*status_get, status_set;
	int			err;
394
	struct audit_buffer	*ab;
L
Linus Torvalds 已提交
395
	u16			msg_type = nlh->nlmsg_type;
396
	uid_t			loginuid; /* loginuid of sender */
397
	struct audit_sig_info   sig_data;
L
Linus Torvalds 已提交
398 399 400 401 402

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

403 404
	/* As soon as there's any sign of userspace auditd,
	 * start kauditd to talk to it */
405 406 407 408 409 410 411 412
	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 已提交
413 414
	pid  = NETLINK_CREDS(skb)->pid;
	uid  = NETLINK_CREDS(skb)->uid;
415
	loginuid = NETLINK_CB(skb).loginuid;
L
Linus Torvalds 已提交
416 417 418 419 420 421 422 423 424 425 426
	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);
427
		status_set.backlog	 = skb_queue_len(&audit_skb_queue);
L
Linus Torvalds 已提交
428 429 430 431 432 433 434 435
		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) {
436
			err = audit_set_enabled(status_get->enabled, loginuid);
L
Linus Torvalds 已提交
437 438 439
			if (err < 0) return err;
		}
		if (status_get->mask & AUDIT_STATUS_FAILURE) {
440
			err = audit_set_failure(status_get->failure, loginuid);
L
Linus Torvalds 已提交
441 442 443 444 445
			if (err < 0) return err;
		}
		if (status_get->mask & AUDIT_STATUS_PID) {
			int old   = audit_pid;
			audit_pid = status_get->pid;
446
			audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE,
447
				"audit_pid=%d old=%d by auid=%u",
448
				  audit_pid, old, loginuid);
L
Linus Torvalds 已提交
449 450
		}
		if (status_get->mask & AUDIT_STATUS_RATE_LIMIT)
451
			audit_set_rate_limit(status_get->rate_limit, loginuid);
L
Linus Torvalds 已提交
452
		if (status_get->mask & AUDIT_STATUS_BACKLOG_LIMIT)
453 454
			audit_set_backlog_limit(status_get->backlog_limit,
							loginuid);
L
Linus Torvalds 已提交
455
		break;
456
	case AUDIT_USER:
457
	case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG:
458
	case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2:
459 460 461
		if (!audit_enabled && msg_type != AUDIT_USER_AVC)
			return 0;

462
		err = audit_filter_user(&NETLINK_CB(skb), msg_type);
463 464
		if (err == 1) {
			err = 0;
465
			ab = audit_log_start(NULL, GFP_KERNEL, msg_type);
466 467 468 469 470 471 472
			if (ab) {
				audit_log_format(ab,
						 "user pid=%d uid=%u auid=%u msg='%.1024s'",
						 pid, uid, loginuid, (char *)data);
				audit_set_pid(ab, pid);
				audit_log_end(ab);
			}
473
		}
L
Linus Torvalds 已提交
474 475 476
		break;
	case AUDIT_ADD:
	case AUDIT_DEL:
477
		if (nlmsg_len(nlh) < sizeof(struct audit_rule))
L
Linus Torvalds 已提交
478 479 480 481
			return -EINVAL;
		/* fallthrough */
	case AUDIT_LIST:
		err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid,
482 483 484 485 486 487 488 489 490 491 492 493
					   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 已提交
494
		break;
495 496 497 498 499 500
	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 已提交
501 502 503 504 505 506 507 508
	default:
		err = -EINVAL;
		break;
	}

	return err < 0 ? err : 0;
}

509 510
/*
 * Get message from skb (based on rtnetlink_rcv_skb).  Each message is
L
Linus Torvalds 已提交
511
 * processed by audit_receive_msg.  Malformed skbs with wrong length are
512 513
 * discarded silently.
 */
514
static void audit_receive_skb(struct sk_buff *skb)
L
Linus Torvalds 已提交
515 516 517 518 519 520 521 522
{
	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)
523
			return;
L
Linus Torvalds 已提交
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
		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;
539
	unsigned int qlen;
L
Linus Torvalds 已提交
540

541
	mutex_lock(&audit_netlink_mutex);
L
Linus Torvalds 已提交
542

543 544 545 546
	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 已提交
547
	}
548
	mutex_unlock(&audit_netlink_mutex);
L
Linus Torvalds 已提交
549 550 551 552 553 554 555 556
}


/* 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");
557
	audit_sock = netlink_kernel_create(NETLINK_AUDIT, 0, audit_receive,
558
					   THIS_MODULE);
L
Linus Torvalds 已提交
559 560
	if (!audit_sock)
		audit_panic("cannot initialize netlink socket");
561 562
	else
		audit_sock->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT;
L
Linus Torvalds 已提交
563

564
	skb_queue_head_init(&audit_skb_queue);
L
Linus Torvalds 已提交
565 566
	audit_initialized = 1;
	audit_enabled = audit_default;
567
	audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL, "initialized");
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
	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;
	return 0;
}

__setup("audit=", audit_enable);

586 587 588 589
static void audit_buffer_free(struct audit_buffer *ab)
{
	unsigned long flags;

590 591 592
	if (!ab)
		return;

593 594
	if (ab->skb)
		kfree_skb(ab->skb);
595

596 597 598 599 600 601 602 603
	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);
}

604
static struct audit_buffer * audit_buffer_alloc(struct audit_context *ctx,
A
Al Viro 已提交
605
						gfp_t gfp_mask, int type)
606 607 608
{
	unsigned long flags;
	struct audit_buffer *ab = NULL;
609
	struct nlmsghdr *nlh;
610 611 612 613 614 615 616 617 618 619 620

	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) {
621
		ab = kmalloc(sizeof(*ab), gfp_mask);
622
		if (!ab)
623
			goto err;
624
	}
625

626
	ab->skb = alloc_skb(AUDIT_BUFSIZ, gfp_mask);
627
	if (!ab->skb)
628 629
		goto err;

630
	ab->ctx = ctx;
631
	ab->gfp_mask = gfp_mask;
632 633 634 635 636
	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;
637
	return ab;
638 639 640
err:
	audit_buffer_free(ab);
	return NULL;
641
}
L
Linus Torvalds 已提交
642

643 644 645 646
/**
 * audit_serial - compute a serial number for the audit record
 *
 * Compute a serial number for the audit record.  Audit records are
647 648 649 650 651 652 653 654 655 656 657
 * 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
658 659
 * halts).
 */
660 661
unsigned int audit_serial(void)
{
662 663 664 665 666
	static spinlock_t serial_lock = SPIN_LOCK_UNLOCKED;
	static unsigned int serial = 0;

	unsigned long flags;
	unsigned int ret;
667

668
	spin_lock_irqsave(&serial_lock, flags);
669
	do {
670 671
		ret = ++serial;
	} while (unlikely(!ret));
672
	spin_unlock_irqrestore(&serial_lock, flags);
673

674
	return ret;
675 676 677 678 679 680 681 682 683 684 685 686 687
}

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 已提交
688 689 690 691 692 693
/* 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. */
694

695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
/**
 * 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 已提交
710
struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
711
				     int type)
L
Linus Torvalds 已提交
712 713 714
{
	struct audit_buffer	*ab	= NULL;
	struct timespec		t;
715
	unsigned int		serial;
716
	int reserve;
717
	unsigned long timeout_start = jiffies;
L
Linus Torvalds 已提交
718 719 720 721

	if (!audit_initialized)
		return NULL;

722 723 724
	if (unlikely(audit_filter_type(type)))
		return NULL;

725 726 727 728 729 730 731 732
	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) {
733 734 735
		if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time
		    && time_before(jiffies, timeout_start + audit_backlog_wait_time)) {

736 737 738 739 740 741 742
			/* 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)
743
				schedule_timeout(timeout_start + audit_backlog_wait_time - jiffies);
744 745 746

			__set_current_state(TASK_RUNNING);
			remove_wait_queue(&audit_backlog_wait, &wait);
747
			continue;
748
		}
749 750 751 752 753 754 755
		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");
756 757
		audit_backlog_wait_time = audit_backlog_wait_overflow;
		wake_up(&audit_backlog_wait);
758 759 760
		return NULL;
	}

761
	ab = audit_buffer_alloc(ctx, gfp_mask, type);
L
Linus Torvalds 已提交
762 763 764 765 766
	if (!ab) {
		audit_log_lost("out of memory in audit_log_start");
		return NULL;
	}

767
	audit_get_stamp(ab->ctx, &t, &serial);
768

L
Linus Torvalds 已提交
769 770 771 772 773
	audit_log_format(ab, "audit(%lu.%03lu:%u): ",
			 t.tv_sec, t.tv_nsec/1000000, serial);
	return ab;
}

774
/**
775
 * audit_expand - expand skb in the audit buffer
776
 * @ab: audit_buffer
777
 * @extra: space to add at tail of the skb
778 779 780 781
 *
 * Returns 0 (no space) on failed expansion, or available space if
 * successful.
 */
782
static inline int audit_expand(struct audit_buffer *ab, int extra)
783
{
784
	struct sk_buff *skb = ab->skb;
785
	int ret = pskb_expand_head(skb, skb_headroom(skb), extra,
786
				   ab->gfp_mask);
787 788
	if (ret < 0) {
		audit_log_lost("out of memory in audit_expand");
789
		return 0;
790 791
	}
	return skb_tailroom(skb);
792
}
L
Linus Torvalds 已提交
793

794 795
/*
 * Format an audit message into the audit buffer.  If there isn't enough
L
Linus Torvalds 已提交
796 797
 * room in the audit buffer, more room will be allocated and vsnprint
 * will be called a second time.  Currently, we assume that a printk
798 799
 * can't format message larger than 1024 bytes, so we don't either.
 */
L
Linus Torvalds 已提交
800 801 802 803
static void audit_log_vformat(struct audit_buffer *ab, const char *fmt,
			      va_list args)
{
	int len, avail;
804
	struct sk_buff *skb;
D
David Woodhouse 已提交
805
	va_list args2;
L
Linus Torvalds 已提交
806 807 808 809

	if (!ab)
		return;

810 811 812 813
	BUG_ON(!ab->skb);
	skb = ab->skb;
	avail = skb_tailroom(skb);
	if (avail == 0) {
814
		avail = audit_expand(ab, AUDIT_BUFSIZ);
815 816
		if (!avail)
			goto out;
L
Linus Torvalds 已提交
817
	}
D
David Woodhouse 已提交
818
	va_copy(args2, args);
819
	len = vsnprintf(skb->tail, avail, fmt, args);
L
Linus Torvalds 已提交
820 821 822 823
	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. */
824 825
		avail = audit_expand(ab,
			max_t(unsigned, AUDIT_BUFSIZ, 1+len-avail));
826 827
		if (!avail)
			goto out;
D
David Woodhouse 已提交
828
		len = vsnprintf(skb->tail, avail, fmt, args2);
L
Linus Torvalds 已提交
829
	}
830 831
	if (len > 0)
		skb_put(skb, len);
832 833
out:
	return;
L
Linus Torvalds 已提交
834 835
}

836 837 838 839 840 841 842 843
/**
 * 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 已提交
844 845 846 847 848 849 850 851 852 853 854
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);
}

855 856 857 858 859 860 861 862 863 864 865 866
/**
 * 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,
867
		size_t len)
868
{
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
	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;
	}
885

886 887 888 889 890 891 892
	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 */
893 894
}

895 896 897 898 899 900 901
/**
 * 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,
902
 * or a space. Unescaped strings will start and end with a double quote mark.
903 904
 * Strings that are escaped are printed in hex (2 digits per char).
 */
905 906
void audit_log_untrustedstring(struct audit_buffer *ab, const char *string)
{
907
	const unsigned char *p = string;
908 909

	while (*p) {
910
		if (*p == '"' || *p < 0x21 || *p > 0x7f) {
911 912 913 914 915 916 917 918
			audit_log_hex(ab, string, strlen(string));
			return;
		}
		p++;
	}
	audit_log_format(ab, "\"%s\"", string);
}

919
/* This is a helper-function to print the escaped d_path */
L
Linus Torvalds 已提交
920 921 922
void audit_log_d_path(struct audit_buffer *ab, const char *prefix,
		      struct dentry *dentry, struct vfsmount *vfsmnt)
{
923
	char *p, *path;
L
Linus Torvalds 已提交
924

925 926
	if (prefix)
		audit_log_format(ab, " %s", prefix);
L
Linus Torvalds 已提交
927

928
	/* We will allow 11 spaces for ' (deleted)' to be appended */
929
	path = kmalloc(PATH_MAX+11, ab->gfp_mask);
930 931 932
	if (!path) {
		audit_log_format(ab, "<no memory>");
		return;
L
Linus Torvalds 已提交
933
	}
934 935 936 937 938 939 940
	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 已提交
941 942
}

943 944 945 946 947 948
/**
 * 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 已提交
949
 * remove them from the queue outside the irq context.  May be called in
950 951
 * any context.
 */
952
void audit_log_end(struct audit_buffer *ab)
L
Linus Torvalds 已提交
953 954 955 956 957 958
{
	if (!ab)
		return;
	if (!audit_rate_check()) {
		audit_log_lost("rate limit exceeded");
	} else {
959 960 961 962 963 964 965
		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 {
966
			printk(KERN_NOTICE "%s\n", ab->skb->data + NLMSG_SPACE(0));
967
		}
L
Linus Torvalds 已提交
968
	}
969
	audit_buffer_free(ab);
L
Linus Torvalds 已提交
970 971
}

972 973 974 975 976 977 978 979 980 981 982 983
/**
 * 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 已提交
984
void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type, 
985
	       const char *fmt, ...)
L
Linus Torvalds 已提交
986 987 988 989
{
	struct audit_buffer *ab;
	va_list args;

990
	ab = audit_log_start(ctx, gfp_mask, type);
L
Linus Torvalds 已提交
991 992 993 994 995 996 997
	if (ab) {
		va_start(args, fmt);
		audit_log_vformat(ab, fmt, args);
		va_end(args);
		audit_log_end(ab);
	}
}
998 999 1000 1001 1002

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