OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [kernel/] [auditsc.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* auditsc.c -- System-call auditing support
2
 * Handles all system-call specific auditing features.
3
 *
4
 * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
5
 * Copyright 2005 Hewlett-Packard Development Company, L.P.
6
 * Copyright (C) 2005, 2006 IBM Corporation
7
 * All Rights Reserved.
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 *
23
 * Written by Rickard E. (Rik) Faith <faith@redhat.com>
24
 *
25
 * Many of the ideas implemented here are from Stephen C. Tweedie,
26
 * especially the idea of avoiding a copy by using getname.
27
 *
28
 * The method for actual interception of syscall entry and exit (not in
29
 * this file -- see entry.S) is based on a GPL'd patch written by
30
 * okir@suse.de and Copyright 2003 SuSE Linux AG.
31
 *
32
 * POSIX message queue support added by George Wilson <ltcgcw@us.ibm.com>,
33
 * 2006.
34
 *
35
 * The support of additional filter rules compares (>, <, >=, <=) was
36
 * added by Dustin Kirkland <dustin.kirkland@us.ibm.com>, 2005.
37
 *
38
 * Modified by Amy Griffis <amy.griffis@hp.com> to collect additional
39
 * filesystem information.
40
 *
41
 * Subject and object context labeling support added by <danjones@us.ibm.com>
42
 * and <dustin.kirkland@us.ibm.com> for LSPP certification compliance.
43
 */
44
 
45
#include <linux/init.h>
46
#include <asm/types.h>
47
#include <asm/atomic.h>
48
#include <linux/fs.h>
49
#include <linux/namei.h>
50
#include <linux/mm.h>
51
#include <linux/module.h>
52
#include <linux/mount.h>
53
#include <linux/socket.h>
54
#include <linux/mqueue.h>
55
#include <linux/audit.h>
56
#include <linux/personality.h>
57
#include <linux/time.h>
58
#include <linux/netlink.h>
59
#include <linux/compiler.h>
60
#include <asm/unistd.h>
61
#include <linux/security.h>
62
#include <linux/list.h>
63
#include <linux/tty.h>
64
#include <linux/selinux.h>
65
#include <linux/binfmts.h>
66
#include <linux/highmem.h>
67
#include <linux/syscalls.h>
68
#include <linux/inotify.h>
69
 
70
#include "audit.h"
71
 
72
extern struct list_head audit_filter_list[];
73
 
74
/* AUDIT_NAMES is the number of slots we reserve in the audit_context
75
 * for saving names from getname(). */
76
#define AUDIT_NAMES    20
77
 
78
/* Indicates that audit should log the full pathname. */
79
#define AUDIT_NAME_FULL -1
80
 
81
/* number of audit rules */
82
int audit_n_rules;
83
 
84
/* determines whether we collect data for signals sent */
85
int audit_signals;
86
 
87
/* When fs/namei.c:getname() is called, we store the pointer in name and
88
 * we don't let putname() free it (instead we free all of the saved
89
 * pointers at syscall exit time).
90
 *
91
 * Further, in fs/namei.c:path_lookup() we store the inode and device. */
92
struct audit_names {
93
        const char      *name;
94
        int             name_len;       /* number of name's characters to log */
95
        unsigned        name_put;       /* call __putname() for this name */
96
        unsigned long   ino;
97
        dev_t           dev;
98
        umode_t         mode;
99
        uid_t           uid;
100
        gid_t           gid;
101
        dev_t           rdev;
102
        u32             osid;
103
};
104
 
105
struct audit_aux_data {
106
        struct audit_aux_data   *next;
107
        int                     type;
108
};
109
 
110
#define AUDIT_AUX_IPCPERM       0
111
 
112
/* Number of target pids per aux struct. */
113
#define AUDIT_AUX_PIDS  16
114
 
115
struct audit_aux_data_mq_open {
116
        struct audit_aux_data   d;
117
        int                     oflag;
118
        mode_t                  mode;
119
        struct mq_attr          attr;
120
};
121
 
122
struct audit_aux_data_mq_sendrecv {
123
        struct audit_aux_data   d;
124
        mqd_t                   mqdes;
125
        size_t                  msg_len;
126
        unsigned int            msg_prio;
127
        struct timespec         abs_timeout;
128
};
129
 
130
struct audit_aux_data_mq_notify {
131
        struct audit_aux_data   d;
132
        mqd_t                   mqdes;
133
        struct sigevent         notification;
134
};
135
 
136
struct audit_aux_data_mq_getsetattr {
137
        struct audit_aux_data   d;
138
        mqd_t                   mqdes;
139
        struct mq_attr          mqstat;
140
};
141
 
142
struct audit_aux_data_ipcctl {
143
        struct audit_aux_data   d;
144
        struct ipc_perm         p;
145
        unsigned long           qbytes;
146
        uid_t                   uid;
147
        gid_t                   gid;
148
        mode_t                  mode;
149
        u32                     osid;
150
};
151
 
152
struct audit_aux_data_execve {
153
        struct audit_aux_data   d;
154
        int argc;
155
        int envc;
156
        struct mm_struct *mm;
157
};
158
 
159
struct audit_aux_data_socketcall {
160
        struct audit_aux_data   d;
161
        int                     nargs;
162
        unsigned long           args[0];
163
};
164
 
165
struct audit_aux_data_sockaddr {
166
        struct audit_aux_data   d;
167
        int                     len;
168
        char                    a[0];
169
};
170
 
171
struct audit_aux_data_fd_pair {
172
        struct  audit_aux_data d;
173
        int     fd[2];
174
};
175
 
176
struct audit_aux_data_pids {
177
        struct audit_aux_data   d;
178
        pid_t                   target_pid[AUDIT_AUX_PIDS];
179
        u32                     target_sid[AUDIT_AUX_PIDS];
180
        int                     pid_count;
181
};
182
 
183
struct audit_tree_refs {
184
        struct audit_tree_refs *next;
185
        struct audit_chunk *c[31];
186
};
187
 
188
/* The per-task audit context. */
189
struct audit_context {
190
        int                 dummy;      /* must be the first element */
191
        int                 in_syscall; /* 1 if task is in a syscall */
192
        enum audit_state    state;
193
        unsigned int        serial;     /* serial number for record */
194
        struct timespec     ctime;      /* time of syscall entry */
195
        uid_t               loginuid;   /* login uid (identity) */
196
        int                 major;      /* syscall number */
197
        unsigned long       argv[4];    /* syscall arguments */
198
        int                 return_valid; /* return code is valid */
199
        long                return_code;/* syscall return code */
200
        int                 auditable;  /* 1 if record should be written */
201
        int                 name_count;
202
        struct audit_names  names[AUDIT_NAMES];
203
        char *              filterkey;  /* key for rule that triggered record */
204
        struct dentry *     pwd;
205
        struct vfsmount *   pwdmnt;
206
        struct audit_context *previous; /* For nested syscalls */
207
        struct audit_aux_data *aux;
208
        struct audit_aux_data *aux_pids;
209
 
210
                                /* Save things to print about task_struct */
211
        pid_t               pid, ppid;
212
        uid_t               uid, euid, suid, fsuid;
213
        gid_t               gid, egid, sgid, fsgid;
214
        unsigned long       personality;
215
        int                 arch;
216
 
217
        pid_t               target_pid;
218
        u32                 target_sid;
219
 
220
        struct audit_tree_refs *trees, *first_trees;
221
        int tree_count;
222
 
223
#if AUDIT_DEBUG
224
        int                 put_count;
225
        int                 ino_count;
226
#endif
227
};
228
 
229
#define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE])
230
static inline int open_arg(int flags, int mask)
231
{
232
        int n = ACC_MODE(flags);
233
        if (flags & (O_TRUNC | O_CREAT))
234
                n |= AUDIT_PERM_WRITE;
235
        return n & mask;
236
}
237
 
238
static int audit_match_perm(struct audit_context *ctx, int mask)
239
{
240
        unsigned n = ctx->major;
241
        switch (audit_classify_syscall(ctx->arch, n)) {
242
        case 0:  /* native */
243
                if ((mask & AUDIT_PERM_WRITE) &&
244
                     audit_match_class(AUDIT_CLASS_WRITE, n))
245
                        return 1;
246
                if ((mask & AUDIT_PERM_READ) &&
247
                     audit_match_class(AUDIT_CLASS_READ, n))
248
                        return 1;
249
                if ((mask & AUDIT_PERM_ATTR) &&
250
                     audit_match_class(AUDIT_CLASS_CHATTR, n))
251
                        return 1;
252
                return 0;
253
        case 1: /* 32bit on biarch */
254
                if ((mask & AUDIT_PERM_WRITE) &&
255
                     audit_match_class(AUDIT_CLASS_WRITE_32, n))
256
                        return 1;
257
                if ((mask & AUDIT_PERM_READ) &&
258
                     audit_match_class(AUDIT_CLASS_READ_32, n))
259
                        return 1;
260
                if ((mask & AUDIT_PERM_ATTR) &&
261
                     audit_match_class(AUDIT_CLASS_CHATTR_32, n))
262
                        return 1;
263
                return 0;
264
        case 2: /* open */
265
                return mask & ACC_MODE(ctx->argv[1]);
266
        case 3: /* openat */
267
                return mask & ACC_MODE(ctx->argv[2]);
268
        case 4: /* socketcall */
269
                return ((mask & AUDIT_PERM_WRITE) && ctx->argv[0] == SYS_BIND);
270
        case 5: /* execve */
271
                return mask & AUDIT_PERM_EXEC;
272
        default:
273
                return 0;
274
        }
275
}
276
 
277
/*
278
 * We keep a linked list of fixed-sized (31 pointer) arrays of audit_chunk *;
279
 * ->first_trees points to its beginning, ->trees - to the current end of data.
280
 * ->tree_count is the number of free entries in array pointed to by ->trees.
281
 * Original condition is (NULL, NULL, 0); as soon as it grows we never revert to NULL,
282
 * "empty" becomes (p, p, 31) afterwards.  We don't shrink the list (and seriously,
283
 * it's going to remain 1-element for almost any setup) until we free context itself.
284
 * References in it _are_ dropped - at the same time we free/drop aux stuff.
285
 */
286
 
287
#ifdef CONFIG_AUDIT_TREE
288
static int put_tree_ref(struct audit_context *ctx, struct audit_chunk *chunk)
289
{
290
        struct audit_tree_refs *p = ctx->trees;
291
        int left = ctx->tree_count;
292
        if (likely(left)) {
293
                p->c[--left] = chunk;
294
                ctx->tree_count = left;
295
                return 1;
296
        }
297
        if (!p)
298
                return 0;
299
        p = p->next;
300
        if (p) {
301
                p->c[30] = chunk;
302
                ctx->trees = p;
303
                ctx->tree_count = 30;
304
                return 1;
305
        }
306
        return 0;
307
}
308
 
309
static int grow_tree_refs(struct audit_context *ctx)
310
{
311
        struct audit_tree_refs *p = ctx->trees;
312
        ctx->trees = kzalloc(sizeof(struct audit_tree_refs), GFP_KERNEL);
313
        if (!ctx->trees) {
314
                ctx->trees = p;
315
                return 0;
316
        }
317
        if (p)
318
                p->next = ctx->trees;
319
        else
320
                ctx->first_trees = ctx->trees;
321
        ctx->tree_count = 31;
322
        return 1;
323
}
324
#endif
325
 
326
static void unroll_tree_refs(struct audit_context *ctx,
327
                      struct audit_tree_refs *p, int count)
328
{
329
#ifdef CONFIG_AUDIT_TREE
330
        struct audit_tree_refs *q;
331
        int n;
332
        if (!p) {
333
                /* we started with empty chain */
334
                p = ctx->first_trees;
335
                count = 31;
336
                /* if the very first allocation has failed, nothing to do */
337
                if (!p)
338
                        return;
339
        }
340
        n = count;
341
        for (q = p; q != ctx->trees; q = q->next, n = 31) {
342
                while (n--) {
343
                        audit_put_chunk(q->c[n]);
344
                        q->c[n] = NULL;
345
                }
346
        }
347
        while (n-- > ctx->tree_count) {
348
                audit_put_chunk(q->c[n]);
349
                q->c[n] = NULL;
350
        }
351
        ctx->trees = p;
352
        ctx->tree_count = count;
353
#endif
354
}
355
 
356
static void free_tree_refs(struct audit_context *ctx)
357
{
358
        struct audit_tree_refs *p, *q;
359
        for (p = ctx->first_trees; p; p = q) {
360
                q = p->next;
361
                kfree(p);
362
        }
363
}
364
 
365
static int match_tree_refs(struct audit_context *ctx, struct audit_tree *tree)
366
{
367
#ifdef CONFIG_AUDIT_TREE
368
        struct audit_tree_refs *p;
369
        int n;
370
        if (!tree)
371
                return 0;
372
        /* full ones */
373
        for (p = ctx->first_trees; p != ctx->trees; p = p->next) {
374
                for (n = 0; n < 31; n++)
375
                        if (audit_tree_match(p->c[n], tree))
376
                                return 1;
377
        }
378
        /* partial */
379
        if (p) {
380
                for (n = ctx->tree_count; n < 31; n++)
381
                        if (audit_tree_match(p->c[n], tree))
382
                                return 1;
383
        }
384
#endif
385
        return 0;
386
}
387
 
388
/* Determine if any context name data matches a rule's watch data */
389
/* Compare a task_struct with an audit_rule.  Return 1 on match, 0
390
 * otherwise. */
391
static int audit_filter_rules(struct task_struct *tsk,
392
                              struct audit_krule *rule,
393
                              struct audit_context *ctx,
394
                              struct audit_names *name,
395
                              enum audit_state *state)
396
{
397
        int i, j, need_sid = 1;
398
        u32 sid;
399
 
400
        for (i = 0; i < rule->field_count; i++) {
401
                struct audit_field *f = &rule->fields[i];
402
                int result = 0;
403
 
404
                switch (f->type) {
405
                case AUDIT_PID:
406
                        result = audit_comparator(tsk->pid, f->op, f->val);
407
                        break;
408
                case AUDIT_PPID:
409
                        if (ctx) {
410
                                if (!ctx->ppid)
411
                                        ctx->ppid = sys_getppid();
412
                                result = audit_comparator(ctx->ppid, f->op, f->val);
413
                        }
414
                        break;
415
                case AUDIT_UID:
416
                        result = audit_comparator(tsk->uid, f->op, f->val);
417
                        break;
418
                case AUDIT_EUID:
419
                        result = audit_comparator(tsk->euid, f->op, f->val);
420
                        break;
421
                case AUDIT_SUID:
422
                        result = audit_comparator(tsk->suid, f->op, f->val);
423
                        break;
424
                case AUDIT_FSUID:
425
                        result = audit_comparator(tsk->fsuid, f->op, f->val);
426
                        break;
427
                case AUDIT_GID:
428
                        result = audit_comparator(tsk->gid, f->op, f->val);
429
                        break;
430
                case AUDIT_EGID:
431
                        result = audit_comparator(tsk->egid, f->op, f->val);
432
                        break;
433
                case AUDIT_SGID:
434
                        result = audit_comparator(tsk->sgid, f->op, f->val);
435
                        break;
436
                case AUDIT_FSGID:
437
                        result = audit_comparator(tsk->fsgid, f->op, f->val);
438
                        break;
439
                case AUDIT_PERS:
440
                        result = audit_comparator(tsk->personality, f->op, f->val);
441
                        break;
442
                case AUDIT_ARCH:
443
                        if (ctx)
444
                                result = audit_comparator(ctx->arch, f->op, f->val);
445
                        break;
446
 
447
                case AUDIT_EXIT:
448
                        if (ctx && ctx->return_valid)
449
                                result = audit_comparator(ctx->return_code, f->op, f->val);
450
                        break;
451
                case AUDIT_SUCCESS:
452
                        if (ctx && ctx->return_valid) {
453
                                if (f->val)
454
                                        result = audit_comparator(ctx->return_valid, f->op, AUDITSC_SUCCESS);
455
                                else
456
                                        result = audit_comparator(ctx->return_valid, f->op, AUDITSC_FAILURE);
457
                        }
458
                        break;
459
                case AUDIT_DEVMAJOR:
460
                        if (name)
461
                                result = audit_comparator(MAJOR(name->dev),
462
                                                          f->op, f->val);
463
                        else if (ctx) {
464
                                for (j = 0; j < ctx->name_count; j++) {
465
                                        if (audit_comparator(MAJOR(ctx->names[j].dev),  f->op, f->val)) {
466
                                                ++result;
467
                                                break;
468
                                        }
469
                                }
470
                        }
471
                        break;
472
                case AUDIT_DEVMINOR:
473
                        if (name)
474
                                result = audit_comparator(MINOR(name->dev),
475
                                                          f->op, f->val);
476
                        else if (ctx) {
477
                                for (j = 0; j < ctx->name_count; j++) {
478
                                        if (audit_comparator(MINOR(ctx->names[j].dev), f->op, f->val)) {
479
                                                ++result;
480
                                                break;
481
                                        }
482
                                }
483
                        }
484
                        break;
485
                case AUDIT_INODE:
486
                        if (name)
487
                                result = (name->ino == f->val);
488
                        else if (ctx) {
489
                                for (j = 0; j < ctx->name_count; j++) {
490
                                        if (audit_comparator(ctx->names[j].ino, f->op, f->val)) {
491
                                                ++result;
492
                                                break;
493
                                        }
494
                                }
495
                        }
496
                        break;
497
                case AUDIT_WATCH:
498
                        if (name && rule->watch->ino != (unsigned long)-1)
499
                                result = (name->dev == rule->watch->dev &&
500
                                          name->ino == rule->watch->ino);
501
                        break;
502
                case AUDIT_DIR:
503
                        if (ctx)
504
                                result = match_tree_refs(ctx, rule->tree);
505
                        break;
506
                case AUDIT_LOGINUID:
507
                        result = 0;
508
                        if (ctx)
509
                                result = audit_comparator(ctx->loginuid, f->op, f->val);
510
                        break;
511
                case AUDIT_SUBJ_USER:
512
                case AUDIT_SUBJ_ROLE:
513
                case AUDIT_SUBJ_TYPE:
514
                case AUDIT_SUBJ_SEN:
515
                case AUDIT_SUBJ_CLR:
516
                        /* NOTE: this may return negative values indicating
517
                           a temporary error.  We simply treat this as a
518
                           match for now to avoid losing information that
519
                           may be wanted.   An error message will also be
520
                           logged upon error */
521
                        if (f->se_rule) {
522
                                if (need_sid) {
523
                                        selinux_get_task_sid(tsk, &sid);
524
                                        need_sid = 0;
525
                                }
526
                                result = selinux_audit_rule_match(sid, f->type,
527
                                                                  f->op,
528
                                                                  f->se_rule,
529
                                                                  ctx);
530
                        }
531
                        break;
532
                case AUDIT_OBJ_USER:
533
                case AUDIT_OBJ_ROLE:
534
                case AUDIT_OBJ_TYPE:
535
                case AUDIT_OBJ_LEV_LOW:
536
                case AUDIT_OBJ_LEV_HIGH:
537
                        /* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR
538
                           also applies here */
539
                        if (f->se_rule) {
540
                                /* Find files that match */
541
                                if (name) {
542
                                        result = selinux_audit_rule_match(
543
                                                   name->osid, f->type, f->op,
544
                                                   f->se_rule, ctx);
545
                                } else if (ctx) {
546
                                        for (j = 0; j < ctx->name_count; j++) {
547
                                                if (selinux_audit_rule_match(
548
                                                      ctx->names[j].osid,
549
                                                      f->type, f->op,
550
                                                      f->se_rule, ctx)) {
551
                                                        ++result;
552
                                                        break;
553
                                                }
554
                                        }
555
                                }
556
                                /* Find ipc objects that match */
557
                                if (ctx) {
558
                                        struct audit_aux_data *aux;
559
                                        for (aux = ctx->aux; aux;
560
                                             aux = aux->next) {
561
                                                if (aux->type == AUDIT_IPC) {
562
                                                        struct audit_aux_data_ipcctl *axi = (void *)aux;
563
                                                        if (selinux_audit_rule_match(axi->osid, f->type, f->op, f->se_rule, ctx)) {
564
                                                                ++result;
565
                                                                break;
566
                                                        }
567
                                                }
568
                                        }
569
                                }
570
                        }
571
                        break;
572
                case AUDIT_ARG0:
573
                case AUDIT_ARG1:
574
                case AUDIT_ARG2:
575
                case AUDIT_ARG3:
576
                        if (ctx)
577
                                result = audit_comparator(ctx->argv[f->type-AUDIT_ARG0], f->op, f->val);
578
                        break;
579
                case AUDIT_FILTERKEY:
580
                        /* ignore this field for filtering */
581
                        result = 1;
582
                        break;
583
                case AUDIT_PERM:
584
                        result = audit_match_perm(ctx, f->val);
585
                        break;
586
                }
587
 
588
                if (!result)
589
                        return 0;
590
        }
591
        if (rule->filterkey)
592
                ctx->filterkey = kstrdup(rule->filterkey, GFP_ATOMIC);
593
        switch (rule->action) {
594
        case AUDIT_NEVER:    *state = AUDIT_DISABLED;       break;
595
        case AUDIT_ALWAYS:   *state = AUDIT_RECORD_CONTEXT; break;
596
        }
597
        return 1;
598
}
599
 
600
/* At process creation time, we can determine if system-call auditing is
601
 * completely disabled for this task.  Since we only have the task
602
 * structure at this point, we can only check uid and gid.
603
 */
604
static enum audit_state audit_filter_task(struct task_struct *tsk)
605
{
606
        struct audit_entry *e;
607
        enum audit_state   state;
608
 
609
        rcu_read_lock();
610
        list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TASK], list) {
611
                if (audit_filter_rules(tsk, &e->rule, NULL, NULL, &state)) {
612
                        rcu_read_unlock();
613
                        return state;
614
                }
615
        }
