Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * AppArmor security module
0004  *
0005  * This file contains AppArmor policy definitions.
0006  *
0007  * Copyright (C) 1998-2008 Novell/SUSE
0008  * Copyright 2009-2010 Canonical Ltd.
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  * FIXME: currently need a clean way to replace and remove profiles as a
0061  * set.  It should be done at the namespace level.
0062  * Either, with a set of profiles loaded at the namespace level or via
0063  * a mark and remove marked interface.
0064  */
0065 enum profile_mode {
0066     APPARMOR_ENFORCE,   /* enforce access rules */
0067     APPARMOR_COMPLAIN,  /* allow and log access violations */
0068     APPARMOR_KILL,      /* kill task on access violation */
0069     APPARMOR_UNCONFINED,    /* profile set to unconfined */
0070 };
0071 
0072 
0073 /* struct aa_policydb - match engine for a policy
0074  * dfa: dfa pattern match
0075  * start: set of start states for the different classes of data
0076  */
0077 struct aa_policydb {
0078     /* Generic policy DFA specific rule types will be subsections of it */
0079     struct aa_dfa *dfa;
0080     unsigned int start[AA_CLASS_LAST + 1];
0081 
0082 };
0083 
0084 /* struct aa_data - generic data structure
0085  * key: name for retrieving this data
0086  * size: size of data in bytes
0087  * data: binary data
0088  * head: reserved for rhashtable
0089  */
0090 struct aa_data {
0091     char *key;
0092     u32 size;
0093     char *data;
0094     struct rhash_head head;
0095 };
0096 
0097 
0098 /* struct aa_profile - basic confinement data
0099  * @base - base components of the profile (name, refcount, lists, lock ...)
0100  * @label - label this profile is an extension of
0101  * @parent: parent of profile
0102  * @ns: namespace the profile is in
0103  * @rename: optional profile name that this profile renamed
0104  * @attach: human readable attachment string
0105  * @xmatch: optional extended matching for unconfined executables names
0106  * @xmatch_len: xmatch prefix len, used to determine xmatch priority
0107  * @audit: the auditing mode of the profile
0108  * @mode: the enforcement mode of the profile
0109  * @path_flags: flags controlling path generation behavior
0110  * @disconnected: what to prepend if attach_disconnected is specified
0111  * @size: the memory consumed by this profiles rules
0112  * @policy: general match rules governing policy
0113  * @file: The set of rules governing basic file access and domain transitions
0114  * @caps: capabilities for the profile
0115  * @rlimits: rlimits for the profile
0116  *
0117  * @dents: dentries for the profiles file entries in apparmorfs
0118  * @dirname: name of the profile dir in apparmorfs
0119  * @data: hashtable for free-form policy aa_data
0120  *
0121  * The AppArmor profile contains the basic confinement data.  Each profile
0122  * has a name, and exists in a namespace.  The @name and @exec_match are
0123  * used to determine profile attachment against unconfined tasks.  All other
0124  * attachments are determined by profile X transition rules.
0125  *
0126  * Profiles have a hierarchy where hats and children profiles keep
0127  * a reference to their parent.
0128  *
0129  * Profile names can not begin with a : and can not contain the \0
0130  * character.  If a profile name begins with / it will be considered when
0131  * determining profile attachment on "unconfined" tasks.
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  * aa_get_newest_profile - simple wrapper fn to wrap the label version
0209  * @p: profile (NOT NULL)
0210  *
0211  * Returns refcount to newest version of the profile (maybe @p)
0212  *
0213  * Requires: @p must be held with a valid refcount
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  * aa_get_profile - increment refcount on profile @p
0242  * @p: profile  (MAYBE NULL)
0243  *
0244  * Returns: pointer to @p if @p is NULL will return NULL
0245  * Requires: @p must be held with valid refcount when called
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  * aa_get_profile_not0 - increment refcount on profile @p found via lookup
0257  * @p: profile  (MAYBE NULL)
0258  *
0259  * Returns: pointer to @p if @p is NULL will return NULL
0260  * Requires: @p must be held with valid refcount when called
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  * aa_get_profile_rcu - increment a refcount profile that can be replaced
0272  * @p: pointer to profile that can be replaced (NOT NULL)
0273  *
0274  * Returns: pointer to a refcounted profile.
0275  *     else NULL if no profile
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  * aa_put_profile - decrement refcount on profile @p
0292  * @p: profile  (MAYBE NULL)
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 /* __AA_POLICY_H */