LCOV - code coverage report
Current view: top level - security/selinux/include - security.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 18 24 75.0 %
Date: 2022-04-01 14:58:12 Functions: 0 0 -
Branches: 16 87 18.4 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : /*
       3                 :            :  * Security server interface.
       4                 :            :  *
       5                 :            :  * Author : Stephen Smalley, <sds@tycho.nsa.gov>
       6                 :            :  *
       7                 :            :  */
       8                 :            : 
       9                 :            : #ifndef _SELINUX_SECURITY_H_
      10                 :            : #define _SELINUX_SECURITY_H_
      11                 :            : 
      12                 :            : #include <linux/compiler.h>
      13                 :            : #include <linux/dcache.h>
      14                 :            : #include <linux/magic.h>
      15                 :            : #include <linux/types.h>
      16                 :            : #include <linux/refcount.h>
      17                 :            : #include <linux/workqueue.h>
      18                 :            : #include "flask.h"
      19                 :            : 
      20                 :            : #define SECSID_NULL                     0x00000000 /* unspecified SID */
      21                 :            : #define SECSID_WILD                     0xffffffff /* wildcard SID */
      22                 :            : #define SECCLASS_NULL                   0x0000 /* no class */
      23                 :            : 
      24                 :            : /* Identify specific policy version changes */
      25                 :            : #define POLICYDB_VERSION_BASE           15
      26                 :            : #define POLICYDB_VERSION_BOOL           16
      27                 :            : #define POLICYDB_VERSION_IPV6           17
      28                 :            : #define POLICYDB_VERSION_NLCLASS        18
      29                 :            : #define POLICYDB_VERSION_VALIDATETRANS  19
      30                 :            : #define POLICYDB_VERSION_MLS            19
      31                 :            : #define POLICYDB_VERSION_AVTAB          20
      32                 :            : #define POLICYDB_VERSION_RANGETRANS     21
      33                 :            : #define POLICYDB_VERSION_POLCAP         22
      34                 :            : #define POLICYDB_VERSION_PERMISSIVE     23
      35                 :            : #define POLICYDB_VERSION_BOUNDARY       24
      36                 :            : #define POLICYDB_VERSION_FILENAME_TRANS 25
      37                 :            : #define POLICYDB_VERSION_ROLETRANS      26
      38                 :            : #define POLICYDB_VERSION_NEW_OBJECT_DEFAULTS    27
      39                 :            : #define POLICYDB_VERSION_DEFAULT_TYPE   28
      40                 :            : #define POLICYDB_VERSION_CONSTRAINT_NAMES       29
      41                 :            : #define POLICYDB_VERSION_XPERMS_IOCTL   30
      42                 :            : #define POLICYDB_VERSION_INFINIBAND             31
      43                 :            : #define POLICYDB_VERSION_GLBLUB         32
      44                 :            : 
      45                 :            : /* Range of policy versions we understand*/
      46                 :            : #define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
      47                 :            : #define POLICYDB_VERSION_MAX   POLICYDB_VERSION_GLBLUB
      48                 :            : 
      49                 :            : /* Mask for just the mount related flags */
      50                 :            : #define SE_MNTMASK      0x0f
      51                 :            : /* Super block security struct flags for mount options */
      52                 :            : /* BE CAREFUL, these need to be the low order bits for selinux_get_mnt_opts */
      53                 :            : #define CONTEXT_MNT     0x01
      54                 :            : #define FSCONTEXT_MNT   0x02
      55                 :            : #define ROOTCONTEXT_MNT 0x04
      56                 :            : #define DEFCONTEXT_MNT  0x08
      57                 :            : #define SBLABEL_MNT     0x10
      58                 :            : /* Non-mount related flags */
      59                 :            : #define SE_SBINITIALIZED        0x0100
      60                 :            : #define SE_SBPROC               0x0200
      61                 :            : #define SE_SBGENFS              0x0400
      62                 :            : #define SE_SBGENFS_XATTR        0x0800
      63                 :            : 
      64                 :            : #define CONTEXT_STR     "context"
      65                 :            : #define FSCONTEXT_STR   "fscontext"
      66                 :            : #define ROOTCONTEXT_STR "rootcontext"
      67                 :            : #define DEFCONTEXT_STR  "defcontext"
      68                 :            : #define SECLABEL_STR "seclabel"
      69                 :            : 
      70                 :            : struct netlbl_lsm_secattr;
      71                 :            : 
      72                 :            : extern int selinux_enabled_boot;
      73                 :            : 
      74                 :            : /* Policy capabilities */
      75                 :            : enum {
      76                 :            :         POLICYDB_CAPABILITY_NETPEER,
      77                 :            :         POLICYDB_CAPABILITY_OPENPERM,
      78                 :            :         POLICYDB_CAPABILITY_EXTSOCKCLASS,
      79                 :            :         POLICYDB_CAPABILITY_ALWAYSNETWORK,
      80                 :            :         POLICYDB_CAPABILITY_CGROUPSECLABEL,
      81                 :            :         POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION,
      82                 :            :         __POLICYDB_CAPABILITY_MAX
      83                 :            : };
      84                 :            : #define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)
      85                 :            : 
      86                 :            : extern const char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX];
      87                 :            : 
      88                 :            : /*
      89                 :            :  * type_datum properties
      90                 :            :  * available at the kernel policy version >= POLICYDB_VERSION_BOUNDARY
      91                 :            :  */
      92                 :            : #define TYPEDATUM_PROPERTY_PRIMARY      0x0001
      93                 :            : #define TYPEDATUM_PROPERTY_ATTRIBUTE    0x0002
      94                 :            : 
      95                 :            : /* limitation of boundary depth  */
      96                 :            : #define POLICYDB_BOUNDS_MAXDEPTH        4
      97                 :            : 
      98                 :            : struct selinux_avc;
      99                 :            : struct selinux_ss;
     100                 :            : 
     101                 :            : struct selinux_state {
     102                 :            : #ifdef CONFIG_SECURITY_SELINUX_DISABLE
     103                 :            :         bool disabled;
     104                 :            : #endif
     105                 :            : #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
     106                 :            :         bool enforcing;
     107                 :            : #endif
     108                 :            :         bool checkreqprot;
     109                 :            :         bool initialized;
     110                 :            :         bool policycap[__POLICYDB_CAPABILITY_MAX];
     111                 :            :         struct selinux_avc *avc;
     112                 :            :         struct selinux_ss *ss;
     113                 :            : } __randomize_layout;
     114                 :            : 
     115                 :            : void selinux_ss_init(struct selinux_ss **ss);
     116                 :            : void selinux_avc_init(struct selinux_avc **avc);
     117                 :            : 
     118                 :            : extern struct selinux_state selinux_state;
     119                 :            : 
     120                 :    1317036 : static inline bool selinux_initialized(const struct selinux_state *state)
     121                 :            : {
     122                 :            :         /* do a synchronized load to avoid race conditions */
     123   [ -  -  -  +  :    1317036 :         return smp_load_acquire(&state->initialized);
          -  -  -  +  +  
          -  -  +  +  -  
          -  +  -  -  +  
          -  -  -  +  -  
          -  -  -  -  +  
          -  -  -  -  -  
                   -  - ]
     124                 :            : }
     125                 :            : 
     126                 :          0 : static inline void selinux_mark_initialized(struct selinux_state *state)
     127                 :            : {
     128                 :            :         /* do a synchronized write to avoid race conditions */
     129                 :          0 :         smp_store_release(&state->initialized, true);
     130                 :            : }
     131                 :            : 
     132                 :            : #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
     133                 :          3 : static inline bool enforcing_enabled(struct selinux_state *state)
     134                 :            : {
     135   [ -  -  #  #  :          3 :         return READ_ONCE(state->enforcing);
                   #  # ]
     136                 :            : }
     137                 :            : 
     138                 :          3 : static inline void enforcing_set(struct selinux_state *state, bool value)
     139                 :            : {
     140         [ #  # ]:          3 :         WRITE_ONCE(state->enforcing, value);
     141                 :            : }
     142                 :            : #else
     143                 :            : static inline bool enforcing_enabled(struct selinux_state *state)
     144                 :            : {
     145                 :            :         return true;
     146                 :            : }
     147                 :            : 
     148                 :            : static inline void enforcing_set(struct selinux_state *state, bool value)
     149                 :            : {
     150                 :            : }
     151                 :            : #endif
     152                 :            : 
     153                 :            : #ifdef CONFIG_SECURITY_SELINUX_DISABLE
     154                 :          0 : static inline bool selinux_disabled(struct selinux_state *state)
     155                 :            : {
     156         [ #  # ]:          0 :         return READ_ONCE(state->disabled);
     157                 :            : }
     158                 :            : 
     159                 :          0 : static inline void selinux_mark_disabled(struct selinux_state *state)
     160                 :            : {
     161                 :          0 :         WRITE_ONCE(state->disabled, true);
     162                 :            : }
     163                 :            : #else
     164                 :            : static inline bool selinux_disabled(struct selinux_state *state)
     165                 :            : {
     166                 :            :         return false;
     167                 :            : }
     168                 :            : #endif
     169                 :            : 
     170                 :          9 : static inline bool selinux_policycap_netpeer(void)
     171                 :            : {
     172                 :          9 :         struct selinux_state *state = &selinux_state;
     173                 :            : 
     174   [ +  -  -  -  :          9 :         return state->policycap[POLICYDB_CAPABILITY_NETPEER];
                   -  - ]
     175                 :            : }
     176                 :            : 
     177                 :      77766 : static inline bool selinux_policycap_openperm(void)
     178                 :            : {
     179                 :      77766 :         struct selinux_state *state = &selinux_state;
     180                 :            : 
     181   [ -  +  -  + ]:      77766 :         return state->policycap[POLICYDB_CAPABILITY_OPENPERM];
     182                 :            : }
     183                 :            : 
     184                 :       1842 : static inline bool selinux_policycap_extsockclass(void)
     185                 :            : {
     186                 :       1842 :         struct selinux_state *state = &selinux_state;
     187                 :            : 
     188   [ -  -  -  -  :       1842 :         return state->policycap[POLICYDB_CAPABILITY_EXTSOCKCLASS];
          -  -  +  +  +  
             -  -  -  - ]
     189                 :            : }
     190                 :            : 
     191                 :          9 : static inline bool selinux_policycap_alwaysnetwork(void)
     192                 :            : {
     193                 :          9 :         struct selinux_state *state = &selinux_state;
     194                 :            : 
     195   [ -  -  -  -  :          9 :         return state->policycap[POLICYDB_CAPABILITY_ALWAYSNETWORK];
          +  -  -  -  -  
          -  -  -  -  -  
             -  -  -  - ]
     196                 :            : }
     197                 :            : 
     198                 :            : static inline bool selinux_policycap_cgroupseclabel(void)
     199                 :            : {
     200                 :            :         struct selinux_state *state = &selinux_state;
     201                 :            : 
     202                 :            :         return state->policycap[POLICYDB_CAPABILITY_CGROUPSECLABEL];
     203                 :            : }
     204                 :            : 
     205                 :            : static inline bool selinux_policycap_nnp_nosuid_transition(void)
     206                 :            : {
     207                 :            :         struct selinux_state *state = &selinux_state;
     208                 :            : 
     209                 :            :         return state->policycap[POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION];
     210                 :            : }
     211                 :            : 
     212                 :            : int security_mls_enabled(struct selinux_state *state);
     213                 :            : int security_load_policy(struct selinux_state *state,
     214                 :            :                          void *data, size_t len);
     215                 :            : int security_read_policy(struct selinux_state *state,
     216                 :            :                          void **data, size_t *len);
     217                 :            : size_t security_policydb_len(struct selinux_state *state);
     218                 :            : 
     219                 :            : int security_policycap_supported(struct selinux_state *state,
     220                 :            :                                  unsigned int req_cap);
     221                 :            : 
     222                 :            : #define SEL_VEC_MAX 32
     223                 :            : struct av_decision {
     224                 :            :         u32 allowed;
     225                 :            :         u32 auditallow;
     226                 :            :         u32 auditdeny;
     227                 :            :         u32 seqno;
     228                 :            :         u32 flags;
     229                 :            : };
     230                 :            : 
     231                 :            : #define XPERMS_ALLOWED 1
     232                 :            : #define XPERMS_AUDITALLOW 2
     233                 :            : #define XPERMS_DONTAUDIT 4
     234                 :            : 
     235                 :            : #define security_xperm_set(perms, x) (perms[x >> 5] |= 1 << (x & 0x1f))
     236                 :            : #define security_xperm_test(perms, x) (1 & (perms[x >> 5] >> (x & 0x1f)))
     237                 :            : struct extended_perms_data {
     238                 :            :         u32 p[8];
     239                 :            : };
     240                 :            : 
     241                 :            : struct extended_perms_decision {
     242                 :            :         u8 used;
     243                 :            :         u8 driver;
     244                 :            :         struct extended_perms_data *allowed;
     245                 :            :         struct extended_perms_data *auditallow;
     246                 :            :         struct extended_perms_data *dontaudit;
     247                 :            : };
     248                 :            : 
     249                 :            : struct extended_perms {
     250                 :            :         u16 len;        /* length associated decision chain */
     251                 :            :         struct extended_perms_data drivers; /* flag drivers that are used */
     252                 :            : };
     253                 :            : 
     254                 :            : /* definitions of av_decision.flags */
     255                 :            : #define AVD_FLAGS_PERMISSIVE    0x0001
     256                 :            : 
     257                 :            : void security_compute_av(struct selinux_state *state,
     258                 :            :                          u32 ssid, u32 tsid,
     259                 :            :                          u16 tclass, struct av_decision *avd,
     260                 :            :                          struct extended_perms *xperms);
     261                 :            : 
     262                 :            : void security_compute_xperms_decision(struct selinux_state *state,
     263                 :            :                                       u32 ssid, u32 tsid, u16 tclass,
     264                 :            :                                       u8 driver,
     265                 :            :                                       struct extended_perms_decision *xpermd);
     266                 :            : 
     267                 :            : void security_compute_av_user(struct selinux_state *state,
     268                 :            :                               u32 ssid, u32 tsid,
     269                 :            :                               u16 tclass, struct av_decision *avd);
     270                 :            : 
     271                 :            : int security_transition_sid(struct selinux_state *state,
     272                 :            :                             u32 ssid, u32 tsid, u16 tclass,
     273                 :            :                             const struct qstr *qstr, u32 *out_sid);
     274                 :            : 
     275                 :            : int security_transition_sid_user(struct selinux_state *state,
     276                 :            :                                  u32 ssid, u32 tsid, u16 tclass,
     277                 :            :                                  const char *objname, u32 *out_sid);
     278                 :            : 
     279                 :            : int security_member_sid(struct selinux_state *state, u32 ssid, u32 tsid,
     280                 :            :                         u16 tclass, u32 *out_sid);
     281                 :            : 
     282                 :            : int security_change_sid(struct selinux_state *state, u32 ssid, u32 tsid,
     283                 :            :                         u16 tclass, u32 *out_sid);
     284                 :            : 
     285                 :            : int security_sid_to_context(struct selinux_state *state, u32 sid,
     286                 :            :                             char **scontext, u32 *scontext_len);
     287                 :            : 
     288                 :            : int security_sid_to_context_force(struct selinux_state *state,
     289                 :            :                                   u32 sid, char **scontext, u32 *scontext_len);
     290                 :            : 
     291                 :            : int security_sid_to_context_inval(struct selinux_state *state,
     292                 :            :                                   u32 sid, char **scontext, u32 *scontext_len);
     293                 :            : 
     294                 :            : int security_context_to_sid(struct selinux_state *state,
     295                 :            :                             const char *scontext, u32 scontext_len,
     296                 :            :                             u32 *out_sid, gfp_t gfp);
     297                 :            : 
     298                 :            : int security_context_str_to_sid(struct selinux_state *state,
     299                 :            :                                 const char *scontext, u32 *out_sid, gfp_t gfp);
     300                 :            : 
     301                 :            : int security_context_to_sid_default(struct selinux_state *state,
     302                 :            :                                     const char *scontext, u32 scontext_len,
     303                 :            :                                     u32 *out_sid, u32 def_sid, gfp_t gfp_flags);
     304                 :            : 
     305                 :            : int security_context_to_sid_force(struct selinux_state *state,
     306                 :            :                                   const char *scontext, u32 scontext_len,
     307                 :            :                                   u32 *sid);
     308                 :            : 
     309                 :            : int security_get_user_sids(struct selinux_state *state,
     310                 :            :                            u32 callsid, char *username,
     311                 :            :                            u32 **sids, u32 *nel);
     312                 :            : 
     313                 :            : int security_port_sid(struct selinux_state *state,
     314                 :            :                       u8 protocol, u16 port, u32 *out_sid);
     315                 :            : 
     316                 :            : int security_ib_pkey_sid(struct selinux_state *state,
     317                 :            :                          u64 subnet_prefix, u16 pkey_num, u32 *out_sid);
     318                 :            : 
     319                 :            : int security_ib_endport_sid(struct selinux_state *state,
     320                 :            :                             const char *dev_name, u8 port_num, u32 *out_sid);
     321                 :            : 
     322                 :            : int security_netif_sid(struct selinux_state *state,
     323                 :            :                        char *name, u32 *if_sid);
     324                 :            : 
     325                 :            : int security_node_sid(struct selinux_state *state,
     326                 :            :                       u16 domain, void *addr, u32 addrlen,
     327                 :            :                       u32 *out_sid);
     328                 :            : 
     329                 :            : int security_validate_transition(struct selinux_state *state,
     330                 :            :                                  u32 oldsid, u32 newsid, u32 tasksid,
     331                 :            :                                  u16 tclass);
     332                 :            : 
     333                 :            : int security_validate_transition_user(struct selinux_state *state,
     334                 :            :                                       u32 oldsid, u32 newsid, u32 tasksid,
     335                 :            :                                       u16 tclass);
     336                 :            : 
     337                 :            : int security_bounded_transition(struct selinux_state *state,
     338                 :            :                                 u32 oldsid, u32 newsid);
     339                 :            : 
     340                 :            : int security_sid_mls_copy(struct selinux_state *state,
     341                 :            :                           u32 sid, u32 mls_sid, u32 *new_sid);
     342                 :            : 
     343                 :            : int security_net_peersid_resolve(struct selinux_state *state,
     344                 :            :                                  u32 nlbl_sid, u32 nlbl_type,
     345                 :            :                                  u32 xfrm_sid,
     346                 :            :                                  u32 *peer_sid);
     347                 :            : 
     348                 :            : int security_get_classes(struct selinux_state *state,
     349                 :            :                          char ***classes, int *nclasses);
     350                 :            : int security_get_permissions(struct selinux_state *state,
     351                 :            :                              char *class, char ***perms, int *nperms);
     352                 :            : int security_get_reject_unknown(struct selinux_state *state);
     353                 :            : int security_get_allow_unknown(struct selinux_state *state);
     354                 :            : 
     355                 :            : #define SECURITY_FS_USE_XATTR           1 /* use xattr */
     356                 :            : #define SECURITY_FS_USE_TRANS           2 /* use transition SIDs, e.g. devpts/tmpfs */
     357                 :            : #define SECURITY_FS_USE_TASK            3 /* use task SIDs, e.g. pipefs/sockfs */
     358                 :            : #define SECURITY_FS_USE_GENFS           4 /* use the genfs support */
     359                 :            : #define SECURITY_FS_USE_NONE            5 /* no labeling support */
     360                 :            : #define SECURITY_FS_USE_MNTPOINT        6 /* use mountpoint labeling */
     361                 :            : #define SECURITY_FS_USE_NATIVE          7 /* use native label support */
     362                 :            : #define SECURITY_FS_USE_MAX             7 /* Highest SECURITY_FS_USE_XXX */
     363                 :            : 
     364                 :            : int security_fs_use(struct selinux_state *state, struct super_block *sb);
     365                 :            : 
     366                 :            : int security_genfs_sid(struct selinux_state *state,
     367                 :            :                        const char *fstype, char *name, u16 sclass,
     368                 :            :                        u32 *sid);
     369                 :            : 
     370                 :            : #ifdef CONFIG_NETLABEL
     371                 :            : int security_netlbl_secattr_to_sid(struct selinux_state *state,
     372                 :            :                                    struct netlbl_lsm_secattr *secattr,
     373                 :            :                                    u32 *sid);
     374                 :            : 
     375                 :            : int security_netlbl_sid_to_secattr(struct selinux_state *state,
     376                 :            :                                    u32 sid,
     377                 :            :                                    struct netlbl_lsm_secattr *secattr);
     378                 :            : #else
     379                 :            : static inline int security_netlbl_secattr_to_sid(struct selinux_state *state,
     380                 :            :                                             struct netlbl_lsm_secattr *secattr,
     381                 :            :                                             u32 *sid)
     382                 :            : {
     383                 :            :         return -EIDRM;
     384                 :            : }
     385                 :            : 
     386                 :            : static inline int security_netlbl_sid_to_secattr(struct selinux_state *state,
     387                 :            :                                          u32 sid,
     388                 :            :                                          struct netlbl_lsm_secattr *secattr)
     389                 :            : {
     390                 :            :         return -ENOENT;
     391                 :            : }
     392                 :            : #endif /* CONFIG_NETLABEL */
     393                 :            : 
     394                 :            : const char *security_get_initial_sid_context(u32 sid);
     395                 :            : 
     396                 :            : /*
     397                 :            :  * status notifier using mmap interface
     398                 :            :  */
     399                 :            : extern struct page *selinux_kernel_status_page(struct selinux_state *state);
     400                 :            : 
     401                 :            : #define SELINUX_KERNEL_STATUS_VERSION   1
     402                 :            : struct selinux_kernel_status {
     403                 :            :         u32     version;        /* version number of thie structure */
     404                 :            :         u32     sequence;       /* sequence number of seqlock logic */
     405                 :            :         u32     enforcing;      /* current setting of enforcing mode */
     406                 :            :         u32     policyload;     /* times of policy reloaded */
     407                 :            :         u32     deny_unknown;   /* current setting of deny_unknown */
     408                 :            :         /*
     409                 :            :          * The version > 0 supports above members.
     410                 :            :          */
     411                 :            : } __packed;
     412                 :            : 
     413                 :            : extern void selinux_status_update_setenforce(struct selinux_state *state,
     414                 :            :                                              int enforcing);
     415                 :            : extern void selinux_status_update_policyload(struct selinux_state *state,
     416                 :            :                                              int seqno);
     417                 :            : extern void selinux_complete_init(void);
     418                 :            : extern int selinux_disable(struct selinux_state *state);
     419                 :            : extern void exit_sel_fs(void);
     420                 :            : extern struct path selinux_null;
     421                 :            : extern struct vfsmount *selinuxfs_mount;
     422                 :            : extern void selnl_notify_setenforce(int val);
     423                 :            : extern void selnl_notify_policyload(u32 seqno);
     424                 :            : extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
     425                 :            : 
     426                 :            : extern void avtab_cache_init(void);
     427                 :            : extern void ebitmap_cache_init(void);
     428                 :            : extern void hashtab_cache_init(void);
     429                 :            : extern int security_sidtab_hash_stats(struct selinux_state *state, char *page);
     430                 :            : 
     431                 :            : #endif /* _SELINUX_SECURITY_H_ */

Generated by: LCOV version 1.14