linux/security/selinux/include/security.h
<<
>>
Prefs
   1/*
   2 * Security server interface.
   3 *
   4 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
   5 *
   6 */
   7
   8#ifndef _SELINUX_SECURITY_H_
   9#define _SELINUX_SECURITY_H_
  10
  11#include <linux/compiler.h>
  12#include <linux/dcache.h>
  13#include <linux/magic.h>
  14#include <linux/types.h>
  15#include "flask.h"
  16
  17#define SECSID_NULL                     0x00000000 /* unspecified SID */
  18#define SECSID_WILD                     0xffffffff /* wildcard SID */
  19#define SECCLASS_NULL                   0x0000 /* no class */
  20
  21/* Identify specific policy version changes */
  22#define POLICYDB_VERSION_BASE           15
  23#define POLICYDB_VERSION_BOOL           16
  24#define POLICYDB_VERSION_IPV6           17
  25#define POLICYDB_VERSION_NLCLASS        18
  26#define POLICYDB_VERSION_VALIDATETRANS  19
  27#define POLICYDB_VERSION_MLS            19
  28#define POLICYDB_VERSION_AVTAB          20
  29#define POLICYDB_VERSION_RANGETRANS     21
  30#define POLICYDB_VERSION_POLCAP         22
  31#define POLICYDB_VERSION_PERMISSIVE     23
  32#define POLICYDB_VERSION_BOUNDARY       24
  33#define POLICYDB_VERSION_FILENAME_TRANS 25
  34#define POLICYDB_VERSION_ROLETRANS      26
  35#define POLICYDB_VERSION_NEW_OBJECT_DEFAULTS    27
  36#define POLICYDB_VERSION_DEFAULT_TYPE   28
  37#define POLICYDB_VERSION_CONSTRAINT_NAMES       29
  38#define POLICYDB_VERSION_XPERMS_IOCTL   30
  39
  40/* Range of policy versions we understand*/
  41#define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
  42#ifdef CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX
  43#define POLICYDB_VERSION_MAX    CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE
  44#else
  45#define POLICYDB_VERSION_MAX    POLICYDB_VERSION_XPERMS_IOCTL
  46#endif
  47
  48/* Mask for just the mount related flags */
  49#define SE_MNTMASK      0x0f
  50/* Super block security struct flags for mount options */
  51/* BE CAREFUL, these need to be the low order bits for selinux_get_mnt_opts */
  52#define CONTEXT_MNT     0x01
  53#define FSCONTEXT_MNT   0x02
  54#define ROOTCONTEXT_MNT 0x04
  55#define DEFCONTEXT_MNT  0x08
  56#define SBLABEL_MNT     0x10
  57/* Non-mount related flags */
  58#define SE_SBINITIALIZED        0x0100
  59#define SE_SBPROC               0x0200
  60#define SE_SBGENFS              0x0400
  61
  62#define CONTEXT_STR     "context="
  63#define FSCONTEXT_STR   "fscontext="
  64#define ROOTCONTEXT_STR "rootcontext="
  65#define DEFCONTEXT_STR  "defcontext="
  66#define LABELSUPP_STR "seclabel"
  67
  68struct netlbl_lsm_secattr;
  69
  70extern int selinux_enabled;
  71
  72/* Policy capabilities */
  73enum {
  74        POLICYDB_CAPABILITY_NETPEER,
  75        POLICYDB_CAPABILITY_OPENPERM,
  76        POLICYDB_CAPABILITY_REDHAT1,
  77        POLICYDB_CAPABILITY_ALWAYSNETWORK,
  78        __POLICYDB_CAPABILITY_MAX
  79};
  80#define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)
  81
  82extern int selinux_policycap_netpeer;
  83extern int selinux_policycap_openperm;
  84extern int selinux_policycap_alwaysnetwork;
  85
  86/*
  87 * type_datum properties
  88 * available at the kernel policy version >= POLICYDB_VERSION_BOUNDARY
  89 */
  90#define TYPEDATUM_PROPERTY_PRIMARY      0x0001
  91#define TYPEDATUM_PROPERTY_ATTRIBUTE    0x0002
  92
  93/* limitation of boundary depth  */
  94#define POLICYDB_BOUNDS_MAXDEPTH        4
  95
  96int security_mls_enabled(void);
  97
  98int security_load_policy(void *data, size_t len);
  99int security_read_policy(void **data, size_t *len);
 100size_t security_policydb_len(void);
 101
 102int security_policycap_supported(unsigned int req_cap);
 103
 104#define SEL_VEC_MAX 32
 105struct av_decision {
 106        u32 allowed;
 107        u32 auditallow;
 108        u32 auditdeny;
 109        u32 seqno;
 110        u32 flags;
 111};
 112
 113#define XPERMS_ALLOWED 1
 114#define XPERMS_AUDITALLOW 2
 115#define XPERMS_DONTAUDIT 4
 116
 117#define security_xperm_set(perms, x) (perms[x >> 5] |= 1 << (x & 0x1f))
 118#define security_xperm_test(perms, x) (1 & (perms[x >> 5] >> (x & 0x1f)))
 119struct extended_perms_data {
 120        u32 p[8];
 121};
 122
 123struct extended_perms_decision {
 124        u8 used;
 125        u8 driver;
 126        struct extended_perms_data *allowed;
 127        struct extended_perms_data *auditallow;
 128        struct extended_perms_data *dontaudit;
 129};
 130
 131struct extended_perms {
 132        u16 len;        /* length associated decision chain */
 133        struct extended_perms_data drivers; /* flag drivers that are used */
 134};
 135
 136/* definitions of av_decision.flags */
 137#define AVD_FLAGS_PERMISSIVE    0x0001
 138
 139void security_compute_av(u32 ssid, u32 tsid,
 140                         u16 tclass, struct av_decision *avd,
 141                         struct extended_perms *xperms);
 142
 143void security_compute_xperms_decision(u32 ssid, u32 tsid, u16 tclass,
 144                         u8 driver, struct extended_perms_decision *xpermd);
 145
 146void security_compute_av_user(u32 ssid, u32 tsid,
 147                             u16 tclass, struct av_decision *avd);
 148
 149int security_transition_sid(u32 ssid, u32 tsid, u16 tclass,
 150                            const struct qstr *qstr, u32 *out_sid);
 151
 152int security_transition_sid_user(u32 ssid, u32 tsid, u16 tclass,
 153                                 const char *objname, u32 *out_sid);
 154
 155int security_member_sid(u32 ssid, u32 tsid,
 156        u16 tclass, u32 *out_sid);
 157
 158int security_change_sid(u32 ssid, u32 tsid,
 159        u16 tclass, u32 *out_sid);
 160
 161int security_sid_to_context(u32 sid, char **scontext,
 162        u32 *scontext_len);
 163
 164int security_sid_to_context_force(u32 sid, char **scontext, u32 *scontext_len);
 165
 166int security_context_to_sid(const char *scontext, u32 scontext_len,
 167                            u32 *out_sid, gfp_t gfp);
 168
 169int security_context_str_to_sid(const char *scontext, u32 *out_sid, gfp_t gfp);
 170
 171int security_context_to_sid_default(const char *scontext, u32 scontext_len,
 172                                    u32 *out_sid, u32 def_sid, gfp_t gfp_flags);
 173
 174int security_context_to_sid_force(const char *scontext, u32 scontext_len,
 175                                  u32 *sid);
 176
 177int security_get_user_sids(u32 callsid, char *username,
 178                           u32 **sids, u32 *nel);
 179
 180int security_port_sid(u8 protocol, u16 port, u32 *out_sid);
 181
 182int security_netif_sid(char *name, u32 *if_sid);
 183
 184int security_node_sid(u16 domain, void *addr, u32 addrlen,
 185        u32 *out_sid);
 186
 187int security_validate_transition(u32 oldsid, u32 newsid, u32 tasksid,
 188                                 u16 tclass);
 189
 190int security_bounded_transition(u32 oldsid, u32 newsid);
 191
 192int security_sid_mls_copy(u32 sid, u32 mls_sid, u32 *new_sid);
 193
 194int security_net_peersid_resolve(u32 nlbl_sid, u32 nlbl_type,
 195                                 u32 xfrm_sid,
 196                                 u32 *peer_sid);
 197
 198int security_get_classes(char ***classes, int *nclasses);
 199int security_get_permissions(char *class, char ***perms, int *nperms);
 200int security_get_reject_unknown(void);
 201int security_get_allow_unknown(void);
 202
 203#define SECURITY_FS_USE_XATTR           1 /* use xattr */
 204#define SECURITY_FS_USE_TRANS           2 /* use transition SIDs, e.g. devpts/tmpfs */
 205#define SECURITY_FS_USE_TASK            3 /* use task SIDs, e.g. pipefs/sockfs */
 206#define SECURITY_FS_USE_GENFS           4 /* use the genfs support */
 207#define SECURITY_FS_USE_NONE            5 /* no labeling support */
 208#define SECURITY_FS_USE_MNTPOINT        6 /* use mountpoint labeling */
 209#define SECURITY_FS_USE_NATIVE          7 /* use native label support */
 210#define SECURITY_FS_USE_MAX             7 /* Highest SECURITY_FS_USE_XXX */
 211
 212int security_fs_use(struct super_block *sb);
 213
 214int security_genfs_sid(const char *fstype, char *name, u16 sclass,
 215        u32 *sid);
 216
 217#ifdef CONFIG_NETLABEL
 218int security_netlbl_secattr_to_sid(struct netlbl_lsm_secattr *secattr,
 219                                   u32 *sid);
 220
 221int security_netlbl_sid_to_secattr(u32 sid,
 222                                   struct netlbl_lsm_secattr *secattr);
 223#else
 224static inline int security_netlbl_secattr_to_sid(
 225                                            struct netlbl_lsm_secattr *secattr,
 226                                            u32 *sid)
 227{
 228        return -EIDRM;
 229}
 230
 231static inline int security_netlbl_sid_to_secattr(u32 sid,
 232                                           struct netlbl_lsm_secattr *secattr)
 233{
 234        return -ENOENT;
 235}
 236#endif /* CONFIG_NETLABEL */
 237
 238const char *security_get_initial_sid_context(u32 sid);
 239
 240/*
 241 * status notifier using mmap interface
 242 */
 243extern struct page *selinux_kernel_status_page(void);
 244
 245#define SELINUX_KERNEL_STATUS_VERSION   1
 246struct selinux_kernel_status {
 247        u32     version;        /* version number of thie structure */
 248        u32     sequence;       /* sequence number of seqlock logic */
 249        u32     enforcing;      /* current setting of enforcing mode */
 250        u32     policyload;     /* times of policy reloaded */
 251        u32     deny_unknown;   /* current setting of deny_unknown */
 252        /*
 253         * The version > 0 supports above members.
 254         */
 255} __packed;
 256
 257extern void selinux_status_update_setenforce(int enforcing);
 258extern void selinux_status_update_policyload(int seqno);
 259extern void selinux_complete_init(void);
 260extern int selinux_disable(void);
 261extern void exit_sel_fs(void);
 262extern struct path selinux_null;
 263extern struct vfsmount *selinuxfs_mount;
 264extern void selnl_notify_setenforce(int val);
 265extern void selnl_notify_policyload(u32 seqno);
 266extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
 267
 268#endif /* _SELINUX_SECURITY_H_ */
 269
 270