0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef __AA_POLICY_H
0012 #define __AA_POLICY_H
0013
0014 #include <linux/capability.h>
0015 #include <linux/cred.h>
0016 #include <linux/kref.h>
0017 #include <linux/rhashtable.h>
0018 #include <linux/sched.h>
0019 #include <linux/slab.h>
0020 #include <linux/socket.h>
0021
0022 #include "apparmor.h"
0023 #include "audit.h"
0024 #include "capability.h"
0025 #include "domain.h"
0026 #include "file.h"
0027 #include "lib.h"
0028 #include "label.h"
0029 #include "net.h"
0030 #include "perms.h"
0031 #include "resource.h"
0032
0033
0034 struct aa_ns;
0035
0036 extern int unprivileged_userns_apparmor_policy;
0037
0038 extern const char *const aa_profile_mode_names[];
0039 #define APPARMOR_MODE_NAMES_MAX_INDEX 4
0040
0041 #define PROFILE_MODE(_profile, _mode) \
0042 ((aa_g_profile_mode == (_mode)) || \
0043 ((_profile)->mode == (_mode)))
0044
0045 #define COMPLAIN_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_COMPLAIN)
0046
0047 #define KILL_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_KILL)
0048
0049 #define PROFILE_IS_HAT(_profile) ((_profile)->label.flags & FLAG_HAT)
0050
0051 #define CHECK_DEBUG1(_profile) ((_profile)->label.flags & FLAG_DEBUG1)
0052
0053 #define CHECK_DEBUG2(_profile) ((_profile)->label.flags & FLAG_DEBUG2)
0054
0055 #define profile_is_stale(_profile) (label_is_stale(&(_profile)->label))
0056
0057 #define on_list_rcu(X) (!list_empty(X) && (X)->prev != LIST_POISON2)
0058
0059
0060
0061
0062
0063
0064
0065 enum profile_mode {
0066 APPARMOR_ENFORCE,
0067 APPARMOR_COMPLAIN,
0068 APPARMOR_KILL,
0069 APPARMOR_UNCONFINED,
0070 };
0071
0072
0073
0074
0075
0076
0077 struct aa_policydb {
0078
0079 struct aa_dfa *dfa;
0080 unsigned int start[AA_CLASS_LAST + 1];
0081
0082 };
0083
0084
0085
0086
0087
0088
0089
0090 struct aa_data {
0091 char *key;
0092 u32 size;
0093 char *data;
0094 struct rhash_head head;
0095 };
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 struct aa_profile {
0134 struct aa_policy base;
0135 struct aa_profile __rcu *parent;
0136
0137 struct aa_ns *ns;
0138 const char *rename;
0139
0140 const char *attach;
0141 struct aa_dfa *xmatch;
0142 unsigned int xmatch_len;
0143 enum audit_mode audit;
0144 long mode;
0145 u32 path_flags;
0146 const char *disconnected;
0147 int size;
0148
0149 struct aa_policydb policy;
0150 struct aa_file_rules file;
0151 struct aa_caps caps;
0152
0153 int xattr_count;
0154 char **xattrs;
0155
0156 struct aa_rlimit rlimits;
0157
0158 int secmark_count;
0159 struct aa_secmark *secmark;
0160
0161 struct aa_loaddata *rawdata;
0162 unsigned char *hash;
0163 char *dirname;
0164 struct dentry *dents[AAFS_PROF_SIZEOF];
0165 struct rhashtable *data;
0166 struct aa_label label;
0167 };
0168
0169 extern enum profile_mode aa_g_profile_mode;
0170
0171 #define AA_MAY_LOAD_POLICY AA_MAY_APPEND
0172 #define AA_MAY_REPLACE_POLICY AA_MAY_WRITE
0173 #define AA_MAY_REMOVE_POLICY AA_MAY_DELETE
0174
0175 #define profiles_ns(P) ((P)->ns)
0176 #define name_is_shared(A, B) ((A)->hname && (A)->hname == (B)->hname)
0177
0178 void aa_add_profile(struct aa_policy *common, struct aa_profile *profile);
0179
0180
0181 void aa_free_proxy_kref(struct kref *kref);
0182 struct aa_profile *aa_alloc_profile(const char *name, struct aa_proxy *proxy,
0183 gfp_t gfp);
0184 struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
0185 const char *base, gfp_t gfp);
0186 void aa_free_profile(struct aa_profile *profile);
0187 void aa_free_profile_kref(struct kref *kref);
0188 struct aa_profile *aa_find_child(struct aa_profile *parent, const char *name);
0189 struct aa_profile *aa_lookupn_profile(struct aa_ns *ns, const char *hname,
0190 size_t n);
0191 struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *name);
0192 struct aa_profile *aa_fqlookupn_profile(struct aa_label *base,
0193 const char *fqname, size_t n);
0194 struct aa_profile *aa_match_profile(struct aa_ns *ns, const char *name);
0195
0196 ssize_t aa_replace_profiles(struct aa_ns *view, struct aa_label *label,
0197 u32 mask, struct aa_loaddata *udata);
0198 ssize_t aa_remove_profiles(struct aa_ns *view, struct aa_label *label,
0199 char *name, size_t size);
0200 void __aa_profile_list_release(struct list_head *head);
0201
0202 #define PROF_ADD 1
0203 #define PROF_REPLACE 0
0204
0205 #define profile_unconfined(X) ((X)->mode == APPARMOR_UNCONFINED)
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 static inline struct aa_profile *aa_get_newest_profile(struct aa_profile *p)
0216 {
0217 return labels_profile(aa_get_newest_label(&p->label));
0218 }
0219
0220 static inline unsigned int PROFILE_MEDIATES(struct aa_profile *profile,
0221 unsigned char class)
0222 {
0223 if (class <= AA_CLASS_LAST)
0224 return profile->policy.start[class];
0225 else
0226 return aa_dfa_match_len(profile->policy.dfa,
0227 profile->policy.start[0], &class, 1);
0228 }
0229
0230 static inline unsigned int PROFILE_MEDIATES_AF(struct aa_profile *profile,
0231 u16 AF) {
0232 unsigned int state = PROFILE_MEDIATES(profile, AA_CLASS_NET);
0233 __be16 be_af = cpu_to_be16(AF);
0234
0235 if (!state)
0236 return 0;
0237 return aa_dfa_match_len(profile->policy.dfa, state, (char *) &be_af, 2);
0238 }
0239
0240
0241
0242
0243
0244
0245
0246
0247 static inline struct aa_profile *aa_get_profile(struct aa_profile *p)
0248 {
0249 if (p)
0250 kref_get(&(p->label.count));
0251
0252 return p;
0253 }
0254
0255
0256
0257
0258
0259
0260
0261
0262 static inline struct aa_profile *aa_get_profile_not0(struct aa_profile *p)
0263 {
0264 if (p && kref_get_unless_zero(&p->label.count))
0265 return p;
0266
0267 return NULL;
0268 }
0269
0270
0271
0272
0273
0274
0275
0276
0277 static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)
0278 {
0279 struct aa_profile *c;
0280
0281 rcu_read_lock();
0282 do {
0283 c = rcu_dereference(*p);
0284 } while (c && !kref_get_unless_zero(&c->label.count));
0285 rcu_read_unlock();
0286
0287 return c;
0288 }
0289
0290
0291
0292
0293
0294 static inline void aa_put_profile(struct aa_profile *p)
0295 {
0296 if (p)
0297 kref_put(&p->label.count, aa_label_kref);
0298 }
0299
0300 static inline int AUDIT_MODE(struct aa_profile *profile)
0301 {
0302 if (aa_g_audit != AUDIT_NORMAL)
0303 return aa_g_audit;
0304
0305 return profile->audit;
0306 }
0307
0308 bool aa_policy_view_capable(struct aa_label *label, struct aa_ns *ns);
0309 bool aa_policy_admin_capable(struct aa_label *label, struct aa_ns *ns);
0310 int aa_may_manage_policy(struct aa_label *label, struct aa_ns *ns,
0311 u32 mask);
0312 bool aa_current_policy_view_capable(struct aa_ns *ns);
0313 bool aa_current_policy_admin_capable(struct aa_ns *ns);
0314
0315 #endif