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                   unsigned flags);
 105
 106/**
 107 * avc_audit - Audit the granting or denial of permissions.
 108 * @ssid: source security identifier
 109 * @tsid: target security identifier
 110 * @tclass: target security class
 111 * @requested: requested permissions
 112 * @avd: access vector decisions
 113 * @result: result from avc_has_perm_noaudit
 114 * @a:  auxiliary audit data
 115 * @flags: VFS walk flags
 116 *
 117 * Audit the granting or denial of permissions in accordance
 118 * with the policy.  This function is typically called by
 119 * avc_has_perm() after a permission check, but can also be
 120 * called directly by callers who use avc_has_perm_noaudit()
 121 * in order to separate the permission check from the auditing.
 122 * For example, this separation is useful when the permission check must
 123 * be performed under a lock, to allow the lock to be released
 124 * before calling the auditing code.
 125 */
 126static inline int avc_audit(struct selinux_state *state,
 127                            u32 ssid, u32 tsid,
 128                            u16 tclass, u32 requested,
 129                            struct av_decision *avd,
 130                            int result,
 131                            struct common_audit_data *a,
 132                            int flags)
 133{
 134        u32 audited, denied;
 135        audited = avc_audit_required(requested, avd, result, 0, &denied);
 136        if (likely(!audited))
 137                return 0;
 138        return slow_avc_audit(state, ssid, tsid, tclass,
 139                              requested, audited, denied, result,
 140                              a, flags);
 141}
 142
 143#define AVC_STRICT 1 /* Ignore permissive mode. */
 144#define AVC_EXTENDED_PERMS 2    /* update extended permissions */
 145#define AVC_NONBLOCKING    4    /* non blocking */
 146int avc_has_perm_noaudit(struct selinux_state *state,
 147                         u32 ssid, u32 tsid,
 148                         u16 tclass, u32 requested,
 149                         unsigned flags,
 150                         struct av_decision *avd);
 151
 152int avc_has_perm(struct selinux_state *state,
 153                 u32 ssid, u32 tsid,
 154                 u16 tclass, u32 requested,
 155                 struct common_audit_data *auditdata);
 156
 157int avc_has_extended_perms(struct selinux_state *state,
 158                           u32 ssid, u32 tsid, u16 tclass, u32 requested,
 159                           u8 driver, u8 perm, struct common_audit_data *ad);
 160
 161
 162u32 avc_policy_seqno(struct selinux_state *state);
 163
 164#define AVC_CALLBACK_GRANT              1
 165#define AVC_CALLBACK_TRY_REVOKE         2
 166#define AVC_CALLBACK_REVOKE             4
 167#define AVC_CALLBACK_RESET              8
 168#define AVC_CALLBACK_AUDITALLOW_ENABLE  16
 169#define AVC_CALLBACK_AUDITALLOW_DISABLE 32
 170#define AVC_CALLBACK_AUDITDENY_ENABLE   64
 171#define AVC_CALLBACK_AUDITDENY_DISABLE  128
 172#define AVC_CALLBACK_ADD_XPERMS         256
 173
 174int avc_add_callback(int (*callback)(u32 event), u32 events);
 175
 176/* Exported to selinuxfs */
 177struct selinux_avc;
 178int avc_get_hash_stats(struct selinux_avc *avc, char *page);
 179unsigned int avc_get_cache_threshold(struct selinux_avc *avc);
 180void avc_set_cache_threshold(struct selinux_avc *avc,
 181                             unsigned int cache_threshold);
 182
 183/* Attempt to free avc node cache */
 184void avc_disable(void);
 185
 186#ifdef CONFIG_SECURITY_SELINUX_AVC_STATS
 187DECLARE_PER_CPU(struct avc_cache_stats, avc_cache_stats);
 188#endif
 189
 190#endif /* _SELINUX_AVC_H_ */
 191
 192