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