linux/security/selinux/include/avc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Access vector cache interface for object managers.
   4 *
   5 * Author : Stephen Smalley, <sds@tycho.nsa.gov>
   6 */
   7#ifndef _SELINUX_AVC_H_
   8#define _SELINUX_AVC_H_
   9
  10#include <linux/stddef.h>
  11#include <linux/errno.h>
  12#include <linux/kernel.h>
  13#include <linux/kdev_t.h>
  14#include <linux/spinlock.h>
  15#include <linux/init.h>
  16#include <linux/audit.h>
  17#include <linux/lsm_audit.h>
  18#include <linux/in6.h>
  19#include "flask.h"
  20#include "av_permissions.h"
  21#include "security.h"
  22
  23/*
  24 * An entry in the AVC.
  25 */
  26struct avc_entry;
  27
  28struct task_struct;
  29struct inode;
  30struct sock;
  31struct sk_buff;
  32
  33/*
  34 * AVC statistics
  35 */
  36struct avc_cache_stats {
  37        unsigned int lookups;
  38        unsigned int misses;
  39        unsigned int allocations;
  40        unsigned int reclaims;
  41        unsigned int frees;
  42};
  43
  44/*
  45 * We only need this data after we have decided to send an audit message.
  46 */
  47struct selinux_audit_data {
  48        u32 ssid;
  49        u32 tsid;
  50        u16 tclass;
  51        u32 requested;
  52        u32 audited;
  53        u32 denied;
  54        int result;
  55        struct selinux_state *state;
  56};
  57
  58/*
  59 * AVC operations
  60 */
  61
  62void __init avc_init(void);
  63
  64static inline u32 avc_audit_required(u32 requested,
  65                              struct av_decision *avd,
  66                              int result,
  67                              u32 auditdeny,
  68                              u32 *deniedp)
  69{
  70        u32 denied, audited;
  71        denied = requested & ~avd->allowed;
  72        if (unlikely(denied)) {
  73                audited = denied & avd->auditdeny;
  74                /*
  75                 * auditdeny is TRICKY!  Setting a bit in
  76                 * this field means that ANY denials should NOT be audited if
  77                 * the policy contains an explicit dontaudit rule for that
  78                 * permission.  Take notice that this is unrelated to the
  79                 * actual permissions that were denied.  As an example lets
  80                 * assume:
  81                 *
  82                 * denied == READ
  83                 * avd.auditdeny & ACCESS == 0 (not set means explicit rule)
  84                 * auditdeny & ACCESS == 1
  85                 *
  86                 * We will NOT audit the denial even though the denied
  87                 * permission was READ and the auditdeny checks were for
  88                 * ACCESS
  89                 */
  90                if (auditdeny && !(auditdeny & avd->auditdeny))
  91                        audited = 0;
  92        } else if (result)
  93                audited = denied = requested;
  94        else
  95                audited = requested & avd->auditallow;
  96        *deniedp = denied;
  97        return audited;
  98}
  99
 100int slow_avc_audit(struct selinux_state *state,
 101                   u32 ssid, u32 tsid, u16 tclass,
 102                   u32 requested, u32 audited, u32 denied, int result,
 103                   struct common_audit_data *a);
 104
 105/**
 106 * avc_audit - Audit the granting or denial of permissions.
 107 * @ssid: source security identifier
 108 * @tsid: target security identifier
 109 * @tclass: target security class
 110 * @requested: requested permissions
 111 * @avd: access vector decisions
 112 * @result: result from avc_has_perm_noaudit
 113 * @a:  auxiliary audit data
 114 * @flags: VFS walk flags
 115 *
 116 * Audit the granting or denial of permissions in accordance
 117 * with the policy.  This function is typically called by
 118 * avc_has_perm() after a permission check, but can also be
 119 * called directly by callers who use avc_has_perm_noaudit()
 120 * in order to separate the permission check from the auditing.
 121 * For example, this separation is useful when the permission check must
 122 * be performed under a lock, to allow the lock to be released
 123 * before calling the auditing code.
 124 */
 125static inline int avc_audit(struct selinux_state *state,
 126                            u32 ssid, u32 tsid,
 127                            u16 tclass, u32 requested,
 128                            struct av_decision *avd,
 129                            int result,
 130                            struct common_audit_data *a,
 131                            int flags)
 132{
 133        u32 audited, denied;
 134        audited = avc_audit_required(requested, avd, result, 0, &denied);
 135        if (likely(!audited))
 136                return 0;
 137        /* fall back to ref-walk if we have to generate audit */
 138        if (flags & MAY_NOT_BLOCK)
 139                return -ECHILD;
 140        return slow_avc_audit(state, ssid, tsid, tclass,
 141                              requested, audited, denied, result,
 142                              a);
 143}
 144
 145#define AVC_STRICT 1 /* Ignore permissive mode. */
 146#define AVC_EXTENDED_PERMS 2    /* update extended permissions */
 147#define AVC_NONBLOCKING    4    /* non blocking */
 148int avc_has_perm_noaudit(struct selinux_state *state,
 149                         u32 ssid, u32 tsid,
 150                         u16 tclass, u32 requested,
 151                         unsigned flags,
 152                         struct av_decision *avd);
 153
 154int avc_has_perm(struct selinux_state *state,
 155                 u32 ssid, u32 tsid,
 156                 u16 tclass, u32 requested,
 157                 struct common_audit_data *auditdata);
 158int avc_has_perm_flags(struct selinux_state *state,
 159                       u32 ssid, u32 tsid,
 160                       u16 tclass, u32 requested,
 161                       struct common_audit_data *auditdata,
 162                       int flags);
 163
 164int avc_has_extended_perms(struct selinux_state *state,
 165                           u32 ssid, u32 tsid, u16 tclass, u32 requested,
 166                           u8 driver, u8 perm, struct common_audit_data *ad);
 167
 168
 169u32 avc_policy_seqno(struct selinux_state *state);
 170
 171#define AVC_CALLBACK_GRANT              1
 172#define AVC_CALLBACK_TRY_REVOKE         2
 173#define AVC_CALLBACK_REVOKE             4
 174#define AVC_CALLBACK_RESET              8
 175#define AVC_CALLBACK_AUDITALLOW_ENABLE  16
 176#define AVC_CALLBACK_AUDITALLOW_DISABLE 32
 177#define AVC_CALLBACK_AUDITDENY_ENABLE   64
 178#define AVC_CALLBACK_AUDITDENY_DISABLE  128
 179#define AVC_CALLBACK_ADD_XPERMS         256
 180
 181int avc_add_callback(int (*callback)(u32 event), u32 events);
 182
 183/* Exported to selinuxfs */
 184struct selinux_avc;
 185int avc_get_hash_stats(struct selinux_avc *avc, char *page);
 186unsigned int avc_get_cache_threshold(struct selinux_avc *avc);
 187void avc_set_cache_threshold(struct selinux_avc *avc,
 188                             unsigned int cache_threshold);
 189
 190/* Attempt to free avc node cache */
 191void avc_disable(void);
 192
 193#ifdef CONFIG_SECURITY_SELINUX_AVC_STATS
 194DECLARE_PER_CPU(struct avc_cache_stats, avc_cache_stats);
 195#endif
 196
 197#endif /* _SELINUX_AVC_H_ */
 198
 199