1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /* Copyright 2014, Richard Lowe */
  13 
  14 #ifndef _SYS_SECFLAGS_H
  15 #define _SYS_SECFLAGS_H
  16 
  17 #ifdef __cplusplus
  18 extern "C" {
  19 #endif
  20 
  21 #include <sys/types.h>
  22 #include <sys/procset.h>
  23 
  24 struct proc;
  25 typedef uint64_t secflagset_t;
  26 
  27 typedef struct psecflags {
  28         secflagset_t psf_effective;
  29         secflagset_t psf_inherit;
  30         secflagset_t psf_lower;
  31         secflagset_t psf_upper;
  32 } psecflags_t;
  33 
  34 typedef struct secflagdelta {
  35         secflagset_t psd_add;           /* Flags to add */
  36         secflagset_t psd_rem;           /* Flags to remove */
  37         secflagset_t psd_assign;        /* Flags to assign */
  38         boolean_t psd_ass_active;       /* Need to assign */
  39 } secflagdelta_t;
  40 
  41 typedef enum {
  42         PSF_EFFECTIVE = 0,
  43         PSF_INHERIT,
  44         PSF_LOWER,
  45         PSF_UPPER
  46 } psecflagwhich_t;
  47 
  48 
  49 /*
  50  * p_secflags codes
  51  *
  52  * These flags indicate the extra security-related features enabled for a
  53  * given process.
  54  */
  55 typedef enum {
  56         PROC_SEC_ASLR = 0,
  57         PROC_SEC_FORBIDNULLMAP,
  58         PROC_SEC_NOEXECSTACK
  59 } secflag_t;
  60 
  61 extern secflagset_t secflag_to_bit(secflag_t);
  62 extern boolean_t secflag_isset(secflagset_t, secflag_t);
  63 extern void secflag_clear(secflagset_t *, secflag_t);
  64 extern void secflag_set(secflagset_t *, secflag_t);
  65 extern boolean_t secflags_isempty(secflagset_t);
  66 extern void secflags_zero(secflagset_t *);
  67 extern void secflags_fullset(secflagset_t *);
  68 extern void secflags_copy(secflagset_t *, const secflagset_t *);
  69 extern boolean_t secflags_issubset(secflagset_t, secflagset_t);
  70 extern boolean_t secflags_issuperset(secflagset_t, secflagset_t);
  71 extern boolean_t secflags_intersection(secflagset_t, secflagset_t);
  72 extern void secflags_union(secflagset_t *, const secflagset_t *);
  73 extern void secflags_difference(secflagset_t *, const secflagset_t *);
  74 extern boolean_t psecflags_validate_delta(const psecflags_t *,
  75     const secflagdelta_t *);
  76 extern boolean_t psecflags_validate(const psecflags_t *);
  77 extern void psecflags_default(psecflags_t *sf);
  78 extern const char *secflag_to_str(secflag_t);
  79 extern boolean_t secflag_by_name(const char *, secflag_t *);
  80 extern void secflags_to_str(secflagset_t, char *, size_t);
  81 
  82 /* All valid bits */
  83 #define PROC_SEC_MASK   (secflag_to_bit(PROC_SEC_ASLR) |        \
  84     secflag_to_bit(PROC_SEC_FORBIDNULLMAP) |                    \
  85     secflag_to_bit(PROC_SEC_NOEXECSTACK))
  86 
  87 #if !defined(_KERNEL)
  88 extern int secflags_parse(const secflagset_t *, const char *, secflagdelta_t *);
  89 extern int psecflags(idtype_t, id_t, psecflagwhich_t, secflagdelta_t *);
  90 #endif
  91 
  92 #if defined(_KERNEL)
  93 extern boolean_t secflag_enabled(struct proc *, secflag_t);
  94 extern void secflags_promote(struct proc *);
  95 extern void secflags_apply_delta(secflagset_t *, const secflagdelta_t *);
  96 #endif
  97 
  98 #ifdef __cplusplus
  99 }
 100 #endif
 101 
 102 #endif /* _SYS_SECFLAGS_H */