diff options
Diffstat (limited to 'security/selinux/include/avc.h')
| -rw-r--r-- | security/selinux/include/avc.h | 137 | 
1 files changed, 137 insertions, 0 deletions
diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h new file mode 100644 index 00000000000..960ef18ddc4 --- /dev/null +++ b/security/selinux/include/avc.h @@ -0,0 +1,137 @@ +/* + * Access vector cache interface for object managers. + * + * Author : Stephen Smalley, <sds@epoch.ncsc.mil> + */ +#ifndef _SELINUX_AVC_H_ +#define _SELINUX_AVC_H_ + +#include <linux/stddef.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/kdev_t.h> +#include <linux/spinlock.h> +#include <linux/init.h> +#include <linux/in6.h> +#include <asm/system.h> +#include "flask.h" +#include "av_permissions.h" +#include "security.h" + +#ifdef CONFIG_SECURITY_SELINUX_DEVELOP +extern int selinux_enforcing; +#else +#define selinux_enforcing 1 +#endif + +/* + * An entry in the AVC. + */ +struct avc_entry; + +struct task_struct; +struct vfsmount; +struct dentry; +struct inode; +struct sock; +struct sk_buff; + +/* Auxiliary data to use in generating the audit record. */ +struct avc_audit_data { +	char    type; +#define AVC_AUDIT_DATA_FS   1 +#define AVC_AUDIT_DATA_NET  2 +#define AVC_AUDIT_DATA_CAP  3 +#define AVC_AUDIT_DATA_IPC  4 +	struct task_struct *tsk; +	union 	{ +		struct { +			struct vfsmount *mnt; +			struct dentry *dentry; +			struct inode *inode; +		} fs; +		struct { +			char *netif; +			struct sock *sk; +			u16 family; +			u16 dport; +			u16 sport; +			union { +				struct { +					u32 daddr; +					u32 saddr; +				} v4; +				struct { +					struct in6_addr daddr; +					struct in6_addr saddr; +				} v6; +			} fam; +		} net; +		int cap; +		int ipc_id; +	} u; +}; + +#define v4info fam.v4 +#define v6info fam.v6 + +/* Initialize an AVC audit data structure. */ +#define AVC_AUDIT_DATA_INIT(_d,_t) \ +        { memset((_d), 0, sizeof(struct avc_audit_data)); (_d)->type = AVC_AUDIT_DATA_##_t; } + +/* + * AVC statistics + */ +struct avc_cache_stats +{ +	unsigned int lookups; +	unsigned int hits; +	unsigned int misses; +	unsigned int allocations; +	unsigned int reclaims; +	unsigned int frees; +}; + +/* + * AVC operations + */ + +void __init avc_init(void); + +void avc_audit(u32 ssid, u32 tsid, +               u16 tclass, u32 requested, +               struct av_decision *avd, int result, struct avc_audit_data *auditdata); + +int avc_has_perm_noaudit(u32 ssid, u32 tsid, +                         u16 tclass, u32 requested, +                         struct av_decision *avd); + +int avc_has_perm(u32 ssid, u32 tsid, +                 u16 tclass, u32 requested, +                 struct avc_audit_data *auditdata); + +#define AVC_CALLBACK_GRANT		1 +#define AVC_CALLBACK_TRY_REVOKE		2 +#define AVC_CALLBACK_REVOKE		4 +#define AVC_CALLBACK_RESET		8 +#define AVC_CALLBACK_AUDITALLOW_ENABLE	16 +#define AVC_CALLBACK_AUDITALLOW_DISABLE	32 +#define AVC_CALLBACK_AUDITDENY_ENABLE	64 +#define AVC_CALLBACK_AUDITDENY_DISABLE	128 + +int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid, +                                     u16 tclass, u32 perms, +				     u32 *out_retained), +		     u32 events, u32 ssid, u32 tsid, +		     u16 tclass, u32 perms); + +/* Exported to selinuxfs */ +int avc_get_hash_stats(char *page); +extern unsigned int avc_cache_threshold; + +#ifdef CONFIG_SECURITY_SELINUX_AVC_STATS +DECLARE_PER_CPU(struct avc_cache_stats, avc_cache_stats); +#endif + +#endif /* _SELINUX_AVC_H_ */ +  |