linux/include/linux/audit.h
<<
>>
Prefs
   1/* audit.h -- Auditing support
   2 *
   3 * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
   4 * All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19 *
  20 * Written by Rickard E. (Rik) Faith <faith@redhat.com>
  21 *
  22 */
  23#ifndef _LINUX_AUDIT_H_
  24#define _LINUX_AUDIT_H_
  25
  26#include <linux/sched.h>
  27#include <linux/ptrace.h>
  28#include <uapi/linux/audit.h>
  29
  30struct audit_sig_info {
  31        uid_t           uid;
  32        pid_t           pid;
  33        char            ctx[0];
  34};
  35
  36struct audit_buffer;
  37struct audit_context;
  38struct inode;
  39struct netlink_skb_parms;
  40struct path;
  41struct linux_binprm;
  42struct mq_attr;
  43struct mqstat;
  44struct audit_watch;
  45struct audit_tree;
  46struct sk_buff;
  47
  48struct audit_krule {
  49        u32                     pflags;
  50        u32                     flags;
  51        u32                     listnr;
  52        u32                     action;
  53        u32                     mask[AUDIT_BITMASK_SIZE];
  54        u32                     buflen; /* for data alloc on list rules */
  55        u32                     field_count;
  56        char                    *filterkey; /* ties events to rules */
  57        struct audit_field      *fields;
  58        struct audit_field      *arch_f; /* quick access to arch field */
  59        struct audit_field      *inode_f; /* quick access to an inode field */
  60        struct audit_watch      *watch; /* associated watch */
  61        struct audit_tree       *tree;  /* associated watched tree */
  62        struct list_head        rlist;  /* entry in audit_{watch,tree}.rules list */
  63        struct list_head        list;   /* for AUDIT_LIST* purposes only */
  64        u64                     prio;
  65};
  66
  67/* Flag to indicate legacy AUDIT_LOGINUID unset usage */
  68#define AUDIT_LOGINUID_LEGACY           0x1
  69
  70struct audit_field {
  71        u32                             type;
  72        union {
  73                u32                     val;
  74                kuid_t                  uid;
  75                kgid_t                  gid;
  76                struct {
  77                        char            *lsm_str;
  78                        void            *lsm_rule;
  79                };
  80        };
  81        u32                             op;
  82};
  83
  84extern int is_audit_feature_set(int which);
  85
  86extern int __init audit_register_class(int class, unsigned *list);
  87extern int audit_classify_syscall(int abi, unsigned syscall);
  88extern int audit_classify_arch(int arch);
  89/* only for compat system calls */
  90extern unsigned compat_write_class[];
  91extern unsigned compat_read_class[];
  92extern unsigned compat_dir_class[];
  93extern unsigned compat_chattr_class[];
  94extern unsigned compat_signal_class[];
  95
  96extern int audit_classify_compat_syscall(int abi, unsigned syscall);
  97
  98/* audit_names->type values */
  99#define AUDIT_TYPE_UNKNOWN      0       /* we don't know yet */
 100#define AUDIT_TYPE_NORMAL       1       /* a "normal" audit record */
 101#define AUDIT_TYPE_PARENT       2       /* a parent audit record */
 102#define AUDIT_TYPE_CHILD_DELETE 3       /* a child being deleted */
 103#define AUDIT_TYPE_CHILD_CREATE 4       /* a child being created */
 104
 105/* maximized args number that audit_socketcall can process */
 106#define AUDITSC_ARGS            6
 107
 108struct filename;
 109
 110extern void audit_log_session_info(struct audit_buffer *ab);
 111
 112#ifdef CONFIG_AUDIT_COMPAT_GENERIC
 113#define audit_is_compat(arch)  (!((arch) & __AUDIT_ARCH_64BIT))
 114#else
 115#define audit_is_compat(arch)  false
 116#endif
 117
 118#ifdef CONFIG_AUDITSYSCALL
 119#include <asm/syscall.h> /* for syscall_get_arch() */
 120
 121/* These are defined in auditsc.c */
 122                                /* Public API */
 123extern int  audit_alloc(struct task_struct *task);
 124extern void __audit_free(struct task_struct *task);
 125extern void __audit_syscall_entry(int major, unsigned long a0, unsigned long a1,
 126                                  unsigned long a2, unsigned long a3);
 127extern void __audit_syscall_exit(int ret_success, long ret_value);
 128extern struct filename *__audit_reusename(const __user char *uptr);
 129extern void __audit_getname(struct filename *name);
 130
 131#define AUDIT_INODE_PARENT      1       /* dentry represents the parent */
 132#define AUDIT_INODE_HIDDEN      2       /* audit record should be hidden */
 133extern void __audit_inode(struct filename *name, const struct dentry *dentry,
 134                                unsigned int flags);
 135extern void __audit_file(const struct file *);
 136extern void __audit_inode_child(const struct inode *parent,
 137                                const struct dentry *dentry,
 138                                const unsigned char type);
 139extern void __audit_seccomp(unsigned long syscall, long signr, int code);
 140extern void __audit_ptrace(struct task_struct *t);
 141
 142static inline int audit_dummy_context(void)
 143{
 144        void *p = current->audit_context;
 145        return !p || *(int *)p;
 146}
 147static inline void audit_free(struct task_struct *task)
 148{
 149        if (unlikely(task->audit_context))
 150                __audit_free(task);
 151}
 152static inline void audit_syscall_entry(int major, unsigned long a0,
 153                                       unsigned long a1, unsigned long a2,
 154                                       unsigned long a3)
 155{
 156        if (unlikely(current->audit_context))
 157                __audit_syscall_entry(major, a0, a1, a2, a3);
 158}
 159static inline void audit_syscall_exit(void *pt_regs)
 160{
 161        if (unlikely(current->audit_context)) {
 162                int success = is_syscall_success(pt_regs);
 163                long return_code = regs_return_value(pt_regs);
 164
 165                __audit_syscall_exit(success, return_code);
 166        }
 167}
 168static inline struct filename *audit_reusename(const __user char *name)
 169{
 170        if (unlikely(!audit_dummy_context()))
 171                return __audit_reusename(name);
 172        return NULL;
 173}
 174static inline void audit_getname(struct filename *name)
 175{
 176        if (unlikely(!audit_dummy_context()))
 177                __audit_getname(name);
 178}
 179static inline void audit_inode(struct filename *name,
 180                                const struct dentry *dentry,
 181                                unsigned int parent) {
 182        if (unlikely(!audit_dummy_context())) {
 183                unsigned int flags = 0;
 184                if (parent)
 185                        flags |= AUDIT_INODE_PARENT;
 186                __audit_inode(name, dentry, flags);
 187        }
 188}
 189static inline void audit_file(struct file *file)
 190{
 191        if (unlikely(!audit_dummy_context()))
 192                __audit_file(file);
 193}
 194static inline void audit_inode_parent_hidden(struct filename *name,
 195                                                const struct dentry *dentry)
 196{
 197        if (unlikely(!audit_dummy_context()))
 198                __audit_inode(name, dentry,
 199                                AUDIT_INODE_PARENT | AUDIT_INODE_HIDDEN);
 200}
 201static inline void audit_inode_child(const struct inode *parent,
 202                                     const struct dentry *dentry,
 203                                     const unsigned char type) {
 204        if (unlikely(!audit_dummy_context()))
 205                __audit_inode_child(parent, dentry, type);
 206}
 207void audit_core_dumps(long signr);
 208
 209static inline void audit_seccomp(unsigned long syscall, long signr, int code)
 210{
 211        /* Force a record to be reported if a signal was delivered. */
 212        if (signr || unlikely(!audit_dummy_context()))
 213                __audit_seccomp(syscall, signr, code);
 214}
 215
 216static inline void audit_ptrace(struct task_struct *t)
 217{
 218        if (unlikely(!audit_dummy_context()))
 219                __audit_ptrace(t);
 220}
 221
 222                                /* Private API (for audit.c only) */
 223extern unsigned int audit_serial(void);
 224extern int auditsc_get_stamp(struct audit_context *ctx,
 225                              struct timespec *t, unsigned int *serial);
 226extern int audit_set_loginuid(kuid_t loginuid);
 227
 228static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
 229{
 230        return tsk->loginuid;
 231}
 232
 233static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
 234{
 235        return tsk->sessionid;
 236}
 237
 238extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp);
 239extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode);
 240extern void __audit_bprm(struct linux_binprm *bprm);
 241extern int __audit_socketcall(int nargs, unsigned long *args);
 242extern int __audit_sockaddr(int len, void *addr);
 243extern void __audit_fd_pair(int fd1, int fd2);
 244extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr);
 245extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);
 246extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification);
 247extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
 248extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm,
 249                                  const struct cred *new,
 250                                  const struct cred *old);
 251extern void __audit_log_capset(const struct cred *new, const struct cred *old);
 252extern void __audit_mmap_fd(int fd, int flags);
 253
 254static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
 255{
 256        if (unlikely(!audit_dummy_context()))
 257                __audit_ipc_obj(ipcp);
 258}
 259static inline void audit_fd_pair(int fd1, int fd2)
 260{
 261        if (unlikely(!audit_dummy_context()))
 262                __audit_fd_pair(fd1, fd2);
 263}
 264static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)
 265{
 266        if (unlikely(!audit_dummy_context()))
 267                __audit_ipc_set_perm(qbytes, uid, gid, mode);
 268}
 269static inline void audit_bprm(struct linux_binprm *bprm)
 270{
 271        if (unlikely(!audit_dummy_context()))
 272                __audit_bprm(bprm);
 273}
 274static inline int audit_socketcall(int nargs, unsigned long *args)
 275{
 276        if (unlikely(!audit_dummy_context()))
 277                return __audit_socketcall(nargs, args);
 278        return 0;
 279}
 280static inline int audit_sockaddr(int len, void *addr)
 281{
 282        if (unlikely(!audit_dummy_context()))
 283                return __audit_sockaddr(len, addr);
 284        return 0;
 285}
 286static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
 287{
 288        if (unlikely(!audit_dummy_context()))
 289                __audit_mq_open(oflag, mode, attr);
 290}
 291static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout)
 292{
 293        if (unlikely(!audit_dummy_context()))
 294                __audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout);
 295}
 296static inline void audit_mq_notify(mqd_t mqdes, const struct sigevent *notification)
 297{
 298        if (unlikely(!audit_dummy_context()))
 299                __audit_mq_notify(mqdes, notification);
 300}
 301static inline void audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
 302{
 303        if (unlikely(!audit_dummy_context()))
 304                __audit_mq_getsetattr(mqdes, mqstat);
 305}
 306
 307static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
 308                                       const struct cred *new,
 309                                       const struct cred *old)
 310{
 311        if (unlikely(!audit_dummy_context()))
 312                return __audit_log_bprm_fcaps(bprm, new, old);
 313        return 0;
 314}
 315
 316static inline void audit_log_capset(const struct cred *new,
 317                                   const struct cred *old)
 318{
 319        if (unlikely(!audit_dummy_context()))
 320                __audit_log_capset(new, old);
 321}
 322
 323static inline void audit_mmap_fd(int fd, int flags)
 324{
 325        if (unlikely(!audit_dummy_context()))
 326                __audit_mmap_fd(fd, flags);
 327}
 328
 329extern int audit_n_rules;
 330extern int audit_signals;
 331#else /* CONFIG_AUDITSYSCALL */
 332static inline int audit_alloc(struct task_struct *task)
 333{
 334        return 0;
 335}
 336static inline void audit_free(struct task_struct *task)
 337{ }
 338static inline void audit_syscall_entry(int major, unsigned long a0,
 339                                       unsigned long a1, unsigned long a2,
 340                                       unsigned long a3)
 341{ }
 342static inline void audit_syscall_exit(void *pt_regs)
 343{ }
 344static inline int audit_dummy_context(void)
 345{
 346        return 1;
 347}
 348static inline struct filename *audit_reusename(const __user char *name)
 349{
 350        return NULL;
 351}
 352static inline void audit_getname(struct filename *name)
 353{ }
 354static inline void __audit_inode(struct filename *name,
 355                                        const struct dentry *dentry,
 356                                        unsigned int flags)
 357{ }
 358static inline void __audit_inode_child(const struct inode *parent,
 359                                        const struct dentry *dentry,
 360                                        const unsigned char type)
 361{ }
 362static inline void audit_inode(struct filename *name,
 363                                const struct dentry *dentry,
 364                                unsigned int parent)
 365{ }
 366static inline void audit_file(struct file *file)
 367{
 368}
 369static inline void audit_inode_parent_hidden(struct filename *name,
 370                                const struct dentry *dentry)
 371{ }
 372static inline void audit_inode_child(const struct inode *parent,
 373                                     const struct dentry *dentry,
 374                                     const unsigned char type)
 375{ }
 376static inline void audit_core_dumps(long signr)
 377{ }
 378static inline void __audit_seccomp(unsigned long syscall, long signr, int code)
 379{ }
 380static inline void audit_seccomp(unsigned long syscall, long signr, int code)
 381{ }
 382static inline int auditsc_get_stamp(struct audit_context *ctx,
 383                              struct timespec *t, unsigned int *serial)
 384{
 385        return 0;
 386}
 387static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
 388{
 389        return INVALID_UID;
 390}
 391static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
 392{
 393        return -1;
 394}
 395static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
 396{ }
 397static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid,
 398                                        gid_t gid, umode_t mode)
 399{ }
 400static inline void audit_bprm(struct linux_binprm *bprm)
 401{ }
 402static inline int audit_socketcall(int nargs, unsigned long *args)
 403{
 404        return 0;
 405}
 406static inline void audit_fd_pair(int fd1, int fd2)
 407{ }
 408static inline int audit_sockaddr(int len, void *addr)
 409{
 410        return 0;
 411}
 412static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
 413{ }
 414static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len,
 415                                     unsigned int msg_prio,
 416                                     const struct timespec *abs_timeout)
 417{ }
 418static inline void audit_mq_notify(mqd_t mqdes,
 419                                   const struct sigevent *notification)
 420{ }
 421static inline void audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
 422{ }
 423static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
 424                                       const struct cred *new,
 425                                       const struct cred *old)
 426{
 427        return 0;
 428}
 429static inline void audit_log_capset(const struct cred *new,
 430                                    const struct cred *old)
 431{ }
 432static inline void audit_mmap_fd(int fd, int flags)
 433{ }
 434static inline void audit_ptrace(struct task_struct *t)
 435{ }
 436#define audit_n_rules 0
 437#define audit_signals 0
 438#endif /* CONFIG_AUDITSYSCALL */
 439
 440static inline bool audit_loginuid_set(struct task_struct *tsk)
 441{
 442        return uid_valid(audit_get_loginuid(tsk));
 443}
 444
 445#ifdef CONFIG_AUDIT
 446/* These are defined in audit.c */
 447                                /* Public API */
 448extern __printf(4, 5)
 449void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,
 450               const char *fmt, ...);
 451
 452extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type);
 453extern __printf(2, 3)
 454void audit_log_format(struct audit_buffer *ab, const char *fmt, ...);
 455extern void                 audit_log_end(struct audit_buffer *ab);
 456extern int                  audit_string_contains_control(const char *string,
 457                                                          size_t len);
 458extern void                 audit_log_n_hex(struct audit_buffer *ab,
 459                                          const unsigned char *buf,
 460                                          size_t len);
 461extern void                 audit_log_n_string(struct audit_buffer *ab,
 462                                               const char *buf,
 463                                               size_t n);
 464extern void                 audit_log_n_untrustedstring(struct audit_buffer *ab,
 465                                                        const char *string,
 466                                                        size_t n);
 467extern void                 audit_log_untrustedstring(struct audit_buffer *ab,
 468                                                      const char *string);
 469extern void                 audit_log_d_path(struct audit_buffer *ab,
 470                                             const char *prefix,
 471                                             const struct path *path);
 472extern void                 audit_log_key(struct audit_buffer *ab,
 473                                          char *key);
 474extern void                 audit_log_link_denied(const char *operation,
 475                                                  struct path *link);
 476extern void                 audit_log_lost(const char *message);
 477#ifdef CONFIG_SECURITY
 478extern void                 audit_log_secctx(struct audit_buffer *ab, u32 secid);
 479#else
 480static inline void          audit_log_secctx(struct audit_buffer *ab, u32 secid)
 481{ }
 482#endif
 483
 484extern int audit_log_task_context(struct audit_buffer *ab);
 485extern void audit_log_task_info(struct audit_buffer *ab,
 486                                struct task_struct *tsk);
 487
 488extern int                  audit_update_lsm_rules(void);
 489
 490                                /* Private API (for audit.c only) */
 491extern int audit_filter_user(int type);
 492extern int audit_filter_type(int type);
 493extern int audit_rule_change(int type, __u32 portid, int seq,
 494                                void *data, size_t datasz);
 495extern int audit_list_rules_send(struct sk_buff *request_skb, int seq);
 496
 497extern u32 audit_enabled;
 498#else /* CONFIG_AUDIT */
 499static inline __printf(4, 5)
 500void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,
 501               const char *fmt, ...)
 502{ }
 503static inline struct audit_buffer *audit_log_start(struct audit_context *ctx,
 504                                                   gfp_t gfp_mask, int type)
 505{
 506        return NULL;
 507}
 508static inline __printf(2, 3)
 509void audit_log_format(struct audit_buffer *ab, const char *fmt, ...)
 510{ }
 511static inline void audit_log_end(struct audit_buffer *ab)
 512{ }
 513static inline void audit_log_n_hex(struct audit_buffer *ab,
 514                                   const unsigned char *buf, size_t len)
 515{ }
 516static inline void audit_log_n_string(struct audit_buffer *ab,
 517                                      const char *buf, size_t n)
 518{ }
 519static inline void  audit_log_n_untrustedstring(struct audit_buffer *ab,
 520                                                const char *string, size_t n)
 521{ }
 522static inline void audit_log_untrustedstring(struct audit_buffer *ab,
 523                                             const char *string)
 524{ }
 525static inline void audit_log_d_path(struct audit_buffer *ab,
 526                                    const char *prefix,
 527                                    const struct path *path)
 528{ }
 529static inline void audit_log_key(struct audit_buffer *ab, char *key)
 530{ }
 531static inline void audit_log_link_denied(const char *string,
 532                                         const struct path *link)
 533{ }
 534static inline void audit_log_secctx(struct audit_buffer *ab, u32 secid)
 535{ }
 536static inline int audit_log_task_context(struct audit_buffer *ab)
 537{
 538        return 0;
 539}
 540static inline void audit_log_task_info(struct audit_buffer *ab,
 541                                       struct task_struct *tsk)
 542{ }
 543#define audit_enabled 0
 544#endif /* CONFIG_AUDIT */
 545static inline void audit_log_string(struct audit_buffer *ab, const char *buf)
 546{
 547        audit_log_n_string(ab, buf, strlen(buf));
 548}
 549
 550#endif
 551