616
        rcu_read_unlock();
617
        return AUDIT_BUILD_CONTEXT;
618
}
619
 
620
/* At syscall entry and exit time, this filter is called if the
621
 * audit_state is not low enough that auditing cannot take place, but is
622
 * also not high enough that we already know we have to write an audit
623
 * record (i.e., the state is AUDIT_SETUP_CONTEXT or AUDIT_BUILD_CONTEXT).
624
 */
625
static enum audit_state audit_filter_syscall(struct task_struct *tsk,
626
                                             struct audit_context *ctx,
627
                                             struct list_head *list)
628
{
629
        struct audit_entry *e;
630
        enum audit_state state;
631
 
632
        if (audit_pid && tsk->tgid == audit_pid)
633
                return AUDIT_DISABLED;
634
 
635
        rcu_read_lock();
636
        if (!list_empty(list)) {
637
                int word = AUDIT_WORD(ctx->major);
638
                int bit  = AUDIT_BIT(ctx->major);
639
 
640
                list_for_each_entry_rcu(e, list, list) {
641
                        if ((e->rule.mask[word] & bit) == bit &&
642
                            audit_filter_rules(tsk, &e->rule, ctx, NULL,
643
                                               &state)) {
644
                                rcu_read_unlock();
645
                                return state;
646
                        }
647
                }
648
        }
649
        rcu_read_unlock();
650
        return AUDIT_BUILD_CONTEXT;
651
}
652
 
