policy.h 8.6 KB
Newer Older
J
John Johansen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * AppArmor security module
 *
 * This file contains AppArmor policy definitions.
 *
 * Copyright (C) 1998-2008 Novell/SUSE
 * Copyright 2009-2010 Canonical Ltd.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, version 2 of the
 * License.
 */

#ifndef __AA_POLICY_H
#define __AA_POLICY_H

#include <linux/capability.h>
#include <linux/cred.h>
#include <linux/kref.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/socket.h>

#include "apparmor.h"
#include "audit.h"
#include "capability.h"
#include "domain.h"
#include "file.h"
30
#include "lib.h"
J
John Johansen 已提交
31 32
#include "resource.h"

33

34
struct aa_ns;
35

36 37
extern const char *const aa_profile_mode_names[];
#define APPARMOR_MODE_NAMES_MAX_INDEX 4
J
John Johansen 已提交
38

39 40 41
#define PROFILE_MODE(_profile, _mode)		\
	((aa_g_profile_mode == (_mode)) ||	\
	 ((_profile)->mode == (_mode)))
J
John Johansen 已提交
42

43 44 45
#define COMPLAIN_MODE(_profile)	PROFILE_MODE((_profile), APPARMOR_COMPLAIN)

#define KILL_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_KILL)
J
John Johansen 已提交
46 47 48

#define PROFILE_IS_HAT(_profile) ((_profile)->flags & PFLAG_HAT)

49
#define profile_is_stale(_profile) ((_profile)->flags & PFLAG_STALE)
50

51 52
#define on_list_rcu(X) (!list_empty(X) && (X)->prev != LIST_POISON2)

J
John Johansen 已提交
53 54 55 56 57 58 59 60 61 62
/*
 * FIXME: currently need a clean way to replace and remove profiles as a
 * set.  It should be done at the namespace level.
 * Either, with a set of profiles loaded at the namespace level or via
 * a mark and remove marked interface.
 */
enum profile_mode {
	APPARMOR_ENFORCE,	/* enforce access rules */
	APPARMOR_COMPLAIN,	/* allow and log access violations */
	APPARMOR_KILL,		/* kill task on access violation */
63
	APPARMOR_UNCONFINED,	/* profile set to unconfined */
J
John Johansen 已提交
64 65 66 67 68 69 70 71 72 73
};

enum profile_flags {
	PFLAG_HAT = 1,			/* profile is a hat */
	PFLAG_NULL = 4,			/* profile is null learning profile */
	PFLAG_IX_ON_NAME_ERROR = 8,	/* fallback to ix on name lookup fail */
	PFLAG_IMMUTABLE = 0x10,		/* don't allow changes/replacement */
	PFLAG_USER_DEFINED = 0x20,	/* user based profile - lower privs */
	PFLAG_NO_LIST_REF = 0x40,	/* list doesn't keep profile ref */
	PFLAG_OLD_NULL_TRANS = 0x100,	/* use // as the null transition */
74
	PFLAG_STALE = 0x200,		/* profile replaced/removed */
75
	PFLAG_NS_COUNT = 0x400,		/* carries NS ref count */
J
John Johansen 已提交
76 77 78 79 80 81 82

	/* These flags must correspond with PATH_flags */
	PFLAG_MEDIATE_DELETED = 0x10000, /* mediate instead delegate deleted */
};

struct aa_profile;

83 84 85 86 87 88 89 90 91 92 93
/* struct aa_policydb - match engine for a policy
 * dfa: dfa pattern match
 * start: set of start states for the different classes of data
 */
struct aa_policydb {
	/* Generic policy DFA specific rule types will be subsections of it */
	struct aa_dfa *dfa;
	unsigned int start[AA_CLASS_LAST + 1];

};

94
struct aa_proxy {
95 96 97 98 99
	struct kref count;
	struct aa_profile __rcu *profile;
};


