Home | History | Annotate | Download | only in selinux
      1 /*
      2  * Access vector cache interface for object managers.
      3  *
      4  * Author : Eamon Walsh <ewalsh (at) epoch.ncsc.mil>
      5  */
      6 #ifndef _SELINUX_AVC_H_
      7 #define _SELINUX_AVC_H_
      8 
      9 #include <stdint.h>
     10 #include <errno.h>
     11 #include <stdlib.h>
     12 #include <selinux/selinux.h>
     13 
     14 #ifdef __cplusplus
     15 extern "C" {
     16 #endif
     17 
     18 /*
     19  * SID format and operations
     20  */
     21 struct security_id {
     22 	security_context_t ctx;
     23 	unsigned int refcnt;
     24 };
     25 typedef struct security_id *security_id_t;
     26 
     27 #define SECSID_WILD (security_id_t)NULL	/* unspecified SID */
     28 
     29 /**
     30  * avc_sid_to_context - get copy of context corresponding to SID.
     31  * @sid: input SID
     32  * @ctx: pointer to context reference
     33  *
     34  * Return a copy of the security context corresponding to the input
     35  * @sid in the memory referenced by @ctx.  The caller is expected to
     36  * free the context with freecon().  Return %0 on success, -%1 on
     37  * failure, with @errno set to %ENOMEM if insufficient memory was
     38  * available to make the copy, or %EINVAL if the input SID is invalid.
     39  */
     40 int avc_sid_to_context(security_id_t sid, security_context_t * ctx);
     41 int avc_sid_to_context_raw(security_id_t sid, security_context_t * ctx);
     42 
     43 /**
     44  * avc_context_to_sid - get SID for context.
     45  * @ctx: input security context
     46  * @sid: pointer to SID reference
     47  *
     48  * Look up security context @ctx in SID table, making
     49  * a new entry if @ctx is not found.  Increment the
     50  * reference counter for the SID.  Store a pointer
     51  * to the SID structure into the memory referenced by @sid,
     52  * returning %0 on success or -%1 on error with @errno set.
     53  */
     54 int avc_context_to_sid(const security_context_t ctx, security_id_t * sid);
     55 int avc_context_to_sid_raw(const security_context_t ctx, security_id_t * sid);
     56 
     57 /**
     58  * sidget - increment SID reference counter.
     59  * @sid: SID reference
     60  *
     61  * Increment the reference counter for @sid, indicating that
     62  * @sid is in use by an (additional) object.  Return the
     63  * new reference count, or zero if @sid is invalid (has zero
     64  * reference count).  Note that avc_context_to_sid() also
     65  * increments reference counts.
     66  */
     67 int sidget(security_id_t sid);
     68 
     69 /**
     70  * sidput - decrement SID reference counter.
     71  * @sid: SID reference
     72  *
     73  * Decrement the reference counter for @sid, indicating that
     74  * a reference to @sid is no longer in use.  Return the
     75  * new reference count.  When the reference count reaches
     76  * zero, the SID is invalid, and avc_context_to_sid() must
     77  * be called to obtain a new SID for the security context.
     78  */
     79 int sidput(security_id_t sid);
     80 
     81 /**
     82  * avc_get_initial_sid - get SID for an initial kernel security identifier
     83  * @name: input name of initial kernel security identifier
     84  * @sid: pointer to a SID reference
     85  *
     86  * Get the context for an initial kernel security identifier specified by
     87  * @name using security_get_initial_context() and then call
     88  * avc_context_to_sid() to get the corresponding SID.
     89  */
     90 int avc_get_initial_sid(const char *name, security_id_t * sid);
     91 
     92 /*
     93  * AVC entry
     94  */
     95 struct avc_entry;
     96 struct avc_entry_ref {
     97 	struct avc_entry *ae;
     98 };
     99 
    100 /**
    101  * avc_entry_ref_init - initialize an AVC entry reference.
    102  * @aeref: pointer to avc entry reference structure
    103  *
    104  * Use this macro to initialize an avc entry reference structure
    105  * before first use.  These structures are passed to avc_has_perm(),
    106  * which stores cache entry references in them.  They can increase
    107  * performance on repeated queries.
    108  */
    109 #define avc_entry_ref_init(aeref) ((aeref)->ae = NULL)
    110 
    111 /*
    112  * User-provided callbacks for memory, auditing, and locking
    113  */
    114 
    115 /* These structures are passed by reference to avc_init().  Passing
    116  * a NULL reference will cause the AVC to use a default.  The default
    117  * memory callbacks are malloc() and free().  The default logging method
    118  * is to print on stderr.  If no thread callbacks are passed, a separate
    119  * listening thread won't be started for kernel policy change messages.
    120  * If no locking callbacks are passed, no locking will take place.
    121  */
    122 struct avc_memory_callback {
    123 	/* malloc() equivalent. */
    124 	void *(*func_malloc) (size_t size);
    125 	/* free() equivalent. */
    126 	void (*func_free) (void *ptr);
    127 	/* Note that these functions should set errno on failure.
    128 	   If not, some avc routines may return -1 without errno set. */
    129 };
    130 
    131 struct avc_log_callback {
    132 	/* log the printf-style format and arguments. */
    133 	void (*func_log) (const char *fmt, ...);
    134 	/* store a string representation of auditdata (corresponding
    135 	   to the given security class) into msgbuf. */
    136 	void (*func_audit) (void *auditdata, security_class_t cls,
    137 			    char *msgbuf, size_t msgbufsize);
    138 };
    139 
    140 struct avc_thread_callback {
    141 	/* create and start a thread, returning an opaque pointer to it;
    142 	   the thread should run the given function. */
    143 	void *(*func_create_thread) (void (*run) (void));
    144 	/* cancel a given thread and free its resources. */
    145 	void (*func_stop_thread) (void *thread);
    146 };
    147 
    148 struct avc_lock_callback {
    149 	/* create a lock and return an opaque pointer to it. */
    150 	void *(*func_alloc_lock) (void);
    151 	/* obtain a given lock, blocking if necessary. */
    152 	void (*func_get_lock) (void *lock);
    153 	/* release a given lock. */
    154 	void (*func_release_lock) (void *lock);
    155 	/* destroy a given lock (free memory, etc.) */
    156 	void (*func_free_lock) (void *lock);
    157 };
    158 
    159 /*
    160  * Available options
    161  */
    162 
    163 /* no-op option, useful for unused slots in an array of options */
    164 #define AVC_OPT_UNUSED		0
    165 /* override kernel enforcing mode (boolean value) */
    166 #define AVC_OPT_SETENFORCE	1
    167 
    168 /*
    169  * AVC operations
    170  */
    171 
    172 /**
    173  * avc_init - Initialize the AVC.
    174  * @msgprefix: prefix for log messages
    175  * @mem_callbacks: user-supplied memory callbacks
    176  * @log_callbacks: user-supplied logging callbacks
    177  * @thread_callbacks: user-supplied threading callbacks
    178  * @lock_callbacks: user-supplied locking callbacks
    179  *
    180  * Initialize the access vector cache.  Return %0 on
    181  * success or -%1 with @errno set on failure.
    182  * If @msgprefix is NULL, use "uavc".  If any callback
    183  * structure references are NULL, use default methods
    184  * for those callbacks (see the definition of the callback
    185  * structures above).
    186  */
    187 int avc_init(const char *msgprefix,
    188 	     const struct avc_memory_callback *mem_callbacks,
    189 	     const struct avc_log_callback *log_callbacks,
    190 	     const struct avc_thread_callback *thread_callbacks,
    191 	     const struct avc_lock_callback *lock_callbacks);
    192 
    193 /**
    194  * avc_open - Initialize the AVC.
    195  * @opts: array of selabel_opt structures specifying AVC options or NULL.
    196  * @nopts: number of elements in opts array or zero for no options.
    197  *
    198  * This function is identical to avc_init(), except the message prefix
    199  * is set to "avc" and any callbacks desired should be specified via
    200  * selinux_set_callback().  Available options are listed above.
    201  */
    202 int avc_open(struct selinux_opt *opts, unsigned nopts);
    203 
    204 /**
    205  * avc_cleanup - Remove unused SIDs and AVC entries.
    206  *
    207  * Search the SID table for SID structures with zero
    208  * reference counts, and remove them along with all
    209  * AVC entries that reference them.  This can be used
    210  * to return memory to the system.
    211  */
    212 void avc_cleanup(void);
    213 
    214 /**
    215  * avc_reset - Flush the cache and reset statistics.
    216  *
    217  * Remove all entries from the cache and reset all access
    218  * statistics (as returned by avc_cache_stats()) to zero.
    219  * The SID mapping is not affected.  Return %0 on success,
    220  * -%1 with @errno set on error.
    221  */
    222 int avc_reset(void);
    223 
    224 /**
    225  * avc_destroy - Free all AVC structures.
    226  *
    227  * Destroy all AVC structures and free all allocated
    228  * memory.  User-supplied locking, memory, and audit
    229  * callbacks will be retained, but security-event
    230  * callbacks will not.  All SID's will be invalidated.
    231  * User must call avc_init() if further use of AVC is desired.
    232  */
    233 void avc_destroy(void);
    234 
    235 /**
    236  * avc_has_perm_noaudit - Check permissions but perform no auditing.
    237  * @ssid: source security identifier
    238  * @tsid: target security identifier
    239  * @tclass: target security class
    240  * @requested: requested permissions, interpreted based on @tclass
    241  * @aeref:  AVC entry reference
    242  * @avd: access vector decisions
    243  *
    244  * Check the AVC to determine whether the @requested permissions are granted
    245  * for the SID pair (@ssid, @tsid), interpreting the permissions
    246  * based on @tclass, and call the security server on a cache miss to obtain
    247  * a new decision and add it to the cache.  Update @aeref to refer to an AVC
    248  * entry with the resulting decisions, and return a copy of the decisions
    249  * in @avd.  Return %0 if all @requested permissions are granted, -%1 with
    250  * @errno set to %EACCES if any permissions are denied, or to another value
    251  * upon other errors.  This function is typically called by avc_has_perm(),
    252  * but may also be called directly to separate permission checking from
    253  * auditing, e.g. in cases where a lock must be held for the check but
    254  * should be released for the auditing.
    255  */
    256 int avc_has_perm_noaudit(security_id_t ssid,
    257 			 security_id_t tsid,
    258 			 security_class_t tclass,
    259 			 access_vector_t requested,
    260 			 struct avc_entry_ref *aeref, struct av_decision *avd);
    261 
    262 /**
    263  * avc_has_perm - Check permissions and perform any appropriate auditing.
    264  * @ssid: source security identifier
    265  * @tsid: target security identifier
    266  * @tclass: target security class
    267  * @requested: requested permissions, interpreted based on @tclass
    268  * @aeref:  AVC entry reference
    269  * @auditdata: auxiliary audit data
    270  *
    271  * Check the AVC to determine whether the @requested permissions are granted
    272  * for the SID pair (@ssid, @tsid), interpreting the permissions
    273  * based on @tclass, and call the security server on a cache miss to obtain
    274  * a new decision and add it to the cache.  Update @aeref to refer to an AVC
    275  * entry with the resulting decisions.  Audit the granting or denial of
    276  * permissions in accordance with the policy.  Return %0 if all @requested
    277  * permissions are granted, -%1 with @errno set to %EACCES if any permissions
    278  * are denied or to another value upon other errors.
    279  */
    280 int avc_has_perm(security_id_t ssid, security_id_t tsid,
    281 		 security_class_t tclass, access_vector_t requested,
    282 		 struct avc_entry_ref *aeref, void *auditdata);
    283 
    284 /**
    285  * avc_audit - Audit the granting or denial of permissions.
    286  * @ssid: source security identifier
    287  * @tsid: target security identifier
    288  * @tclass: target security class
    289  * @requested: requested permissions
    290  * @avd: access vector decisions
    291  * @result: result from avc_has_perm_noaudit
    292  * @auditdata:  auxiliary audit data
    293  *
    294  * Audit the granting or denial of permissions in accordance
    295  * with the policy.  This function is typically called by
    296  * avc_has_perm() after a permission check, but can also be
    297  * called directly by callers who use avc_has_perm_noaudit()
    298  * in order to separate the permission check from the auditing.
    299  * For example, this separation is useful when the permission check must
    300  * be performed under a lock, to allow the lock to be released
    301  * before calling the auditing code.
    302  */
    303 void avc_audit(security_id_t ssid, security_id_t tsid,
    304 	       security_class_t tclass, access_vector_t requested,
    305 	       struct av_decision *avd, int result, void *auditdata);
    306 
    307 /**
    308  * avc_compute_create - Compute SID for labeling a new object.
    309  * @ssid: source security identifier
    310  * @tsid: target security identifier
    311  * @tclass: target security class
    312  * @newsid: pointer to SID reference
    313  *
    314  * Call the security server to obtain a context for labeling a
    315  * new object.  Look up the context in the SID table, making
    316  * a new entry if not found.  Increment the reference counter
    317  * for the SID.  Store a pointer to the SID structure into the
    318  * memory referenced by @newsid, returning %0 on success or -%1 on
    319  * error with @errno set.
    320  */
    321 int avc_compute_create(security_id_t ssid,
    322 		       security_id_t tsid,
    323 		       security_class_t tclass, security_id_t * newsid);
    324 
    325 /**
    326  * avc_compute_member - Compute SID for polyinstantation.
    327  * @ssid: source security identifier
    328  * @tsid: target security identifier
    329  * @tclass: target security class
    330  * @newsid: pointer to SID reference
    331  *
    332  * Call the security server to obtain a context for labeling an
    333  * object instance.  Look up the context in the SID table, making
    334  * a new entry if not found.  Increment the reference counter
    335  * for the SID.  Store a pointer to the SID structure into the
    336  * memory referenced by @newsid, returning %0 on success or -%1 on
    337  * error with @errno set.
    338  */
    339 int avc_compute_member(security_id_t ssid,
    340 		       security_id_t tsid,
    341 		       security_class_t tclass, security_id_t * newsid);
    342 
    343 /*
    344  * security event callback facility
    345  */
    346 
    347 /* security events */
    348 #define AVC_CALLBACK_GRANT		1
    349 #define AVC_CALLBACK_TRY_REVOKE		2
    350 #define AVC_CALLBACK_REVOKE		4
    351 #define AVC_CALLBACK_RESET		8
    352 #define AVC_CALLBACK_AUDITALLOW_ENABLE	16
    353 #define AVC_CALLBACK_AUDITALLOW_DISABLE	32
    354 #define AVC_CALLBACK_AUDITDENY_ENABLE	64
    355 #define AVC_CALLBACK_AUDITDENY_DISABLE	128
    356 
    357 /**
    358  * avc_add_callback - Register a callback for security events.
    359  * @callback: callback function
    360  * @events: bitwise OR of desired security events
    361  * @ssid: source security identifier or %SECSID_WILD
    362  * @tsid: target security identifier or %SECSID_WILD
    363  * @tclass: target security class
    364  * @perms: permissions
    365  *
    366  * Register a callback function for events in the set @events
    367  * related to the SID pair (@ssid, @tsid) and
    368  * and the permissions @perms, interpreting
    369  * @perms based on @tclass.  Returns %0 on success or
    370  * -%1 if insufficient memory exists to add the callback.
    371  */
    372 int avc_add_callback(int (*callback)
    373 		      (uint32_t event, security_id_t ssid,
    374 		       security_id_t tsid, security_class_t tclass,
    375 		       access_vector_t perms,
    376 		       access_vector_t * out_retained),
    377 		     uint32_t events, security_id_t ssid,
    378 		     security_id_t tsid, security_class_t tclass,
    379 		     access_vector_t perms);
    380 
    381 /*
    382  * AVC statistics
    383  */
    384 
    385 /* If set, cache statistics are tracked.  This may
    386  * become a compile-time option in the future.
    387  */
    388 #define AVC_CACHE_STATS     1
    389 
    390 struct avc_cache_stats {
    391 	unsigned entry_lookups;
    392 	unsigned entry_hits;
    393 	unsigned entry_misses;
    394 	unsigned entry_discards;
    395 	unsigned cav_lookups;
    396 	unsigned cav_hits;
    397 	unsigned cav_probes;
    398 	unsigned cav_misses;
    399 };
    400 
    401 /**
    402  * avc_cache_stats - get cache access statistics.
    403  * @stats: reference to statistics structure
    404  *
    405  * Fill the supplied structure with information about AVC
    406  * activity since the last call to avc_init() or
    407  * avc_reset().  See the structure definition for
    408  * details.
    409  */
    410 void avc_cache_stats(struct avc_cache_stats *stats);
    411 
    412 /**
    413  * avc_av_stats - log av table statistics.
    414  *
    415  * Log a message with information about the size and
    416  * distribution of the access vector table.  The audit
    417  * callback is used to print the message.
    418  */
    419 void avc_av_stats(void);
    420 
    421 /**
    422  * avc_sid_stats - log SID table statistics.
    423  *
    424  * Log a message with information about the size and
    425  * distribution of the SID table.  The audit callback
    426  * is used to print the message.
    427  */
    428 void avc_sid_stats(void);
    429 
    430 /**
    431  * avc_netlink_open - Create a netlink socket and connect to the kernel.
    432  */
    433 int avc_netlink_open(int blocking);
    434 
    435 /**
    436  * avc_netlink_loop - Wait for netlink messages from the kernel
    437  */
    438 void avc_netlink_loop(void);
    439 
    440 /**
    441  * avc_netlink_close - Close the netlink socket
    442  */
    443 void avc_netlink_close(void);
    444 
    445 /**
    446  * avc_netlink_acquire_fd - Acquire netlink socket fd.
    447  *
    448  * Allows the application to manage messages from the netlink socket in
    449  * its own main loop.
    450  */
    451 int avc_netlink_acquire_fd(void);
    452 
    453 /**
    454  * avc_netlink_release_fd - Release netlink socket fd.
    455  *
    456  * Returns ownership of the netlink socket to the library.
    457  */
    458 void avc_netlink_release_fd(void);
    459 
    460 /**
    461  * avc_netlink_check_nb - Check netlink socket for new messages.
    462  *
    463  * Called by the application when using avc_netlink_acquire_fd() to
    464  * process kernel netlink events.
    465  */
    466 int avc_netlink_check_nb(void);
    467 
    468 /**
    469  * selinux_status_open - Open and map SELinux kernel status page
    470  *
    471  */
    472 int selinux_status_open(int fallback);
    473 
    474 /**
    475  * selinux_status_close - Unmap and close SELinux kernel status page
    476  *
    477  */
    478 void selinux_status_close(void);
    479 
    480 /**
    481  * selinux_status_updated - Inform us whether the kernel status has been updated
    482  *
    483  */
    484 int selinux_status_updated(void);
    485 
    486 /**
    487  * selinux_status_getenforce - Get the enforce flag value
    488  *
    489  */
    490 int selinux_status_getenforce(void);
    491 
    492 /**
    493  * selinux_status_policyload - Get the number of policy reloaded
    494  *
    495  */
    496 int selinux_status_policyload(void);
    497 
    498 /**
    499  * selinux_status_deny_unknown - Get the  behavior for undefined classes/permissions
    500  *
    501  */
    502 int selinux_status_deny_unknown(void);
    503 
    504 #ifdef __cplusplus
    505 }
    506 #endif
    507 #endif				/* _SELINUX_AVC_H_ */
    508