653
/* At syscall exit time, this filter is called if any audit_names[] have been
654
 * collected during syscall processing.  We only check rules in sublists at hash
655
 * buckets applicable to the inode numbers in audit_names[].
656
 * Regarding audit_state, same rules apply as for audit_filter_syscall().
657
 */
658
enum audit_state audit_filter_inodes(struct task_struct *tsk,
659
                                     struct audit_context *ctx)
660
{
661
        int i;
662
        struct audit_entry *e;
663
        enum audit_state state;
664
 
665
        if (audit_pid && tsk->tgid == audit_pid)
666
                return AUDIT_DISABLED;
667
 
668
        rcu_read_lock();
669
        for (i = 0; i < ctx->name_count; i++) {
670
                int word = AUDIT_WORD(ctx->major);
671
                int bit  = AUDIT_BIT(ctx->major);
672
                struct audit_names *n = &ctx->names[i];
673
                int h = audit_hash_ino((u32)n->ino);
674
                struct list_head *list = &audit_inode_hash[h];
675
 
676
                if (list_empty(list))
677
                        continue;
678
 
679
                list_for_each_entry_rcu(e, list, list) {
680
                        if ((e->rule.mask[word] & bit) == bit &&
681
                            audit_filter_rules(tsk, &e->rule, ctx, n, &state)) {
682
                                rcu_read_unlock();
683
                                return state;
684
                        }
685
                }
686
        }
687
        rcu_read_unlock();
688
        return AUDIT_BUILD_CONTEXT;
689
}
690
 
691
void audit_set_auditable(struct audit_context *ctx)
692
{
693
        ctx->auditable = 1;
694
}
695
 
696
static inline struct audit_context *audit_get_context(struct task_struct *tsk,
697
                                                      int return_valid,
698
                                                      int return_code)
699
{
700
        struct audit_context *context = tsk->audit_context;
701
 
702
        if (likely(!context))
703
                return NULL;
704
        context->return_valid = return_valid;
705
        context->return_code  = return_code;
706
 
707
        if (context->in_syscall && !context->dummy && !context->auditable) {
708
                enum audit_state state;
709
 
710
                state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]);
711
                if (state == AUDIT_RECORD_CONTEXT) {
712
                        context->auditable = 1;
713
                        goto get_context;
714
                }
715
 
716
                state = audit_filter_inodes(tsk, context);
717
                if (state == AUDIT_RECORD_CONTEXT)
718
                        context->auditable = 1;
719
 
720
        }
721
 
722
get_context:
723
 
724
        tsk->audit_context = NULL;
725
        return context;
726
}
727
 
728
static inline void audit_free_names(struct audit_context *context)
729
{
730
        int i;
731
 
732
#if AUDIT_DEBUG == 2
733
        if (context->auditable
734
            ||context->put_count + context->ino_count != context->name_count) {
735
                printk(KERN_ERR "%s:%d(:%d): major=%d in_syscall=%d"
736
                       " name_count=%d put_count=%d"
737
                       " ino_count=%d [NOT freeing]\n",
738
                       __FILE__, __LINE__,
739
                       context->serial, context->major, context->in_syscall,
740
                       context->name_count, context->put_count,
741
                       context->ino_count);
742
                for (i = 0; i < context->name_count; i++) {
743
                        printk(KERN_ERR "names[%d] = %p = %s\n", i,
744
                               context->names[i].name,
745
                               context->names[i].name ?: "(null)");
746
                }
747
                dump_stack();
748
                return;
749
        }
750
#endif
751
#if AUDIT_DEBUG
752
        context->put_count  = 0;
753
        context->ino_count  = 0;
754
#endif
755
 
756
        for (i = 0; i < context->name_count; i++) {
757
                if (context->names[i].name && context->names[i].name_put)
758
                        __putname(context->names[i].name);
759
        }
760
        context->name_count = 0;
761
        if (context->pwd)
762
                dput(context->pwd);
763
        if (context->pwdmnt)
764
                mntput(context->pwdmnt);
765
        context->pwd = NULL;
766
        context->pwdmnt = NULL;
767
}
768
 
769
static inline void audit_free_aux(struct audit_context *context)
770
{
771
        struct audit_aux_data *aux;
772
 
773
        while ((aux = context->aux)) {
774
                context->aux = aux->next;
775
                kfree(aux);
776
        }
777
        while ((aux = context->aux_pids)) {
778
                context->aux_pids = aux->next;
779
                kfree(aux);
780
        }
781
}
782
 
783
static inline void audit_zero_context(struct audit_context *context,
784
                                      enum audit_state state)
785
{
786
        uid_t loginuid = context->loginuid;
787
 
788
        memset(context, 0, sizeof(*context));
789
        context->state      = state;
790
        context->loginuid   = loginuid;
791
}
792
 
793
static inline struct audit_context *audit_alloc_context(enum audit_state state)
794
{
795
        struct audit_context *context;
796
 
797
        if (!(context = kmalloc(sizeof(*context), GFP_KERNEL)))
798
                return NULL;
799
        audit_zero_context(context, state);
800
        return context;
801
}
802
 
803
/**
804
 * audit_alloc - allocate an audit context block for a task
805
 * @tsk: task
806
 *
807
 * Filter on the task information and allocate a per-task audit context
808
 * if necessary.  Doing so turns on system call auditing for the
809
 * specified task.  This is called from copy_process, so no lock is
810
 * needed.
811
 */
812
int audit_alloc(struct task_struct *tsk)
813
{
814
        struct audit_context *context;
815
        enum audit_state     state;
816
 
817
        if (likely(!audit_enabled))
818
                return 0; /* Return if not auditing. */
819
 
820
        state = audit_filter_task(tsk);
821
        if (likely(state == AUDIT_DISABLED))
822
                return 0;
823
 
824
        if (!(context = audit_alloc_context(state))) {
825
                audit_log_lost("out of memory in audit_alloc");
826
                return -ENOMEM;
827
        }
828
 
829
                                /* Preserve login uid */
830
        context->loginuid = -1;
831
        if (current->audit_context)
832
                context->loginuid = current->audit_context->loginuid;
833
 
834
        tsk->audit_context  = context;
835
        set_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
836
        return 0;
837
}
838
 
839
static inline void audit_free_context(struct audit_context *context)
840
{
841
        struct audit_context *previous;
842
        int                  count = 0;
843
 
844
        do {
845
                previous = context->previous;
846
                if (previous || (count &&  count < 10)) {
847
                        ++count;
848
                        printk(KERN_ERR "audit(:%d): major=%d name_count=%d:"
849
                               " freeing multiple contexts (%d)\n",
850
                               context->serial, context->major,
851
                               context->name_count, count);
852
                }
853
                audit_free_names(context);
854
                unroll_tree_refs(context, NULL, 0);
855
                free_tree_refs(context);
856
                audit_free_aux(context);
857
                kfree(context->filterkey);
858
                kfree(context);
859
                context  = previous;
860
        } while (context);
861
        if (count >= 10)
862
                printk(KERN_ERR "audit: freed %d contexts\n", count);
863
}
864
 
865
void audit_log_task_context(struct audit_buffer *ab)
866
{
867
        char *ctx = NULL;
868
        unsigned len;
869
        int error;
870
        u32 sid;
871
 
872
        selinux_get_task_sid(current, &sid);
873
        if (!sid)
874
                return;
875
 
876
        error = selinux_sid_to_string(sid, &ctx, &len);
877
        if (error) {
878
                if (error != -EINVAL)
879
                        goto error_path;
880
                return;
881
        }
882
 
883
        audit_log_format(ab, " subj=%s", ctx);
884
        kfree(ctx);
885
        return;
886
 
887
error_path:
888
        audit_panic("error in audit_log_task_context");
889
        return;
890
}
891
 
