This source file includes following definitions.
- aa_get_newest_profile
- PROFILE_MEDIATES
- PROFILE_MEDIATES_AF
- aa_get_profile
- aa_get_profile_not0
- aa_get_profile_rcu
- aa_put_profile
- AUDIT_MODE
1
2
3
4
5
6
7
8
9
10
11 #ifndef __AA_POLICY_H
12 #define __AA_POLICY_H
13
14 #include <linux/capability.h>
15 #include <linux/cred.h>
16 #include <linux/kref.h>
17 #include <linux/rhashtable.h>
18 #include <linux/sched.h>
19 #include <linux/slab.h>
20 #include <linux/socket.h>
21
22 #include "apparmor.h"
23 #include "audit.h"
24 #include "capability.h"
25 #include "domain.h"
26 #include "file.h"
27 #include "lib.h"
28 #include "label.h"
29 #include "net.h"
30 #include "perms.h"
31 #include "resource.h"
32
33
34 struct aa_ns;
35
36 extern int unprivileged_userns_apparmor_policy;
37
38 extern const char *const aa_profile_mode_names[];
39 #define APPARMOR_MODE_NAMES_MAX_INDEX 4
40
41 #define PROFILE_MODE(_profile, _mode) \
42 ((aa_g_profile_mode == (_mode)) || \
43 ((_profile)->mode == (_mode)))
44
45 #define COMPLAIN_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_COMPLAIN)
46
47 #define KILL_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_KILL)
48
49 #define PROFILE_IS_HAT(_profile) ((_profile)->label.flags & FLAG_HAT)
50
51 #define profile_is_stale(_profile) (label_is_stale(&(_profile)->label))
52
53 #define on_list_rcu(X) (!list_empty(X) && (X)->prev != LIST_POISON2)
54
55
56
57
58
59
60
61 enum profile_mode {
62 APPARMOR_ENFORCE,
63 APPARMOR_COMPLAIN,
64 APPARMOR_KILL,
65 APPARMOR_UNCONFINED,
66 };
67
68
69
70
71
72
73 struct aa_policydb {
74
75 struct aa_dfa *dfa;
76 unsigned int start[AA_CLASS_LAST + 1];
77
78 };
79
80
81
82
83
84
85
86 struct aa_data {
87 char *key;
88 u32 size;
89 char *data;
90 struct rhash_head head;
91 };
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 struct aa_profile {
130 struct aa_policy base;
131 struct aa_profile __rcu *parent;
132
133 struct aa_ns *ns;
134 const char *rename;
135
136 const char *attach;
137 struct aa_dfa *xmatch;
138 int xmatch_len;
139 enum audit_mode audit;
140 long mode;
141 u32 path_flags;
142 const char *disconnected;
143 int size;
144
145 struct aa_policydb policy;
146 struct aa_file_rules file;
147 struct aa_caps caps;
148
149 int xattr_count;
150 char **xattrs;
151
152 struct aa_rlimit rlimits;
153
154 int secmark_count;
155 struct aa_secmark *secmark;
156
157 struct aa_loaddata *rawdata;
158 unsigned char *hash;
159 char *dirname;
160 struct dentry *dents[AAFS_PROF_SIZEOF];
161 struct rhashtable *data;
162 struct aa_label label;
163 };
164
165 extern enum profile_mode aa_g_profile_mode;
166
167 #define AA_MAY_LOAD_POLICY AA_MAY_APPEND
168 #define AA_MAY_REPLACE_POLICY AA_MAY_WRITE
169 #define AA_MAY_REMOVE_POLICY AA_MAY_DELETE
170
171 #define profiles_ns(P) ((P)->ns)
172 #define name_is_shared(A, B) ((A)->hname && (A)->hname == (B)->hname)
173
174 void aa_add_profile(struct aa_policy *common, struct aa_profile *profile);
175
176
177 void aa_free_proxy_kref(struct kref *kref);
178 struct aa_profile *aa_alloc_profile(const char *name, struct aa_proxy *proxy,
179 gfp_t gfp);
180 struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
181 const char *base, gfp_t gfp);
182 void aa_free_profile(struct aa_profile *profile);
183 void aa_free_profile_kref(struct kref *kref);
184 struct aa_profile *aa_find_child(struct aa_profile *parent, const char *name);
185 struct aa_profile *aa_lookupn_profile(struct aa_ns *ns, const char *hname,
186 size_t n);
187 struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *name);
188 struct aa_profile *aa_fqlookupn_profile(struct aa_label *base,
189 const char *fqname, size_t n);
190 struct aa_profile *aa_match_profile(struct aa_ns *ns, const char *name);
191
192 ssize_t aa_replace_profiles(struct aa_ns *view, struct aa_label *label,
193 u32 mask, struct aa_loaddata *udata);
194 ssize_t aa_remove_profiles(struct aa_ns *view, struct aa_label *label,
195 char *name, size_t size);
196 void __aa_profile_list_release(struct list_head *head);
197
198 #define PROF_ADD 1
199 #define PROF_REPLACE 0
200
201 #define profile_unconfined(X) ((X)->mode == APPARMOR_UNCONFINED)
202
203
204
205
206
207
208
209
210
211 static inline struct aa_profile *aa_get_newest_profile(struct aa_profile *p)
212 {
213 return labels_profile(aa_get_newest_label(&p->label));
214 }
215
216 static inline unsigned int PROFILE_MEDIATES(struct aa_profile *profile,
217 unsigned char class)
218 {
219 if (class <= AA_CLASS_LAST)
220 return profile->policy.start[class];
221 else
222 return aa_dfa_match_len(profile->policy.dfa,
223 profile->policy.start[0], &class, 1);
224 }
225
226 static inline unsigned int PROFILE_MEDIATES_AF(struct aa_profile *profile,
227 u16 AF) {
228 unsigned int state = PROFILE_MEDIATES(profile, AA_CLASS_NET);
229 __be16 be_af = cpu_to_be16(AF);
230
231 if (!state)
232 return 0;
233 return aa_dfa_match_len(profile->policy.dfa, state, (char *) &be_af, 2);
234 }
235
236
237
238
239
240
241
242
243 static inline struct aa_profile *aa_get_profile(struct aa_profile *p)
244 {
245 if (p)
246 kref_get(&(p->label.count));
247
248 return p;
249 }
250
251
252
253
254
255
256
257
258 static inline struct aa_profile *aa_get_profile_not0(struct aa_profile *p)
259 {
260 if (p && kref_get_unless_zero(&p->label.count))
261 return p;
262
263 return NULL;
264 }
265
266
267
268
269
270
271
272
273 static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)
274 {
275 struct aa_profile *c;
276
277 rcu_read_lock();
278 do {
279 c = rcu_dereference(*p);
280 } while (c && !kref_get_unless_zero(&c->label.count));
281 rcu_read_unlock();
282
283 return c;
284 }
285
286
287
288
289
290 static inline void aa_put_profile(struct aa_profile *p)
291 {
292 if (p)
293 kref_put(&p->label.count, aa_label_kref);
294 }
295
296 static inline int AUDIT_MODE(struct aa_profile *profile)
297 {
298 if (aa_g_audit != AUDIT_NORMAL)
299 return aa_g_audit;
300
301 return profile->audit;
302 }
303
304 bool policy_view_capable(struct aa_ns *ns);
305 bool policy_admin_capable(struct aa_ns *ns);
306 int aa_may_manage_policy(struct aa_label *label, struct aa_ns *ns,
307 u32 mask);
308
309 #endif