J
John Johansen 已提交
100 101
/* struct aa_profile - basic confinement data
 * @base - base components of the profile (name, refcount, lists, lock ...)
102
 * @count: reference count of the obj
103
 * @rcu: rcu head used when removing from @list
J
John Johansen 已提交
104 105
 * @parent: parent of profile
 * @ns: namespace the profile is in
106
 * @proxy: is set to the profile that replaced this profile
J
John Johansen 已提交
107
 * @rename: optional profile name that this profile renamed
108
 * @attach: human readable attachment string
J
John Johansen 已提交
109 110 111 112 113 114 115
 * @xmatch: optional extended matching for unconfined executables names
 * @xmatch_len: xmatch prefix len, used to determine xmatch priority
 * @audit: the auditing mode of the profile
 * @mode: the enforcement mode of the profile
 * @flags: flags controlling profile behavior
 * @path_flags: flags controlling path generation behavior
 * @size: the memory consumed by this profiles rules
116
 * @policy: general match rules governing policy
J
John Johansen 已提交
117 118 119 120
 * @file: The set of rules governing basic file access and domain transitions
 * @caps: capabilities for the profile
 * @rlimits: rlimits for the profile
 *
121 122 123
 * @dents: dentries for the profiles file entries in apparmorfs
 * @dirname: name of the profile dir in apparmorfs
 *
J
John Johansen 已提交
124 125 126 127 128
 * The AppArmor profile contains the basic confinement data.  Each profile
 * has a name, and exists in a namespace.  The @name and @exec_match are
 * used to determine profile attachment against unconfined tasks.  All other
 * attachments are determined by profile X transition rules.
 *
129
 * The @proxy struct is write protected by the profile lock.
J
John Johansen 已提交
130 131 132 133 134 135 136 137 138 139
 *
 * Profiles have a hierarchy where hats and children profiles keep
 * a reference to their parent.
 *
 * Profile names can not begin with a : and can not contain the \0
 * character.  If a profile name begins with / it will be considered when
 * determining profile attachment on "unconfined" tasks.
 */
struct aa_profile {
	struct aa_policy base;
140
	struct kref count;
141
	struct rcu_head rcu;
142
	struct aa_profile __rcu *parent;
J
John Johansen 已提交
143

144
	struct aa_ns *ns;
145
	struct aa_proxy *proxy;
J
John Johansen 已提交
146 147
	const char *rename;

148
	const char *attach;
J
John Johansen 已提交
149 150 151
	struct aa_dfa *xmatch;
	int xmatch_len;
	enum audit_mode audit;
152
	long mode;
153
	long flags;
J
John Johansen 已提交
154 155 156
	u32 path_flags;
	int size;

157
	struct aa_policydb policy;
J
John Johansen 已提交
158 159 160
	struct aa_file_rules file;
	struct aa_caps caps;
	struct aa_rlimit rlimits;
161

162
	unsigned char *hash;
163 164
	char *dirname;
	struct dentry *dents[AAFS_PROF_SIZEOF];
J
John Johansen 已提交
165 166 167 168
};

extern enum profile_mode aa_g_profile_mode;

169
void __aa_update_proxy(struct aa_profile *orig, struct aa_profile *new);
J
John Johansen 已提交
170

171
void aa_add_profile(struct aa_policy *common, struct aa_profile *profile);
J
John Johansen 已提交
172 173


174
void aa_free_proxy_kref(struct kref *kref);
175
struct aa_profile *aa_alloc_profile(const char *name, gfp_t gfp);
176 177
struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
				       const char *base, gfp_t gfp);
178
void aa_free_profile(struct aa_profile *profile);
J
John Johansen 已提交
179 180
void aa_free_profile_kref(struct kref *kref);
struct aa_profile *aa_find_child(struct aa_profile *parent, const char *name);
181 182
struct aa_profile *aa_lookupn_profile(struct aa_ns *ns, const char *hname,
				      size_t n);
183
struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *name);
184 185
struct aa_profile *aa_fqlookupn_profile(struct aa_profile *base,
					const char *fqname, size_t n);