892
EXPORT_SYMBOL(audit_log_task_context);
893
 
894
static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
895
{
896
        char name[sizeof(tsk->comm)];
897
        struct mm_struct *mm = tsk->mm;
898
        struct vm_area_struct *vma;
899
 
900
        /* tsk == current */
901
 
902
        get_task_comm(name, tsk);
903
        audit_log_format(ab, " comm=");
904
        audit_log_untrustedstring(ab, name);
905
 
906
        if (mm) {
907
                down_read(&mm->mmap_sem);
908
                vma = mm->mmap;
909
                while (vma) {
910
                        if ((vma->vm_flags & VM_EXECUTABLE) &&
911
                            vma->vm_file) {
912
                                audit_log_d_path(ab, "exe=",
913
                                                 vma->vm_file->f_path.dentry,
914
                                                 vma->vm_file->f_path.mnt);
915
                                break;
916
                        }
917
                        vma = vma->vm_next;
918
                }
919
                up_read(&mm->mmap_sem);
920
        }
921
        audit_log_task_context(ab);
922
}
923
 
924
static int audit_log_pid_context(struct audit_context *context, pid_t pid,
925
                                 u32 sid)
926
{
927
        struct audit_buffer *ab;
928
        char *s = NULL;
929
        u32 len;
930
        int rc = 0;
931
 
932
        ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID);
933
        if (!ab)
934
                return 1;
935
 
936
        if (selinux_sid_to_string(sid, &s, &len)) {
937
                audit_log_format(ab, "opid=%d obj=(none)", pid);
938
                rc = 1;
939
        } else
940
                audit_log_format(ab, "opid=%d  obj=%s", pid, s);
941
        audit_log_end(ab);
942
        kfree(s);
943
 
944
        return rc;
945
}
946
 
947
static void audit_log_execve_info(struct audit_buffer *ab,
948
                struct audit_aux_data_execve *axi)
949
{
950
        int i;
951
        long len, ret;
952
        const char __user *p;
953
        char *buf;
954
 
955
        if (axi->mm != current->mm)
956
                return; /* execve failed, no additional info */
957
 
958
        p = (const char __user *)axi->mm->arg_start;
959
 
960
        for (i = 0; i < axi->argc; i++, p += len) {
961
                len = strnlen_user(p, MAX_ARG_STRLEN);
962
                /*
963
                 * We just created this mm, if we can't find the strings
964
                 * we just copied into it something is _very_ wrong. Similar
965
                 * for strings that are too long, we should not have created
966
                 * any.
967
                 */
968
                if (!len || len > MAX_ARG_STRLEN) {
969
                        WARN_ON(1);
970
                        send_sig(SIGKILL, current, 0);
971
                }
972
 
973
                buf = kmalloc(len, GFP_KERNEL);
974
                if (!buf) {
975
                        audit_panic("out of memory for argv string\n");
976
                        break;
977
                }
978
 
979
                ret = copy_from_user(buf, p, len);
980
                /*
981
                 * There is no reason for this copy to be short. We just
982
                 * copied them here, and the mm hasn't been exposed to user-
983
                 * space yet.
984
                 */
985
                if (ret) {
986
                        WARN_ON(1);
987
                        send_sig(SIGKILL, current, 0);
988
                }
989
 
990
                audit_log_format(ab, "a%d=", i);
991
                audit_log_untrustedstring(ab, buf);
992
                audit_log_format(ab, "\n");
993
 
994
                kfree(buf);
995
        }
996
}
997
 
998
static void audit_log_exit(struct audit_context *context, struct task_struct *tsk)
999
{
1000
        int i, call_panic = 0;
1001
        struct audit_buffer *ab;
1002
        struct audit_aux_data *aux;
1003
        const char *tty;
1004
 
1005
        /* tsk == current */
1006
        context->pid = tsk->pid;
1007
        if (!context->ppid)
1008
                context->ppid = sys_getppid();
1009
        context->uid = tsk->uid;
1010
        context->gid = tsk->gid;
1011
        context->euid = tsk->euid;
1012
        context->suid = tsk->suid;
1013
        context->fsuid = tsk->fsuid;
1014
        context->egid = tsk->egid;
1015
        context->sgid = tsk->sgid;
1016
        context->fsgid = tsk->fsgid;
1017
        context->personality = tsk->personality;
1018
 
1019
        ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL);
1020
        if (!ab)
1021
                return;         /* audit_panic has been called */
1022
        audit_log_format(ab, "arch=%x syscall=%d",
1023
                         context->arch, context->major);
1024
        if (context->personality != PER_LINUX)
1025
                audit_log_format(ab, " per=%lx", context->personality);
1026
        if (context->return_valid)
1027
                audit_log_format(ab, " success=%s exit=%ld",
1028
                                 (context->return_valid==AUDITSC_SUCCESS)?"yes":"no",
1029
                                 context->return_code);
1030
 
1031
        mutex_lock(&tty_mutex);
1032
        read_lock(&tasklist_lock);
1033
        if (tsk->signal && tsk->signal->tty && tsk->signal->tty->name)
1034
                tty = tsk->signal->tty->name;
1035
        else
1036
                tty = "(none)";
1037
        read_unlock(&tasklist_lock);
1038
        audit_log_format(ab,
1039
                  " a0=%lx a1=%lx a2=%lx a3=%lx items=%d"
1040
                  " ppid=%d pid=%d auid=%u uid=%u gid=%u"
1041
                  " euid=%u suid=%u fsuid=%u"
1042
                  " egid=%u sgid=%u fsgid=%u tty=%s",
1043
                  context->argv[0],
1044
                  context->argv[1],
1045
                  context->argv[2],
1046
                  context->argv[3],
1047
                  context->name_count,
1048
                  context->ppid,
1049
                  context->pid,
1050
                  context->loginuid,
1051
                  context->uid,
1052
                  context->gid,
1053
                  context->euid, context->suid, context->fsuid,
1054
                  context->egid, context->sgid, context->fsgid, tty);
1055
 
1056
        mutex_unlock(&tty_mutex);
1057
 
1058
        audit_log_task_info(ab, tsk);
1059
        if (context->filterkey) {
1060
                audit_log_format(ab, " key=");
1061
                audit_log_untrustedstring(ab, context->filterkey);
1062
        } else
1063
                audit_log_format(ab, " key=(null)");
1064
        audit_log_end(ab);
1065
 
1066
        for (aux = context->aux; aux; aux = aux->next) {
1067
 
1068
                ab = audit_log_start(context, GFP_KERNEL, aux->type);
1069
                if (!ab)
1070
                        continue; /* audit_panic has been called */
1071
 
1072
                switch (aux->type) {
1073
                case AUDIT_MQ_OPEN: {
1074
                        struct audit_aux_data_mq_open *axi = (void *)aux;
1075
                        audit_log_format(ab,
1076
                                "oflag=0x%x mode=%#o mq_flags=0x%lx mq_maxmsg=%ld "
1077
                                "mq_msgsize=%ld mq_curmsgs=%ld",
1078
                                axi->oflag, axi->mode, axi->attr.mq_flags,
1079
                                axi->attr.mq_maxmsg, axi->attr.mq_msgsize,
1080
                                axi->attr.mq_curmsgs);
1081
                        break; }
1082
 
1083
                case AUDIT_MQ_SENDRECV: {
1084
                        struct audit_aux_data_mq_sendrecv *axi = (void *)aux;
1085
                        audit_log_format(ab,
1086
                                "mqdes=%d msg_len=%zd msg_prio=%u "
1087
                                "abs_timeout_sec=%ld abs_timeout_nsec=%ld",
1088
                                axi->mqdes, axi->msg_len, axi->msg_prio,
1089
                                axi->abs_timeout.tv_sec, axi->abs_timeout.tv_nsec);
1090
                        break; }
1091
 
1092
                case AUDIT_MQ_NOTIFY: {
1093
                        struct audit_aux_data_mq_notify *axi = (void *)aux;
1094
                        audit_log_format(ab,
1095
                                "mqdes=%d sigev_signo=%d",
1096
                                axi->mqdes,
1097
                                axi->notification.sigev_signo);
1098
                        break; }
1099
 
1100
                case AUDIT_MQ_GETSETATTR: {
1101
                        struct audit_aux_data_mq_getsetattr *axi = (void *)aux;
1102
                        audit_log_format(ab,
1103
                                "mqdes=%d mq_flags=0x%lx mq_maxmsg=%ld mq_msgsize=%ld "
1104
                                "mq_curmsgs=%ld ",
1105
                                axi->mqdes,
1106
                                axi->mqstat.mq_flags, axi->mqstat.mq_maxmsg,
1107
                                axi->mqstat.mq_msgsize, axi->mqstat.mq_curmsgs);
1108
                        break; }
1109
 
1110
                case AUDIT_IPC: {
1111
                        struct audit_aux_data_ipcctl *axi = (void *)aux;
1112
                        audit_log_format(ab,
1113
                                 "ouid=%u ogid=%u mode=%#o",
1114
                                 axi->uid, axi->gid, axi->mode);
1115
                        if (axi->osid != 0) {
1116
                                char *ctx = NULL;
1117
                                u32 len;
1118
                                if (selinux_sid_to_string(
1119
                                                axi->osid, &ctx, &len)) {
1120
                                        audit_log_format(ab, " osid=%u",
1121
                                                        axi->osid);
1122
                                        call_panic = 1;
1123
                                } else
1124
                                        audit_log_format(ab, " obj=%s", ctx);
1125
                                kfree(ctx);
1126
                        }
1127
                        break; }
1128
 
1129
                case AUDIT_IPC_SET_PERM: {
1130
                        struct audit_aux_data_ipcctl *axi = (void *)aux;
1131
                        audit_log_format(ab,
1132
                                "qbytes=%lx ouid=%u ogid=%u mode=%#o",
1133
                                axi->qbytes, axi->uid, axi->gid, axi->mode);
1134
                        break; }
1135
 
1136
                case AUDIT_EXECVE: {
1137
                        struct audit_aux_data_execve *axi = (void *)aux;
1138
                        audit_log_execve_info(ab, axi);
1139
                        break; }
1140
 
1141
                case AUDIT_SOCKETCALL: {
1142
                        int i;
1143
                        struct audit_aux_data_socketcall *axs = (void *)aux;
1144
                        audit_log_format(ab, "nargs=%d", axs->nargs);
1145
                        for (i=0; i<axs->nargs; i++)
1146
                                audit_log_format(ab, " a%d=%lx", i, axs->args[i]);
1147
                        break; }
1148
 
1149
                case AUDIT_SOCKADDR: {
1150
                        struct audit_aux_data_sockaddr *axs = (void *)aux;
1151
 
1152
                        audit_log_format(ab, "saddr=");
1153
                        audit_log_hex(ab, axs->a, axs->len);
1154
                        break; }
1155
 
1156
                case AUDIT_FD_PAIR: {
1157
                        struct audit_aux_data_fd_pair *axs = (void *)aux;
1158
                        audit_log_format(ab, "fd0=%d fd1=%d", axs->fd[0], axs->fd[1]);
1159
                        break; }
1160
 
1161
                }
1162
                audit_log_end(ab);
1163
        }
