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