186
struct aa_profile *aa_match_profile(struct aa_ns *ns, const char *name);
J
John Johansen 已提交
187

188 189
ssize_t aa_replace_profiles(struct aa_ns *view, void *udata, size_t size,
			    bool noreplace);
190
ssize_t aa_remove_profiles(struct aa_ns *view, char *name, size_t size);
191
void __aa_profile_list_release(struct list_head *head);
J
John Johansen 已提交
192 193 194 195

#define PROF_ADD 1
#define PROF_REPLACE 0

196
#define unconfined(X) ((X)->mode == APPARMOR_UNCONFINED)
J
John Johansen 已提交
197 198 199 200 201 202 203 204 205 206 207 208


/**
 * aa_get_profile - increment refcount on profile @p
 * @p: profile  (MAYBE NULL)
 *
 * Returns: pointer to @p if @p is NULL will return NULL
 * Requires: @p must be held with valid refcount when called
 */
static inline struct aa_profile *aa_get_profile(struct aa_profile *p)
{
	if (p)
209
		kref_get(&(p->count));
J
John Johansen 已提交
210 211 212 213

	return p;
}

214 215 216 217 218 219 220 221 222
/**
 * aa_get_profile_not0 - increment refcount on profile @p found via lookup
 * @p: profile  (MAYBE NULL)
 *
 * Returns: pointer to @p if @p is NULL will return NULL
 * Requires: @p must be held with valid refcount when called
 */
static inline struct aa_profile *aa_get_profile_not0(struct aa_profile *p)
{
223
	if (p && kref_get_not0(&p->count))
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
		return p;

	return NULL;
}

/**
 * aa_get_profile_rcu - increment a refcount profile that can be replaced
 * @p: pointer to profile that can be replaced (NOT NULL)
 *
 * Returns: pointer to a refcounted profile.
 *     else NULL if no profile
 */
static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)
{
	struct aa_profile *c;

	rcu_read_lock();
	do {
		c = rcu_dereference(*p);
243
	} while (c && !kref_get_not0(&c->count));
244 245 246 247 248
	rcu_read_unlock();

	return c;
}

249 250 251 252 253 254 255 256 257 258 259 260 261
/**
 * aa_get_newest_profile - find the newest version of @profile
 * @profile: the profile to check for newer versions of
 *
 * Returns: refcounted newest version of @profile taking into account
 *          replacement, renames and removals
 *          return @profile.
 */
static inline struct aa_profile *aa_get_newest_profile(struct aa_profile *p)
{
	if (!p)
		return NULL;

262
	if (profile_is_stale(p))
263
		return aa_get_profile_rcu(&p->proxy->profile);
264 265 266 267

	return aa_get_profile(p);
}

J
John Johansen 已提交
268 269 270 271 272 273
/**
 * aa_put_profile - decrement refcount on profile @p
 * @p: profile  (MAYBE NULL)
 */
static inline void aa_put_profile(struct aa_profile *p)
{
274 275
	if (p)
		kref_put(&p->count, aa_free_profile_kref);
J
John Johansen 已提交
276 277
}

278
static inline struct aa_proxy *aa_get_proxy(struct aa_proxy *p)
279 280 281 282 283 284 285
{
	if (p)
		kref_get(&(p->count));

	return p;
}

286
static inline void aa_put_proxy(struct aa_proxy *p)
287 288
{
	if (p)
289
		kref_put(&p->count, aa_free_proxy_kref);
290 291
}

J
John Johansen 已提交
292 293 294 295 296 297 298 299
static inline int AUDIT_MODE(struct aa_profile *profile)
{
	if (aa_g_audit != AUDIT_NORMAL)
		return aa_g_audit;

	return profile->audit;
}

300 301
bool policy_view_capable(void);
bool policy_admin_capable(void);
J
John Johansen 已提交
302 303 304
bool aa_may_manage_policy(int op);

#endif /* __AA_POLICY_H */