1164
 
1165
        for (aux = context->aux_pids; aux; aux = aux->next) {
1166
                struct audit_aux_data_pids *axs = (void *)aux;
1167
                int i;
1168
 
1169
                for (i = 0; i < axs->pid_count; i++)
1170
                        if (audit_log_pid_context(context, axs->target_pid[i],
1171
                                                  axs->target_sid[i]))
1172
                                call_panic = 1;
1173
        }
1174
 
1175
        if (context->target_pid &&
1176
            audit_log_pid_context(context, context->target_pid,
1177
                                  context->target_sid))
1178
                        call_panic = 1;
1179
 
1180
        if (context->pwd && context->pwdmnt) {
1181
                ab = audit_log_start(context, GFP_KERNEL, AUDIT_CWD);
1182
                if (ab) {
1183
                        audit_log_d_path(ab, "cwd=", context->pwd, context->pwdmnt);
1184
                        audit_log_end(ab);
1185
                }
1186
        }
1187
        for (i = 0; i < context->name_count; i++) {
1188
                struct audit_names *n = &context->names[i];
1189
 
1190
                ab = audit_log_start(context, GFP_KERNEL, AUDIT_PATH);
1191
                if (!ab)
1192
                        continue; /* audit_panic has been called */
1193
 
1194
                audit_log_format(ab, "item=%d", i);
1195
 
1196
                if (n->name) {
1197
                        switch(n->name_len) {
1198
                        case AUDIT_NAME_FULL:
1199
                                /* log the full path */
1200
                                audit_log_format(ab, " name=");
1201
                                audit_log_untrustedstring(ab, n->name);
1202
                                break;
1203
                        case 0:
1204
                                /* name was specified as a relative path and the
1205
                                 * directory component is the cwd */
1206
                                audit_log_d_path(ab, " name=", context->pwd,
1207
                                                 context->pwdmnt);
1208
                                break;
1209
                        default:
1210
                                /* log the name's directory component */
1211
                                audit_log_format(ab, " name=");
1212
                                audit_log_n_untrustedstring(ab, n->name_len,
1213
                                                            n->name);
1214
                        }
1215
                } else
1216
                        audit_log_format(ab, " name=(null)");
1217
 
1218
                if (n->ino != (unsigned long)-1) {
1219
                        audit_log_format(ab, " inode=%lu"
1220
                                         " dev=%02x:%02x mode=%#o"
1221
                                         " ouid=%u ogid=%u rdev=%02x:%02x",
1222
                                         n->ino,
1223
                                         MAJOR(n->dev),
1224
                                         MINOR(n->dev),
1225
                                         n->mode,
1226
                                         n->uid,
1227
                                         n->gid,
1228
                                         MAJOR(n->rdev),
1229
                                         MINOR(n->rdev));
1230
                }
1231
                if (n->osid != 0) {
1232
                        char *ctx = NULL;
1233
                        u32 len;
1234
                        if (selinux_sid_to_string(
1235
                                n->osid, &ctx, &len)) {
1236
                                audit_log_format(ab, " osid=%u", n->osid);
1237
                                call_panic = 2;
1238
                        } else
1239
                                audit_log_format(ab, " obj=%s", ctx);
1240
                        kfree(ctx);
1241
                }
1242
 
1243
                audit_log_end(ab);
1244
        }
1245
        if (call_panic)
1246
                audit_panic("error converting sid to string");
1247
}
1248
 
1249
/**
1250
 * audit_free - free a per-task audit context
1251
 * @tsk: task whose audit context block to free
1252
 *
1253
 * Called from copy_process and do_exit
1254
 */
1255
void audit_free(struct task_struct *tsk)
1256
{
1257
        struct audit_context *context;
1258
 
1259
        context = audit_get_context(tsk, 0, 0);
1260
        if (likely(!context))
1261
                return;
1262
 
1263
        /* Check for system calls that do not go through the exit
1264
         * function (e.g., exit_group), then free context block.
1265
         * We use GFP_ATOMIC here because we might be doing this
1266
         * in the context of the idle thread */
1267
        /* that can happen only if we are called from do_exit() */
1268
        if (context->in_syscall && context->auditable)
1269
                audit_log_exit(context, tsk);
1270
 
1271
        audit_free_context(context);
1272
}
1273
 
1274
/**
1275
 * audit_syscall_entry - fill in an audit record at syscall entry
1276
 * @tsk: task being audited
1277
 * @arch: architecture type
1278
 * @major: major syscall type (function)
1279
 * @a1: additional syscall register 1
1280
 * @a2: additional syscall register 2
1281
 * @a3: additional syscall register 3
1282
 * @a4: additional syscall register 4
1283
 *
1284
 * Fill in audit context at syscall entry.  This only happens if the
1285
 * audit context was created when the task was created and the state or
1286
 * filters demand the audit context be built.  If the state from the
1287
 * per-task filter or from the per-syscall filter is AUDIT_RECORD_CONTEXT,
1288
 * then the record will be written at syscall exit time (otherwise, it
1289
 * will only be written if another part of the kernel requests that it
1290
 * be written).
1291
 */
1292
void audit_syscall_entry(int arch, int major,
1293
                         unsigned long a1, unsigned long a2,
1294
                         unsigned long a3, unsigned long a4)
1295
{
1296
        struct task_struct *tsk = current;
1297
        struct audit_context *context = tsk->audit_context;
1298
        enum audit_state     state;
1299
 
1300
        BUG_ON(!context);
1301
 
1302
        /*
1303
         * This happens only on certain architectures that make system
1304
         * calls in kernel_thread via the entry.S interface, instead of
1305
         * with direct calls.  (If you are porting to a new
1306
         * architecture, hitting this condition can indicate that you
1307
         * got the _exit/_leave calls backward in entry.S.)
1308
         *
1309
         * i386     no
1310
         * x86_64   no
1311
         * ppc64    yes (see arch/powerpc/platforms/iseries/misc.S)
1312
         *
1313
         * This also happens with vm86 emulation in a non-nested manner
1314
         * (entries without exits), so this case must be caught.
1315
         */
1316
        if (context->in_syscall) {
1317
                struct audit_context *newctx;
1318
 
1319
#if AUDIT_DEBUG
1320
                printk(KERN_ERR
1321
                       "audit(:%d) pid=%d in syscall=%d;"
1322
                       " entering syscall=%d\n",
1323
                       context->serial, tsk->pid, context->major, major);
1324
#endif
1325
                newctx = audit_alloc_context(context->state);
1326
                if (newctx) {
1327
                        newctx->previous   = context;
1328
                        context            = newctx;
1329
                        tsk->audit_context = newctx;
1330
                } else  {
1331
                        /* If we can't alloc a new context, the best we
1332
                         * can do is to leak memory (any pending putname
1333
                         * will be lost).  The only other alternative is
1334
                         * to abandon auditing. */
1335
                        audit_zero_context(context, context->state);
1336
                }
1337
        }
1338
        BUG_ON(context->in_syscall || context->name_count);
1339
 
1340
        if (!audit_enabled)
1341
                return;
1342
 
1343
        context->arch       = arch;
1344
        context->major      = major;
1345
        context->argv[0]    = a1;
1346
        context->argv[1]    = a2;
1347
        context->argv[2]    = a3;
1348
        context->argv[3]    = a4;
1349
 
1350
        state = context->state;
1351
        context->dummy = !audit_n_rules;
1352
        if (!context->dummy && (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT))
1353
                state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]);
1354
        if (likely(state == AUDIT_DISABLED))
1355
                return;
1356
 
1357
        context->serial     = 0;
1358
        context->ctime      = CURRENT_TIME;
1359
        context->in_syscall = 1;
1360
        context->auditable  = !!(state == AUDIT_RECORD_CONTEXT);
1361
        context->ppid       = 0;
1362
}
1363
 
1364
/**
1365
 * audit_syscall_exit - deallocate audit context after a system call
1366
 * @tsk: task being audited
1367
 * @valid: success/failure flag
1368
 * @return_code: syscall return value
1369
 *
1370
 * Tear down after system call.  If the audit context has been marked as
1371
 * auditable (either because of the AUDIT_RECORD_CONTEXT state from
1372
 * filtering, or because some other part of the kernel write an audit
1373
 * message), then write out the syscall information.  In call cases,
1374
 * free the names stored from getname().
1375
 */
1376
void audit_syscall_exit(int valid, long return_code)
1377
{
1378
        struct task_struct *tsk = current;
1379
        struct audit_context *context;
1380
 
1381
        context = audit_get_context(tsk, valid, return_code);
1382
 
1383
        if (likely(!context))
1384
                return;
1385
 
1386
        if (context->in_syscall && context->auditable)
1387
                audit_log_exit(context, tsk);
1388
 
1389
        context->in_syscall = 0;
1390
        context->auditable  = 0;
1391
 
1392
        if (context->previous) {
1393
                struct audit_context *new_context = context->previous;
1394
                context->previous  = NULL;
1395
                audit_free_context(context);
1396
                tsk->audit_context = new_context;
1397
        } else {
1398
                audit_free_names(context);
1399
                unroll_tree_refs(context, NULL, 0);
1400
                audit_free_aux(context);
1401
                context->aux = NULL;
1402
                context->aux_pids = NULL;
1403
                context->target_pid = 0;
1404
                context->target_sid = 0;
1405
                kfree(context->filterkey);
1406
                context->filterkey = NULL;
1407
                tsk->audit_context = context;
1408
        }
1409
}
1410
 
