1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  24  */
  25 
  26 #ifndef _BSM_AUDIT_KERNEL_H
  27 #define _BSM_AUDIT_KERNEL_H
  28 
  29 
  30 /*
  31  * This file contains the basic auditing control structure definitions.
  32  */
  33 
  34 #include <c2/audit.h>
  35 #include <c2/audit_kevents.h>
  36 #include <sys/priv_impl.h>
  37 #include <sys/taskq.h>
  38 #include <sys/zone.h>
  39 
  40 #include <sys/tsol/label.h>
  41 
  42 #ifdef __cplusplus
  43 extern "C" {
  44 #endif
  45 
  46 /*
  47  * This table contains the mapping from the system call ID to a corresponding
  48  * audit event.
  49  *
  50  *   au_init() is a function called at the beginning of the system call that
  51  *   performs any necessary setup/processing. It maps the call into the
  52  *   appropriate event, depending on the system call arguments. It is called
  53  *   by audit_start() from trap.c .
  54  *
  55  *   au_event is the audit event associated with the system call. Most of the
  56  *   time it will map directly from the system call i.e. There is one system
  57  *   call associated with the event. In some cases, such as shmsys, or open,
  58  *   the au_start() function will map the system call to more than one event,
  59  *   depending on the system call arguments.
  60  *
  61  *   au_start() is a function that provides per system call processing at the
  62  *   beginning of a system call. It is mainly concerned with preseving the
  63  *   audit record components that may be altered so that we can determine
  64  *   what the original paramater was before as well as after the system call.
  65  *   It is possible that au_start() may be taken away. It might be cleaner to
  66  *   define flags in au_ctrl to save a designated argument. For the moment we
  67  *   support both mechanisms, however the use of au_start() will be reviewed
  68  *   for 4.1.1 and CMW and ZEUS to see if such a general method is justified.
  69  *
  70  *   au_finish() is a function that provides per system call processing at the
  71  *   completion of a system call. In certain circumstances, the type of audit
  72  *   event depends on intermidiate results during the processing of the system
  73  *   call. It is called in audit_finish() from trap.c .
  74  *
  75  *   au_ctrl is a control vector that indicates what processing might have to
  76  *   be performed, even if there is no auditing for this system call. At
  77  *   present this is mostly for path processing for chmod, chroot. We need to
  78  *   process the path information in vfs_lookup, even when we are not auditing
  79  *   the system call in the case of chdir and chroot.
  80  */
  81 /*
  82  * Defines for au_ctrl
  83  */
  84 #define S2E_SP  TAD_SAVPATH     /* save path for later use */
  85 #define S2E_MLD TAD_MLD         /* only one lookup per system call */
  86 #define S2E_NPT TAD_NOPATH      /* force no path in audit record */
  87 #define S2E_PUB TAD_PUBLIC_EV   /* syscall is defined as a public op */
  88 
  89 /*
  90  * At present, we are using the audit classes imbedded with in the kernel. Each
  91  * event has a bit mask determining which classes the event is associated.
  92  * The table audit_e2s maps the audit event ID to the audit state.
  93  *
  94  * Note that this may change radically. If we use a bit vector for the audit
  95  * class, we can allow granularity at the event ID for each user. In this
  96  * case, the vector would be determined at user level and passed to the kernel
  97  * via the setaudit system call.
  98  */
  99 
 100 /*
 101  * The audit_pad structure holds paths for the current root and directory
 102  * for the process, as well as for open files and directly manipulated objects.
 103  * The reference count minimizes data copies since the process's current
 104  * directory changes very seldom.
 105  */
 106 struct audit_path {
 107         uint_t          audp_ref;       /* reference count */
 108         uint_t          audp_size;      /* allocated size of this structure */
 109         uint_t          audp_cnt;       /* number of path sections */
 110         char            *audp_sect[1];  /* path section pointers */
 111                                         /* audp_sect[0] is the path name */
 112                                         /* audp_sect[1+] are attribute paths */
 113 };
 114 
 115 /*
 116  * The structure of the terminal ID within the kernel is different from the
 117  * terminal ID in user space. It is a combination of port and IP address.
 118  */
 119 
 120 struct au_termid {
 121         dev_t   at_port;
 122         uint_t  at_type;
 123         uint_t  at_addr[4];
 124 };
 125 typedef struct au_termid au_termid_t;
 126 
 127 /*
 128  * Attributes for deferring the queuing of an event.
 129  */
 130 typedef struct au_defer_info {
 131         struct au_defer_info    *audi_next;     /* next on linked list */
 132         void     *audi_ad;              /* audit record */
 133         au_event_t      audi_e_type;    /* audit event id */
 134         au_emod_t       audi_e_mod;     /* audit event modifier */
 135         int     audi_flag;              /* au_close*() flags */
 136         timestruc_t     audi_atime;     /* audit event timestamp */
 137 } au_defer_info_t;
 138 
 139 /*
 140  * The structure p_audit_data hangs off of the process structure. It contains
 141  * all of the audit information necessary to manage the audit record generation
 142  * for each process.
 143  *
 144  * The pad_lock is constructed in the kmem_cache; the rest is combined
 145  * in a sub structure so it can be copied/zeroed in one statement.
 146  *
 147  * The members have been reordered for maximum packing on 64 bit Solaris.
 148  */
 149 struct p_audit_data {
 150         kmutex_t        pad_lock;       /* lock pad data during changes */
 151         struct _pad_data {
 152                 struct audit_path       *pad_root;      /* process root path */
 153                 struct audit_path       *pad_cwd;       /* process cwd path */
 154                 au_mask_t               pad_newmask;    /* pending new mask */
 155                 int                     pad_flags;
 156         } pad_data;
 157 };
 158 typedef struct p_audit_data p_audit_data_t;
 159 
 160 #define pad_root        pad_data.pad_root
 161 #define pad_cwd         pad_data.pad_cwd
 162 #define pad_newmask     pad_data.pad_newmask
 163 #define pad_flags       pad_data.pad_flags
 164 
 165 /*
 166  * Defines for process audit flags (pad_flags)
 167  */
 168 #define PAD_SETMASK     0x00000001      /* need to complete pending setmask */
 169 
 170 extern kmem_cache_t *au_pad_cache;
 171 
 172 /*
 173  * Defines for thread audit control/status flags (tad_ctrl)
 174  */
 175 #define TAD_ABSPATH     0x00000001      /* path from lookup is absolute */
 176 #define TAD_ATCALL      0x00000002      /* *at() syscall, like openat() */
 177 #define TAD_ATTPATH     0x00000004      /* attribute file lookup */
 178 #define TAD_CORE        0x00000008      /* save attribute during core dump */
 179 #define TAD_ERRJMP      0x00000010      /* abort record generation on error */
 180 #define TAD_MLD         0x00000020      /* system call involves MLD */
 181 #define TAD_NOATTRB     0x00000040      /* do not automatically add attribute */
 182 #define TAD_NOAUDIT     0x00000080      /* discard audit record */
 183 #define TAD_NOPATH      0x00000100      /* force no paths in audit record */
 184 #define TAD_PATHFND     0x00000200      /* found path, don't retry lookup */
 185 #define TAD_PUBLIC_EV   0x00000400      /* syscall is defined as a public op */
 186 #define TAD_SAVPATH     0x00000800      /* save path for further processing */
 187 #define TAD_TRUE_CREATE 0x00001000      /* true create, file not found */
 188 
 189 /*
 190  * These types implement the interface between a consumer and FS for handling
 191  * SACL-based File Access Auditing. A consumer zeroes out the appropriate
 192  * t_audit_sacl_t in T2A(curthread), then sets tad_sacl_ctrl to one of
 193  * sacl_audit_ctrl_t. The FS, when auditing of SACLs is enabled, checks to see
 194  * if tad_sacl_ctrl is not NONE. If so, it collects information from the
 195  * object's SACL (such as NFSv4 Audit and Alarm type ACEs), and stores
 196  * representative Success and Failure masks in the t_audit_sacl_t structure.
 197  * The consumer then compares the requested access to the appropriate mask in
 198  * order to determine whether an audit record should be generated.
 199  */
 200 typedef struct t_audit_sacl {
 201         uint32_t tas_smask;
 202         uint32_t tas_fmask;
 203 } t_audit_sacl_t;
 204 
 205 typedef enum sacl_audit_ctrl {
 206         SACL_AUDIT_NONE = 0,
 207         SACL_AUDIT_ON,
 208         SACL_AUDIT_ALL,
 209         SACL_AUDIT_NO_SRC
 210 } sacl_audit_ctrl_t;
 211 
 212 /*
 213  * The structure t_audit_data hangs off of the thread structure. It contains
 214  * all of the audit information necessary to manage the audit record generation
 215  * for each thread.
 216  *
 217  */
 218 
 219 struct t_audit_data {
 220         kthread_id_t  tad_thread;       /* DEBUG pointer to parent thread */
 221         unsigned int  tad_scid;         /* system call ID for finish */
 222         au_event_t      tad_event;      /* event for audit record */
 223         au_emod_t       tad_evmod;      /* event modifier for audit record */
 224         int     tad_ctrl;       /* audit control/status flags */
 225         void    *tad_errjmp;    /* error longjmp (audit record aborted) */
 226         int     tad_flag;       /* to audit or not to audit */
 227         uint32_t tad_audit;     /* auditing enabled/disabled */
 228         struct audit_path       *tad_aupath;    /* captured at vfs_lookup */
 229         struct audit_path       *tad_atpath;    /* openat prefix, path of fd */
 230         caddr_t tad_ad;         /* base of accumulated audit data */
 231         au_defer_info_t *tad_defer_head;        /* queue of records to defer */
 232                                                 /* until syscall end: */
 233         au_defer_info_t *tad_defer_tail;        /* tail of defer queue */
 234         priv_set_t tad_sprivs;  /* saved (success) used privs */
 235         priv_set_t tad_fprivs;  /* saved (failed) used privs */
 236         sacl_audit_ctrl_t tad_sacl_ctrl;
 237         sacl_audit_ctrl_t tad_sacl_backup;
 238         t_audit_sacl_t tad_sacl_mask;
 239         t_audit_sacl_t tad_sacl_mask_src;
 240         t_audit_sacl_t tad_sacl_mask_dest;
 241 };
 242 typedef struct t_audit_data t_audit_data_t;
 243 
 244 /*
 245  * The f_audit_data structure hangs off of the file structure. It contains
 246  * three fields of data. The audit ID, the audit state, and a path name.
 247  */
 248 
 249 struct f_audit_data {
 250         kthread_id_t    fad_thread;     /* DEBUG creating thread */
 251         int             fad_flags;      /* audit control flags */
 252         struct audit_path       *fad_aupath;    /* path from vfs_lookup */
 253 };
 254 typedef struct f_audit_data f_audit_data_t;
 255 
 256 #define FAD_READ        0x0001          /* read system call seen */
 257 #define FAD_WRITE       0x0002          /* write system call seen */
 258 
 259 #define P2A(p)  (p->p_audit_data)
 260 #define T2A(t)  (t->t_audit_data)
 261 #define U2A(u)  (curthread->t_audit_data)
 262 #define F2A(f)  (f->f_audit_data)
 263 
 264 #define u_ad    ((U2A(u))->tad_ad)
 265 #define ad_ctrl ((U2A(u))->tad_ctrl)
 266 #define ad_flag ((U2A(u))->tad_flag)
 267 
 268 #define AU_BUFSIZE      128             /* buffer size for the buffer pool */
 269 
 270 struct au_buff {
 271         char            buf[AU_BUFSIZE];
 272         struct au_buff  *next_buf;
 273         struct au_buff  *next_rec;
 274         ushort_t        rec_len;
 275         uchar_t         len;
 276         uchar_t         flag;
 277 };
 278 
 279 typedef struct au_buff au_buff_t;
 280 
 281 /*
 282  * Kernel audit queue structure.
 283  */
 284 struct audit_queue {
 285         au_buff_t *head;        /* head of queue */
 286         au_buff_t *tail;        /* tail of queue */
 287         ssize_t cnt;            /* number elements on queue */
 288         size_t  hiwater;        /* high water mark to block */
 289         size_t  lowater;        /* low water mark to restart */
 290         size_t  bufsz;          /* audit trail write buffer size */
 291         size_t  buflen;         /* audit trail buffer length in use */
 292         clock_t delay;          /* delay before flushing queue */
 293         int     wt_block;       /* writer is blocked (1) */
 294         int     rd_block;       /* reader is blocked (1) */
 295         kmutex_t lock;          /* mutex lock for queue modification */
 296         kcondvar_t write_cv;    /* sleep structure for write block */
 297         kcondvar_t read_cv;     /* sleep structure for read block */
 298 };
 299 
 300 
 301 union rval;
 302 struct audit_s2e {
 303         au_event_t (*au_init)(au_event_t);
 304                                 /* convert au_event to real audit event ID */
 305 
 306         int au_event;           /* default audit event for this system call */
 307         void (*au_start)(struct t_audit_data *);
 308                                 /* pre-system call audit processing */
 309         void (*au_finish)(struct t_audit_data *, int, union rval *);
 310                                 /* post-system call audit processing */
 311         int au_ctrl;            /* control flags for auditing actions */
 312 };
 313 
 314 extern struct audit_s2e audit_s2e[];
 315 
 316 #define AUK_VALID       0x5A5A5A5A
 317 #define AUK_INVALID     0
 318 /*
 319  * per zone audit context
 320  */
 321 struct au_kcontext {
 322         uint32_t                auk_valid;
 323         zoneid_t                auk_zid;
 324 
 325         boolean_t               auk_hostaddr_valid;
 326         int                     auk_sequence;
 327         int                     auk_auditstate;
 328         int                     auk_output_active;
 329         struct vnode            *auk_current_vp;
 330         uint32_t                auk_policy;
 331 
 332         struct audit_queue      auk_queue;
 333 
 334         au_dbuf_t               *auk_dbuffer;   /* auditdoor output */
 335 
 336         au_stat_t               auk_statistics;
 337 
 338         k_auditinfo_addr_t      auk_info;
 339         kmutex_t                auk_eagain_mutex; /* door call retry */
 340         kcondvar_t              auk_eagain_cv;
 341 
 342         taskq_t                 *auk_taskq;     /* output thread */
 343 
 344         /* Only one audit svc per zone at a time */
 345         /* With the elimination of auditsvc, can this also go? see 6648414 */
 346         kmutex_t                auk_svc_lock;
 347 
 348         au_state_t              auk_ets[MAX_KEVENTS + 1];
 349 };
 350 #ifndef AUK_CONTEXT_T
 351 #define AUK_CONTEXT_T
 352 typedef struct au_kcontext au_kcontext_t;
 353 #endif
 354 
 355 extern zone_key_t au_zone_key;
 356 
 357 /*
 358  * Kernel auditing external variables
 359  */
 360 extern uint32_t audit_policy;
 361 extern int audit_active;
 362 
 363 extern struct audit_queue au_queue;
 364 extern struct p_audit_data *pad0;
 365 extern struct t_audit_data *tad0;
 366 
 367 /*
 368  * audit_path support routines
 369  */
 370 void au_pathhold(struct audit_path *);
 371 void au_pathrele(struct audit_path *);
 372 struct audit_path *au_pathdup(const struct audit_path *, int, int);
 373 
 374 void au_pad_init(void);
 375 
 376 int auditctl(int cmd, caddr_t data, int length);
 377 int auditdoor(int fd);
 378 int getauid(caddr_t);
 379 int setauid(caddr_t);
 380 int getaudit(caddr_t);
 381 int getaudit_addr(caddr_t, int);
 382 int setaudit(caddr_t);
 383 int setaudit_addr(caddr_t, int);
 384 
 385 /*
 386  * Macros to hide asynchronous, non-blocking audit record start and finish
 387  * processing.
 388  *
 389  * NOTE: must be used in (void) funcction () { ... }
 390  */
 391 
 392 #define AUDIT_ASYNC_START(rp, audit_event, sorf) \
 393 { \
 394         label_t jb; \
 395         if (setjmp(&jb)) { \
 396                 /* cleanup any residual audit data */ \
 397                 audit_async_drop((caddr_t *)&(rp), 0); \
 398                 return; \
 399         } \
 400         /* auditing enabled and we're preselected for this event? */ \
 401         if (audit_async_start(&jb, audit_event, sorf)) { \
 402                 return; \
 403         } \
 404 }
 405 
 406 #define AUDIT_ASYNC_FINISH(rp, audit_event, event_modifier, event_time) \
 407         audit_async_finish((caddr_t *)&(rp), audit_event, event_modifier, \
 408         event_time);
 409 
 410 
 411 #ifdef  _KERNEL
 412 au_buff_t *au_get_buff(void), *au_free_buff(au_buff_t *);
 413 #endif
 414 
 415 /*
 416  * Macro for uniform "subject" token(s) generation
 417  */
 418 #define AUDIT_SETSUBJ_GENERIC(u, c, a, k, p)            \
 419         (au_write((u), au_to_subject(crgetuid(c),       \
 420             crgetgid(c), crgetruid(c), crgetrgid(c),    \
 421             p, (a)->ai_auid, (a)->ai_asid,                \
 422             &((a)->ai_termid))));                        \
 423         ((is_system_labeled()) ?  au_write((u),         \
 424             au_to_label(CR_SL((c)))) : (void) 0);       \
 425         (((k)->auk_policy & AUDIT_GROUP) ? au_write((u),\
 426             au_to_groups(crgetgroups(c),                \
 427             crgetngroups(c))) : (void) 0)
 428 
 429 #define AUDIT_SETSUBJ(u, c, a, k)               \
 430         AUDIT_SETSUBJ_GENERIC(u, c, a, k, curproc->p_pid)
 431 
 432 #define AUDIT_SETPROC_GENERIC(u, c, a, p)               \
 433         (au_write((u), au_to_process(crgetuid(c),       \
 434             crgetgid(c), crgetruid(c), crgetrgid(c),    \
 435             p, (a)->ai_auid, (a)->ai_asid,                \
 436             &((a)->ai_termid))));
 437 
 438 #define AUDIT_SETPROC(u, c, a)                  \
 439         AUDIT_SETPROC_GENERIC(u, c, a, curproc->p_pid)
 440 
 441 /*
 442  * Macros for type conversion
 443  */
 444 
 445 /* au_membuf head, to typed data */
 446 #define memtod(x, t)    ((t)x->buf)
 447 
 448 /* au_membuf types */
 449 #define MT_FREE         0       /* should be on free list */
 450 #define MT_DATA         1       /* dynamic (data) allocation */
 451 
 452 /* flags to au_memget */
 453 #define DONTWAIT        0
 454 #define WAIT            1
 455 
 456 #define AU_PACK 1       /* pack data in au_append_rec() */
 457 #define AU_LINK 0       /* link data in au_append_rec() */
 458 
 459 /* flags to async routines */
 460 #define AU_BACKEND      1       /* called from softcall backend */
 461 
 462 #ifdef __cplusplus
 463 }
 464 #endif
 465 
 466 #endif /* _BSM_AUDIT_KERNEL_H */