Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */
2 : : /*
3 : : * NSA Security-Enhanced Linux (SELinux) security module
4 : : *
5 : : * This file contains the SELinux security data structures for kernel objects.
6 : : *
7 : : * Author(s): Stephen Smalley, <sds@tycho.nsa.gov>
8 : : * Chris Vance, <cvance@nai.com>
9 : : * Wayne Salamon, <wsalamon@nai.com>
10 : : * James Morris <jmorris@redhat.com>
11 : : *
12 : : * Copyright (C) 2001,2002 Networks Associates Technology, Inc.
13 : : * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
14 : : * Copyright (C) 2016 Mellanox Technologies
15 : : */
16 : : #ifndef _SELINUX_OBJSEC_H_
17 : : #define _SELINUX_OBJSEC_H_
18 : :
19 : : #include <linux/list.h>
20 : : #include <linux/sched.h>
21 : : #include <linux/fs.h>
22 : : #include <linux/binfmts.h>
23 : : #include <linux/in.h>
24 : : #include <linux/spinlock.h>
25 : : #include <linux/lsm_hooks.h>
26 : : #include <linux/msg.h>
27 : : #include <net/net_namespace.h>
28 : : #include "flask.h"
29 : : #include "avc.h"
30 : :
31 : : struct task_security_struct {
32 : : u32 osid; /* SID prior to last execve */
33 : : u32 sid; /* current SID */
34 : : u32 exec_sid; /* exec SID */
35 : : u32 create_sid; /* fscreate SID */
36 : : u32 keycreate_sid; /* keycreate SID */
37 : : u32 sockcreate_sid; /* fscreate SID */
38 : : } __randomize_layout;
39 : :
40 : : enum label_initialized {
41 : : LABEL_INVALID, /* invalid or not initialized */
42 : : LABEL_INITIALIZED, /* initialized */
43 : : LABEL_PENDING
44 : : };
45 : :
46 : : struct inode_security_struct {
47 : : struct inode *inode; /* back pointer to inode object */
48 : : struct list_head list; /* list of inode_security_struct */
49 : : u32 task_sid; /* SID of creating task */
50 : : u32 sid; /* SID of this object */
51 : : u16 sclass; /* security class of this object */
52 : : unsigned char initialized; /* initialization flag */
53 : : spinlock_t lock;
54 : : };
55 : :
56 : : struct file_security_struct {
57 : : u32 sid; /* SID of open file description */
58 : : u32 fown_sid; /* SID of file owner (for SIGIO) */
59 : : u32 isid; /* SID of inode at the time of file open */
60 : : u32 pseqno; /* Policy seqno at the time of file open */
61 : : };
62 : :
63 : : struct superblock_security_struct {
64 : : struct super_block *sb; /* back pointer to sb object */
65 : : u32 sid; /* SID of file system superblock */
66 : : u32 def_sid; /* default SID for labeling */
67 : : u32 mntpoint_sid; /* SECURITY_FS_USE_MNTPOINT context for files */
68 : : unsigned short behavior; /* labeling behavior */
69 : : unsigned short flags; /* which mount options were specified */
70 : : struct mutex lock;
71 : : struct list_head isec_head;
72 : : spinlock_t isec_lock;
73 : : };
74 : :
75 : : struct msg_security_struct {
76 : : u32 sid; /* SID of message */
77 : : };
78 : :
79 : : struct ipc_security_struct {
80 : : u16 sclass; /* security class of this object */
81 : : u32 sid; /* SID of IPC resource */
82 : : };
83 : :
84 : : struct netif_security_struct {
85 : : struct net *ns; /* network namespace */
86 : : int ifindex; /* device index */
87 : : u32 sid; /* SID for this interface */
88 : : };
89 : :
90 : : struct netnode_security_struct {
91 : : union {
92 : : __be32 ipv4; /* IPv4 node address */
93 : : struct in6_addr ipv6; /* IPv6 node address */
94 : : } addr;
95 : : u32 sid; /* SID for this node */
96 : : u16 family; /* address family */
97 : : };
98 : :
99 : : struct netport_security_struct {
100 : : u32 sid; /* SID for this node */
101 : : u16 port; /* port number */
102 : : u8 protocol; /* transport protocol */
103 : : };
104 : :
105 : : struct sk_security_struct {
106 : : #ifdef CONFIG_NETLABEL
107 : : enum { /* NetLabel state */
108 : : NLBL_UNSET = 0,
109 : : NLBL_REQUIRE,
110 : : NLBL_LABELED,
111 : : NLBL_REQSKB,
112 : : NLBL_CONNLABELED,
113 : : } nlbl_state;
114 : : struct netlbl_lsm_secattr *nlbl_secattr; /* NetLabel sec attributes */
115 : : #endif
116 : : u32 sid; /* SID of this object */
117 : : u32 peer_sid; /* SID of peer */
118 : : u16 sclass; /* sock security class */
119 : : enum { /* SCTP association state */
120 : : SCTP_ASSOC_UNSET = 0,
121 : : SCTP_ASSOC_SET,
122 : : } sctp_assoc_state;
123 : : };
124 : :
125 : : struct tun_security_struct {
126 : : u32 sid; /* SID for the tun device sockets */
127 : : };
128 : :
129 : : struct key_security_struct {
130 : : u32 sid; /* SID of key */
131 : : };
132 : :
133 : : struct ib_security_struct {
134 : : u32 sid; /* SID of the queue pair or MAD agent */
135 : : };
136 : :
137 : : struct pkey_security_struct {
138 : : u64 subnet_prefix; /* Port subnet prefix */
139 : : u16 pkey; /* PKey number */
140 : : u32 sid; /* SID of pkey */
141 : : };
142 : :
143 : : struct bpf_security_struct {
144 : : u32 sid; /* SID of bpf obj creator */
145 : : };
146 : :
147 : : struct perf_event_security_struct {
148 : : u32 sid; /* SID of perf_event obj creator */
149 : : };
150 : :
151 : : extern struct lsm_blob_sizes selinux_blob_sizes;
152 : 24622174 : static inline struct task_security_struct *selinux_cred(const struct cred *cred)
153 : : {
154 [ - + - - : 20731460 : return cred->security + selinux_blob_sizes.lbs_cred;
+ + + - +
+ - + + -
- + - - +
+ + + + +
- + - + -
+ - + + -
+ + - ]
155 : : }
156 : :
157 : 5126796 : static inline struct file_security_struct *selinux_file(const struct file *file)
158 : : {
159 [ - + - - : 3257190 : return file->f_security + selinux_blob_sizes.lbs_file;
- + + - -
- - + ]
160 : : }
161 : :
162 : 30938100 : static inline struct inode_security_struct *selinux_inode(
163 : : const struct inode *inode)
164 : : {
165 [ + - + - : 30938100 : if (unlikely(!inode->i_security))
+ - + - +
- + - + -
+ - - - +
- + - + -
- - - - -
- - - - -
- - - - -
- + - - -
+ - - - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - +
- + - +
- ]
166 : : return NULL;
167 [ + - ]: 30938100 : return inode->i_security + selinux_blob_sizes.lbs_inode;
168 : : }
169 : :
170 : 0 : static inline struct msg_security_struct *selinux_msg_msg(
171 : : const struct msg_msg *msg_msg)
172 : : {
173 [ # # ]: 0 : return msg_msg->security + selinux_blob_sizes.lbs_msg_msg;
174 : : }
175 : :
176 : 0 : static inline struct ipc_security_struct *selinux_ipc(
177 : : const struct kern_ipc_perm *ipc)
178 : : {
179 [ # # ]: 0 : return ipc->security + selinux_blob_sizes.lbs_ipc;
180 : : }
181 : :
182 : : /*
183 : : * get the subjective security ID of the current task
184 : : */
185 : 3583562 : static inline u32 current_sid(void)
186 : : {
187 [ - - + - : 1097841 : const struct task_security_struct *tsec = selinux_cred(current_cred());
- - - - -
+ + - +
- ]
188 : :
189 [ - - + - : 1097841 : return tsec->sid;
- - - - -
+ + - +
- ]
190 : : }
191 : :
192 : : #endif /* _SELINUX_OBJSEC_H_ */
|