1411
static inline void handle_one(const struct inode *inode)
1412
{
1413
#ifdef CONFIG_AUDIT_TREE
1414
        struct audit_context *context;
1415
        struct audit_tree_refs *p;
1416
        struct audit_chunk *chunk;
1417
        int count;
1418
        if (likely(list_empty(&inode->inotify_watches)))
1419
                return;
1420
        context = current->audit_context;
1421
        p = context->trees;
1422
        count = context->tree_count;
1423
        rcu_read_lock();
1424
        chunk = audit_tree_lookup(inode);
1425
        rcu_read_unlock();
1426
        if (!chunk)
1427
                return;
1428
        if (likely(put_tree_ref(context, chunk)))
1429
                return;
1430
        if (unlikely(!grow_tree_refs(context))) {
1431
                printk(KERN_WARNING "out of memory, audit has lost a tree reference");
1432
                audit_set_auditable(context);
1433
                audit_put_chunk(chunk);
1434
                unroll_tree_refs(context, p, count);
1435
                return;
1436
        }
1437
        put_tree_ref(context, chunk);
1438
#endif
1439
}
1440
 
1441
static void handle_path(const struct dentry *dentry)
1442
{
1443
#ifdef CONFIG_AUDIT_TREE
1444
        struct audit_context *context;
1445
        struct audit_tree_refs *p;
1446
        const struct dentry *d, *parent;
1447
        struct audit_chunk *drop;
1448
        unsigned long seq;
1449
        int count;
1450
 
1451
        context = current->audit_context;
1452
        p = context->trees;
1453
        count = context->tree_count;
1454
retry:
1455
        drop = NULL;
1456
        d = dentry;
1457
        rcu_read_lock();
1458
        seq = read_seqbegin(&rename_lock);
1459
        for(;;) {
1460
                struct inode *inode = d->d_inode;
1461
                if (inode && unlikely(!list_empty(&inode->inotify_watches))) {
1462
                        struct audit_chunk *chunk;
1463
                        chunk = audit_tree_lookup(inode);
1464
                        if (chunk) {
1465
                                if (unlikely(!put_tree_ref(context, chunk))) {
1466
                                        drop = chunk;
1467
                                        break;
1468
                                }
1469
                        }
1470
                }
1471
                parent = d->d_parent;
1472
                if (parent == d)
1473
                        break;
1474
                d = parent;
1475
        }
1476
        if (unlikely(read_seqretry(&rename_lock, seq) || drop)) {  /* in this order */
1477
                rcu_read_unlock();
1478
                if (!drop) {
1479
                        /* just a race with rename */
1480
                        unroll_tree_refs(context, p, count);
1481
                        goto retry;
1482
                }
1483
                audit_put_chunk(drop);
1484
                if (grow_tree_refs(context)) {
1485
                        /* OK, got more space */
1486
                        unroll_tree_refs(context, p, count);
1487
                        goto retry;
1488
                }
1489
                /* too bad */
1490
                printk(KERN_WARNING
1491
                        "out of memory, audit has lost a tree reference");
1492
                unroll_tree_refs(context, p, count);
1493
                audit_set_auditable(context);
1494
                return;
1495
        }
1496
        rcu_read_unlock();
1497
#endif
1498
}
1499
 
1500
/**
1501
 * audit_getname - add a name to the list
1502
 * @name: name to add
1503
 *
1504
 * Add a name to the list of audit names for this context.
1505
 * Called from fs/namei.c:getname().
1506
 */
1507
void __audit_getname(const char *name)
1508
{
1509
        struct audit_context *context = current->audit_context;
1510
 
1511
        if (IS_ERR(name) || !name)
1512
                return;
1513
 
1514
        if (!context->in_syscall) {
1515
#if AUDIT_DEBUG == 2
1516
                printk(KERN_ERR "%s:%d(:%d): ignoring getname(%p)\n",
1517
                       __FILE__, __LINE__, context->serial, name);
1518
                dump_stack();
1519
#endif
1520
                return;
1521
        }
1522
        BUG_ON(context->name_count >= AUDIT_NAMES);
1523
        context->names[context->name_count].name = name;
1524
        context->names[context->name_count].name_len = AUDIT_NAME_FULL;
1525
        context->names[context->name_count].name_put = 1;
1526
        context->names[context->name_count].ino  = (unsigned long)-1;
1527
        context->names[context->name_count].osid = 0;
1528
        ++context->name_count;
1529
        if (!context->pwd) {
1530
                read_lock(&current->fs->lock);
1531
                context->pwd = dget(current->fs->pwd);
1532
                context->pwdmnt = mntget(current->fs->pwdmnt);
1533
                read_unlock(&current->fs->lock);
1534
        }
1535
 
1536
}
1537
 
1538
/* audit_putname - intercept a putname request
1539
 * @name: name to intercept and delay for putname
1540
 *
1541
 * If we have stored the name from getname in the audit context,
1542
 * then we delay the putname until syscall exit.
1543
 * Called from include/linux/fs.h:putname().
1544
 */
1545
void audit_putname(const char *name)
1546
{
1547
        struct audit_context *context = current->audit_context;
1548
 
1549
        BUG_ON(!context);
1550
        if (!context->in_syscall) {
1551
#if AUDIT_DEBUG == 2
1552
                printk(KERN_ERR "%s:%d(:%d): __putname(%p)\n",
1553
                       __FILE__, __LINE__, context->serial, name);
1554
                if (context->name_count) {
1555
                        int i;
1556
                        for (i = 0; i < context->name_count; i++)
1557
                                printk(KERN_ERR "name[%d] = %p = %s\n", i,
1558
                                       context->names[i].name,
1559
                                       context->names[i].name ?: "(null)");
1560
                }
1561
#endif
1562
                __putname(name);
1563
        }
1564
#if AUDIT_DEBUG
1565
        else {
1566
                ++context->put_count;
1567
                if (context->put_count > context->name_count) {
1568
                        printk(KERN_ERR "%s:%d(:%d): major=%d"
1569
                               " in_syscall=%d putname(%p) name_count=%d"
1570
                               " put_count=%d\n",
1571
                               __FILE__, __LINE__,
1572
                               context->serial, context->major,
1573
                               context->in_syscall, name, context->name_count,
1574
                               context->put_count);
1575
                        dump_stack();
1576
                }
1577
        }
1578
#endif
1579
}
1580
 
1581
static int audit_inc_name_count(struct audit_context *context,
1582
                                const struct inode *inode)
1583
{
1584
        if (context->name_count >= AUDIT_NAMES) {
1585
                if (inode)
1586
                        printk(KERN_DEBUG "name_count maxed, losing inode data: "
1587
                               "dev=%02x:%02x, inode=%lu",
1588
                               MAJOR(inode->i_sb->s_dev),
1589
                               MINOR(inode->i_sb->s_dev),
1590
                               inode->i_ino);
1591
 
1592
                else
1593
                        printk(KERN_DEBUG "name_count maxed, losing inode data");
1594
                return 1;
1595
        }
1596
        context->name_count++;
1597
#if AUDIT_DEBUG
1598
        context->ino_count++;
1599
#endif
1600
        return 0;
1601
}
1602
 
1603
/* Copy inode data into an audit_names. */
1604
static void audit_copy_inode(struct audit_names *name, const struct inode *inode)
1605
{
1606
        name->ino   = inode->i_ino;
1607
        name->dev   = inode->i_sb->s_dev;
1608
        name->mode  = inode->i_mode;
1609
        name->uid   = inode->i_uid;
1610
        name->gid   = inode->i_gid;
1611
        name->rdev  = inode->i_rdev;
1612
        selinux_get_inode_sid(inode, &name->osid);
1613
}
1614
 
1615
/**
1616
 * audit_inode - store the inode and device from a lookup
1617
 * @name: name being audited
1618
 * @dentry: dentry being audited
1619
 *
1620
 * Called from fs/namei.c:path_lookup().
1621
 */
1622
void __audit_inode(const char *name, const struct dentry *dentry)
1623
{
1624
        int idx;
1625
        struct audit_context *context = current->audit_context;
1626
        const struct inode *inode = dentry->d_inode;
1627
 
1628
        if (!context->in_syscall)
1629
                return;
1630
        if (context->name_count
1631
            && context->names[context->name_count-1].name
1632
            && context->names[context->name_count-1].name == name)
1633
                idx = context->name_count - 1;
1634
        else if (context->name_count > 1
1635
                 && context->names[context->name_count-2].name
1636
                 && context->names[context->name_count-2].name == name)
1637
                idx = context->name_count - 2;
1638
        else {
1639
                /* FIXME: how much do we care about inodes that have no
1640
                 * associated name? */
1641
                if (audit_inc_name_count(context, inode))
1642
                        return;
1643
                idx = context->name_count - 1;
1644
                context->names[idx].name = NULL;
1645
        }
1646
        handle_path(dentry);
1647
        audit_copy_inode(&context->names[idx], inode);
1648
}
1649
 
1650
/**
1651
 * audit_inode_child - collect inode info for created/removed objects
1652
 * @dname: inode's dentry name
1653
 * @dentry: dentry being audited
1654
 * @parent: inode of dentry parent
1655
 *
1656
 * For syscalls that create or remove filesystem objects, audit_inode
1657
 * can only collect information for the filesystem object's parent.
1658
 * This call updates the audit context with the child's information.
1659
 * Syscalls that create a new filesystem object must be hooked after
1660
 * the object is created.  Syscalls that remove a filesystem object
1661
 * must be hooked prior, in order to capture the target inode during
1662
 * unsuccessful attempts.
1663
 */
1664
void __audit_inode_child(const char *dname, const struct dentry *dentry,
1665
                         const struct inode *parent)
1666
{
1667
        int idx;
1668
        struct audit_context *context = current->audit_context;
1669
        const char *found_parent = NULL, *found_child = NULL;
1670
        const struct inode *inode = dentry->d_inode;
1671
        int dirlen = 0;
1672
 
1673
        if (!context->in_syscall)
1674
                return;
1675
 
1676
        if (inode)
1677
                handle_one(inode);
1678
        /* determine matching parent */
1679
        if (!dname)
1680
                goto add_names;
1681
 
1682
        /* parent is more likely, look for it first */
1683
        for (idx = 0; idx < context->name_count; idx++) {
1684
                struct audit_names *n = &context->names[idx];
1685
 
1686
                if (!n->name)
1687
                        continue;
1688
 
1689
                if (n->ino == parent->i_ino &&
1690
                    !audit_compare_dname_path(dname, n->name, &dirlen)) {
1691
                        n->name_len = dirlen; /* update parent data in place */
1692
                        found_parent = n->name;
1693
                        goto add_names;
1694
                }
1695
        }
1696
 
1697
        /* no matching parent, look for matching child */
1698
        for (idx = 0; idx < context->name_count; idx++) {
1699
                struct audit_names *n = &context->names[idx];
1700
 
1701
                if (!n->name)
1702
                        continue;
1703
 
1704
                /* strcmp() is the more likely scenario */
1705
                if (!strcmp(dname, n->name) ||
1706
                     !audit_compare_dname_path(dname, n->name, &dirlen)) {
1707
                        if (inode)
1708
                                audit_copy_inode(n, inode);
1709
                        else
1710
                                n->ino = (unsigned long)-1;
1711
                        found_child = n->name;
1712
                        goto add_names;
1713
                }
1714
        }
1715
 
1716
add_names:
1717
        if (!found_parent) {
1718
                if (audit_inc_name_count(context, parent))
1719
                        return;
1720
                idx = context->name_count - 1;
1721
                context->names[idx].name = NULL;
1722
                audit_copy_inode(&context->names[idx], parent);
1723
        }
1724
 
1725
        if (!found_child) {
1726
                if (audit_inc_name_count(context, inode))
1727
                        return;
1728
                idx = context->name_count - 1;
1729
 
1730
                /* Re-use the name belonging to the slot for a matching parent
1731
                 * directory. All names for this context are relinquished in
1732
                 * audit_free_names() */
1733
                if (found_parent) {
1734
                        context->names[idx].name = found_parent;
1735
                        context->names[idx].name_len = AUDIT_NAME_FULL;
1736
                        /* don't call __putname() */
1737
                        context->names[idx].name_put = 0;
1738
                } else {
1739
                        context->names[idx].name = NULL;
1740
                }
1741
 
1742
                if (inode)
1743
                        audit_copy_inode(&context->names[idx], inode);
1744
                else
1745
                        context->names[idx].ino = (unsigned long)-1;
1746
        }
1747
}
1748
EXPORT_SYMBOL_GPL(__audit_inode_child);
1749
 
1750
/**
1751
 * auditsc_get_stamp - get local copies of audit_context values
1752
 * @ctx: audit_context for the task
1753
 * @t: timespec to store time recorded in the audit_context
1754
 * @serial: serial value that is recorded in the audit_context
1755
 *
1756
 * Also sets the context as auditable.
1757
 */
1758
void auditsc_get_stamp(struct audit_context *ctx,
1759
                       struct timespec *t, unsigned int *serial)
1760
{
1761
        if (!ctx->serial)
1762
                ctx->serial = audit_serial();
1763
        t->tv_sec  = ctx->ctime.tv_sec;
1764
        t->tv_nsec = ctx->ctime.tv_nsec;
1765
        *serial    = ctx->serial;
1766
        ctx->auditable = 1;
1767
}
1768
 
1769
/**
1770
 * audit_set_loginuid - set a task's audit_context loginuid
1771
 * @task: task whose audit context is being modified
1772
 * @loginuid: loginuid value
1773
 *
1774
 * Returns 0.
1775
 *
1776
 * Called (set) from fs/proc/base.c::proc_loginuid_write().
1777
 */
1778
int audit_set_loginuid(struct task_struct *task, uid_t loginuid)
1779
{
1780
        struct audit_context *context = task->audit_context;
1781
 
1782
        if (context) {
1783
                /* Only log if audit is enabled */
1784
                if (context->in_syscall) {
1785
                        struct audit_buffer *ab;
1786
 
1787
                        ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN);
1788
                        if (ab) {
1789
                                audit_log_format(ab, "login pid=%d uid=%u "
1790
                                        "old auid=%u new auid=%u",
1791
                                        task->pid, task->uid,
1792
                                        context->loginuid, loginuid);
1793
                                audit_log_end(ab);
1794
                        }
1795
                }
1796
                context->loginuid = loginuid;
1797
        }
1798
        return 0;
1799
}
1800
 
1801
/**
1802
 * audit_get_loginuid - get the loginuid for an audit_context
1803
 * @ctx: the audit_context
1804
 *
1805
 * Returns the context's loginuid or -1 if @ctx is NULL.
1806
 */
1807
uid_t audit_get_loginuid(struct audit_context *ctx)
1808
{
1809
        return ctx ? ctx->loginuid : -1;
1810
}
1811
 
1812
EXPORT_SYMBOL(audit_get_loginuid);
1813
 
1814
/**
1815
 * __audit_mq_open - record audit data for a POSIX MQ open
1816
 * @oflag: open flag
1817
 * @mode: mode bits
1818
 * @u_attr: queue attributes
1819
 *
1820
 * Returns 0 for success or NULL context or < 0 on error.
1821
 */
1822
int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr)
1823
{
1824
        struct audit_aux_data_mq_open *ax;
1825
        struct audit_context *context = current->audit_context;
1826
 
1827
        if (!audit_enabled)
1828
                return 0;
1829
 
1830
        if (likely(!context))
1831
                return 0;
1832
 
1833
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1834
        if (!ax)
1835
                return -ENOMEM;
1836
 
1837
        if (u_attr != NULL) {
1838
                if (copy_from_user(&ax->attr, u_attr, sizeof(ax->attr))) {
1839
                        kfree(ax);
1840
                        return -EFAULT;
1841
                }
1842
        } else
1843
                memset(&ax->attr, 0, sizeof(ax->attr));
1844
 
1845
        ax->oflag = oflag;
1846
        ax->mode = mode;
1847
 
1848
        ax->d.type = AUDIT_MQ_OPEN;
1849
        ax->d.next = context->aux;
1850
        context->aux = (void *)ax;
1851
        return 0;
1852
}
1853
 
1854
/**
1855
 * __audit_mq_timedsend - record audit data for a POSIX MQ timed send
1856
 * @mqdes: MQ descriptor
1857
 * @msg_len: Message length
1858
 * @msg_prio: Message priority
1859
 * @u_abs_timeout: Message timeout in absolute time
1860
 *
1861
 * Returns 0 for success or NULL context or < 0 on error.
1862
 */
1863
int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio,
1864
                        const struct timespec __user *u_abs_timeout)
1865
{
1866
        struct audit_aux_data_mq_sendrecv *ax;
1867
        struct audit_context *context = current->audit_context;
1868
 
1869
        if (!audit_enabled)
1870
                return 0;
1871
 
1872
        if (likely(!context))
1873
                return 0;
1874
 
1875
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1876
        if (!ax)
1877
                return -ENOMEM;
1878
 
1879
        if (u_abs_timeout != NULL) {
1880
                if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) {
1881
                        kfree(ax);
1882
                        return -EFAULT;
1883
                }
1884
        } else
1885
                memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout));
1886
 
1887
        ax->mqdes = mqdes;
1888
        ax->msg_len = msg_len;
1889
        ax->msg_prio = msg_prio;
1890
 
1891
        ax->d.type = AUDIT_MQ_SENDRECV;
1892
        ax->d.next = context->aux;
1893
        context->aux = (void *)ax;
1894
        return 0;
1895
}
1896
 
1897
/**
1898
 * __audit_mq_timedreceive - record audit data for a POSIX MQ timed receive
1899
 * @mqdes: MQ descriptor
1900
 * @msg_len: Message length
1901
 * @u_msg_prio: Message priority
1902
 * @u_abs_timeout: Message timeout in absolute time
1903
 *
1904
 * Returns 0 for success or NULL context or < 0 on error.
1905
 */
1906
int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len,
1907
                                unsigned int __user *u_msg_prio,
1908
                                const struct timespec __user *u_abs_timeout)
1909
{
1910
        struct audit_aux_data_mq_sendrecv *ax;
1911
        struct audit_context *context = current->audit_context;
1912
 
1913
        if (!audit_enabled)
1914
                return 0;
1915
 
1916
        if (likely(!context))
1917
                return 0;
1918
 
1919
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1920
        if (!ax)
1921
                return -ENOMEM;
1922
 
1923
        if (u_msg_prio != NULL) {
1924
                if (get_user(ax->msg_prio, u_msg_prio)) {
1925
                        kfree(ax);
1926
                        return -EFAULT;
1927
                }
1928
        } else
1929
                ax->msg_prio = 0;
1930
 
1931
        if (u_abs_timeout != NULL) {
1932
                if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) {
1933
                        kfree(ax);
1934
                        return -EFAULT;
1935
                }
1936
        } else
1937
                memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout));
1938
 
1939
        ax->mqdes = mqdes;
1940
        ax->msg_len = msg_len;
1941
 
1942
        ax->d.type = AUDIT_MQ_SENDRECV;
1943
        ax->d.next = context->aux;
1944
        context->aux = (void *)ax;
1945
        return 0;
1946
}
1947
 
1948
/**
1949
 * __audit_mq_notify - record audit data for a POSIX MQ notify
1950
 * @mqdes: MQ descriptor
1951
 * @u_notification: Notification event
1952
 *
1953
 * Returns 0 for success or NULL context or < 0 on error.
1954
 */
1955
 
1956
int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification)
1957
{
1958
        struct audit_aux_data_mq_notify *ax;
1959
        struct audit_context *context = current->audit_context;
1960
 
1961
        if (!audit_enabled)
1962
                return 0;
1963
 
1964
        if (likely(!context))
1965
                return 0;
1966
 
1967
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1968
        if (!ax)
1969
                return -ENOMEM;
1970
 
1971
        if (u_notification != NULL) {
1972
                if (copy_from_user(&ax->notification, u_notification, sizeof(ax->notification))) {
1973
                        kfree(ax);
1974
                        return -EFAULT;
1975
                }
1976
        } else
1977
                memset(&ax->notification, 0, sizeof(ax->notification));
1978
 
1979
        ax->mqdes = mqdes;
1980
 
1981
        ax->d.type = AUDIT_MQ_NOTIFY;
1982
        ax->d.next = context->aux;
1983
        context->aux = (void *)ax;
1984
        return 0;
1985
}
1986
 
1987
/**
1988
 * __audit_mq_getsetattr - record audit data for a POSIX MQ get/set attribute
1989
 * @mqdes: MQ descriptor
1990
 * @mqstat: MQ flags
1991
 *
1992
 * Returns 0 for success or NULL context or < 0 on error.
1993
 */
1994
int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
1995
{
1996
        struct audit_aux_data_mq_getsetattr *ax;
1997
        struct audit_context *context = current->audit_context;
1998
 
1999
        if (!audit_enabled)
2000
                return 0;
2001
 
2002
        if (likely(!context))
2003
                return 0;
2004
 
2005
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
2006
        if (!ax)
2007
                return -ENOMEM;
2008
 
2009
        ax->mqdes = mqdes;
2010
        ax->mqstat = *mqstat;
2011
 
2012
        ax->d.type = AUDIT_MQ_GETSETATTR;
2013
        ax->d.next = context->aux;
2014
        context->aux = (void *)ax;
2015
        return 0;
2016
}
2017
 
2018
/**
2019
 * audit_ipc_obj - record audit data for ipc object
2020
 * @ipcp: ipc permissions
2021
 *
2022
 * Returns 0 for success or NULL context or < 0 on error.
2023
 */
2024
int __audit_ipc_obj(struct kern_ipc_perm *ipcp)
2025
{
2026
        struct audit_aux_data_ipcctl *ax;
2027
        struct audit_context *context = current->audit_context;
2028
 
2029
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
2030
        if (!ax)
2031
                return -ENOMEM;
2032
 
2033
        ax->uid = ipcp->uid;
2034
        ax->gid = ipcp->gid;
2035
        ax->mode = ipcp->mode;
2036
        selinux_get_ipc_sid(ipcp, &ax->osid);
2037
 
2038
        ax->d.type = AUDIT_IPC;
2039
        ax->d.next = context->aux;
2040
        context->aux = (void *)ax;
2041
        return 0;
2042
}
2043
 
2044
/**
2045
 * audit_ipc_set_perm - record audit data for new ipc permissions
2046
 * @qbytes: msgq bytes
2047
 * @uid: msgq user id
2048
 * @gid: msgq group id
2049
 * @mode: msgq mode (permissions)
2050
 *
2051
 * Returns 0 for success or NULL context or < 0 on error.
2052
 */
2053
int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode)
2054
{
2055
        struct audit_aux_data_ipcctl *ax;
2056
        struct audit_context *context = current->audit_context;
2057
 
2058
        ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
2059
        if (!ax)
2060
                return -ENOMEM;
2061
 
2062
        ax->qbytes = qbytes;
2063
        ax->uid = uid;
2064
        ax->gid = gid;
2065
        ax->mode = mode;
2066
 
2067
        ax->d.type = AUDIT_IPC_SET_PERM;
2068
        ax->d.next = context->aux;
2069
        context->aux = (void *)ax;
2070
        return 0;
2071
}
2072
 
2073
int audit_argv_kb = 32;
2074
 
2075
int audit_bprm(struct linux_binprm *bprm)
2076
{
2077
        struct audit_aux_data_execve *ax;
2078
        struct audit_context *context = current->audit_context;
2079
 
2080
        if (likely(!audit_enabled || !context || context->dummy))
2081
                return 0;
2082
 
2083
        /*
2084
         * Even though the stack code doesn't limit the arg+env size any more,
2085
         * the audit code requires that _all_ arguments be logged in a single
2086
         * netlink skb. Hence cap it :-(
2087
         */
2088
        if (bprm->argv_len > (audit_argv_kb << 10))
2089
                return -E2BIG;
2090
 
2091
        ax = kmalloc(sizeof(*ax), GFP_KERNEL);
2092
        if (!ax)
2093
                return -ENOMEM;
2094
 
2095
        ax->argc = bprm->argc;
2096
        ax->envc = bprm->envc;
2097
        ax->mm = bprm->mm;
2098
        ax->d.type = AUDIT_EXECVE;
2099
        ax->d.next = context->aux;
2100
        context->aux = (void *)ax;
2101
        return 0;
2102
}
2103
 
2104
 
2105
/**
2106
 * audit_socketcall - record audit data for sys_socketcall
2107
 * @nargs: number of args
2108
 * @args: args array
2109
 *
2110
 * Returns 0 for success or NULL context or < 0 on error.
2111
 */
2112
int audit_socketcall(int nargs, unsigned long *args)
2113
{
2114
        struct audit_aux_data_socketcall *ax;
2115
        struct audit_context *context = current->audit_context;
2116
 
2117
        if (likely(!context || context->dummy))
2118
                return 0;
2119
 
2120
        ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL);
2121
        if (!ax)
2122
                return -ENOMEM;
2123
 
2124
        ax->nargs = nargs;
2125
        memcpy(ax->args, args, nargs * sizeof(unsigned long));
2126
 
2127
        ax->d.type = AUDIT_SOCKETCALL;
2128
        ax->d.next = context->aux;
2129
        context->aux = (void *)ax;
2130
        return 0;
2131
}
2132
 
2133
/**
2134
 * __audit_fd_pair - record audit data for pipe and socketpair
2135
 * @fd1: the first file descriptor
2136
 * @fd2: the second file descriptor
2137
 *
2138
 * Returns 0 for success or NULL context or < 0 on error.
2139
 */
2140
int __audit_fd_pair(int fd1, int fd2)
2141
{
2142
        struct audit_context *context = current->audit_context;
2143
        struct audit_aux_data_fd_pair *ax;
2144
 
2145
        if (likely(!context)) {
2146
                return 0;
2147
        }
2148
 
2149
        ax = kmalloc(sizeof(*ax), GFP_KERNEL);
2150
        if (!ax) {
2151
                return -ENOMEM;
2152
        }
2153
 
2154
        ax->fd[0] = fd1;
2155
        ax->fd[1] = fd2;
2156
 
2157
        ax->d.type = AUDIT_FD_PAIR;
2158
        ax->d.next = context->aux;
2159
        context->aux = (void *)ax;
2160
        return 0;
2161
}
2162
 
2163
/**
2164
 * audit_sockaddr - record audit data for sys_bind, sys_connect, sys_sendto
2165
 * @len: data length in user space
2166
 * @a: data address in kernel space
2167
 *
2168
 * Returns 0 for success or NULL context or < 0 on error.
2169
 */
2170
int audit_sockaddr(int len, void *a)
2171
{
2172
        struct audit_aux_data_sockaddr *ax;
2173
        struct audit_context *context = current->audit_context;
2174
 
2175
        if (likely(!context || context->dummy))
2176
                return 0;
2177
 
2178
        ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL);
2179
        if (!ax)
2180
                return -ENOMEM;
2181
 
2182
        ax->len = len;
2183
        memcpy(ax->a, a, len);
2184
 
2185
        ax->d.type = AUDIT_SOCKADDR;
2186
        ax->d.next = context->aux;
2187
        context->aux = (void *)ax;
2188
        return 0;
2189
}
2190
 
2191
void __audit_ptrace(struct task_struct *t)
2192
{
2193
        struct audit_context *context = current->audit_context;
2194
 
2195
        context->target_pid = t->pid;
2196
        selinux_get_task_sid(t, &context->target_sid);
2197
}
2198
 
2199
/**
2200
 * audit_signal_info - record signal info for shutting down audit subsystem
2201
 * @sig: signal value
2202
 * @t: task being signaled
2203
 *
2204
 * If the audit subsystem is being terminated, record the task (pid)
2205
 * and uid that is doing that.
2206
 */
2207
int __audit_signal_info(int sig, struct task_struct *t)
2208
{
2209
        struct audit_aux_data_pids *axp;
2210
        struct task_struct *tsk = current;
2211
        struct audit_context *ctx = tsk->audit_context;
2212
        extern pid_t audit_sig_pid;
2213
        extern uid_t audit_sig_uid;
2214
        extern u32 audit_sig_sid;
2215
 
2216
        if (audit_pid && t->tgid == audit_pid) {
2217
                if (sig == SIGTERM || sig == SIGHUP || sig == SIGUSR1) {
2218
                        audit_sig_pid = tsk->pid;
2219
                        if (ctx)
2220
                                audit_sig_uid = ctx->loginuid;
2221
                        else
2222
                                audit_sig_uid = tsk->uid;
2223
                        selinux_get_task_sid(tsk, &audit_sig_sid);
2224
                }
2225
                if (!audit_signals || audit_dummy_context())
2226
                        return 0;
2227
        }
2228
 
2229
        /* optimize the common case by putting first signal recipient directly
2230
         * in audit_context */
2231
        if (!ctx->target_pid) {
2232
                ctx->target_pid = t->tgid;
2233
                selinux_get_task_sid(t, &ctx->target_sid);
2234
                return 0;
2235
        }
2236
 
2237
        axp = (void *)ctx->aux_pids;
2238
        if (!axp || axp->pid_count == AUDIT_AUX_PIDS) {
2239
                axp = kzalloc(sizeof(*axp), GFP_ATOMIC);
2240
                if (!axp)
2241
                        return -ENOMEM;
2242
 
2243
                axp->d.type = AUDIT_OBJ_PID;
2244
                axp->d.next = ctx->aux_pids;
2245
                ctx->aux_pids = (void *)axp;
2246
        }
2247
        BUG_ON(axp->pid_count >= AUDIT_AUX_PIDS);
2248
 
2249
        axp->target_pid[axp->pid_count] = t->tgid;
2250
        selinux_get_task_sid(t, &axp->target_sid[axp->pid_count]);
2251
        axp->pid_count++;
2252
 
2253
        return 0;
2254
}
2255
 
2256
/**
2257
 * audit_core_dumps - record information about processes that end abnormally
2258
 * @signr: signal value
2259
 *
2260
 * If a process ends with a core dump, something fishy is going on and we
2261
 * should record the event for investigation.
2262
 */
2263
void audit_core_dumps(long signr)
2264
{
2265
        struct audit_buffer *ab;
2266
        u32 sid;
2267
 
2268
        if (!audit_enabled)
2269
                return;
2270
 
2271
        if (signr == SIGQUIT)   /* don't care for those */
2272
                return;
2273
 
2274
        ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_ANOM_ABEND);
2275
        audit_log_format(ab, "auid=%u uid=%u gid=%u",
2276
                        audit_get_loginuid(current->audit_context),
2277
                        current->uid, current->gid);
2278
        selinux_get_task_sid(current, &sid);
2279
        if (sid) {
2280
                char *ctx = NULL;
2281
                u32 len;
2282
 
2283
                if (selinux_sid_to_string(sid, &ctx, &len))
2284
                        audit_log_format(ab, " ssid=%u", sid);
2285
                else
2286
                        audit_log_format(ab, " subj=%s", ctx);
2287
                kfree(ctx);
2288
        }
2289
        audit_log_format(ab, " pid=%d comm=", current->pid);
2290
        audit_log_untrustedstring(ab, current->comm);
2291
        audit_log_format(ab, " sig=%ld", signr);
2292
        audit_log_end(ab);
2293
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.