blob: 8e6707c837befae75d6e70accd3c5586ec8edfe0 [file] [log] [blame]
John Johansenc88d4c72010-07-29 14:48:00 -07001/*
2 * AppArmor security module
3 *
4 * This file contains AppArmor policy definitions.
5 *
6 * Copyright (C) 1998-2008 Novell/SUSE
7 * Copyright 2009-2010 Canonical Ltd.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation, version 2 of the
12 * License.
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>
William Huae025be02017-01-15 16:49:28 -080021#include <linux/rhashtable.h>
John Johansenc88d4c72010-07-29 14:48:00 -070022#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"
John Johansen12557dc2017-01-16 00:42:13 -080031#include "lib.h"
John Johansen637f6882017-06-09 08:14:28 -070032#include "label.h"
John Johansen56974a62017-07-18 23:18:33 -070033#include "net.h"
John Johansenfc7e0b22017-05-26 01:57:09 -070034#include "perms.h"
John Johansenc88d4c72010-07-29 14:48:00 -070035#include "resource.h"
36
John Johansencff281f2017-01-16 00:42:15 -080037
John Johansen98849df2017-01-16 00:42:16 -080038struct aa_ns;
John Johansencff281f2017-01-16 00:42:15 -080039
John Johansen2bd8dbb2017-01-16 00:42:50 -080040extern int unprivileged_userns_apparmor_policy;
41
John Johansen0d259f02013-07-10 21:13:43 -070042extern const char *const aa_profile_mode_names[];
43#define APPARMOR_MODE_NAMES_MAX_INDEX 4
John Johansenc88d4c72010-07-29 14:48:00 -070044
John Johansen50c5ecd52013-02-18 16:01:34 -080045#define PROFILE_MODE(_profile, _mode) \
46 ((aa_g_profile_mode == (_mode)) || \
47 ((_profile)->mode == (_mode)))
John Johansenc88d4c72010-07-29 14:48:00 -070048
John Johansen50c5ecd52013-02-18 16:01:34 -080049#define COMPLAIN_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_COMPLAIN)
50
51#define KILL_MODE(_profile) PROFILE_MODE((_profile), APPARMOR_KILL)
John Johansenc88d4c72010-07-29 14:48:00 -070052
John Johansen637f6882017-06-09 08:14:28 -070053#define PROFILE_IS_HAT(_profile) ((_profile)->label.flags & FLAG_HAT)
John Johansenc88d4c72010-07-29 14:48:00 -070054
John Johansen637f6882017-06-09 08:14:28 -070055#define profile_is_stale(_profile) (label_is_stale(&(_profile)->label))
John Johansen77b071b2013-07-10 21:07:43 -070056
John Johansen01e2b672013-07-10 21:06:43 -070057#define on_list_rcu(X) (!list_empty(X) && (X)->prev != LIST_POISON2)
58
John Johansenc88d4c72010-07-29 14:48:00 -070059/*
60 * FIXME: currently need a clean way to replace and remove profiles as a
61 * set. It should be done at the namespace level.
62 * Either, with a set of profiles loaded at the namespace level or via
63 * a mark and remove marked interface.
64 */
65enum profile_mode {
66 APPARMOR_ENFORCE, /* enforce access rules */
67 APPARMOR_COMPLAIN, /* allow and log access violations */
68 APPARMOR_KILL, /* kill task on access violation */
John Johansen03816502013-07-10 21:12:43 -070069 APPARMOR_UNCONFINED, /* profile set to unconfined */
John Johansenc88d4c72010-07-29 14:48:00 -070070};
71
John Johansenc88d4c72010-07-29 14:48:00 -070072
John Johansenad5ff3d2012-02-16 07:07:53 -080073/* struct aa_policydb - match engine for a policy
74 * dfa: dfa pattern match
75 * start: set of start states for the different classes of data
76 */
77struct aa_policydb {
78 /* Generic policy DFA specific rule types will be subsections of it */
79 struct aa_dfa *dfa;
80 unsigned int start[AA_CLASS_LAST + 1];
81
82};
83
William Huae025be02017-01-15 16:49:28 -080084/* struct aa_data - generic data structure
85 * key: name for retrieving this data
86 * size: size of data in bytes
87 * data: binary data
88 * head: reserved for rhashtable
89 */
90struct aa_data {
91 char *key;
92 u32 size;
93 char *data;
94 struct rhash_head head;
95};
96
John Johansen77b071b2013-07-10 21:07:43 -070097
John Johansenc88d4c72010-07-29 14:48:00 -070098/* struct aa_profile - basic confinement data
99 * @base - base components of the profile (name, refcount, lists, lock ...)
John Johansen637f6882017-06-09 08:14:28 -0700100 * @label - label this profile is an extension of
John Johansenc88d4c72010-07-29 14:48:00 -0700101 * @parent: parent of profile
102 * @ns: namespace the profile is in
John Johansenc88d4c72010-07-29 14:48:00 -0700103 * @rename: optional profile name that this profile renamed
John Johansen556d0be2013-07-10 21:17:43 -0700104 * @attach: human readable attachment string
John Johansenc88d4c72010-07-29 14:48:00 -0700105 * @xmatch: optional extended matching for unconfined executables names
106 * @xmatch_len: xmatch prefix len, used to determine xmatch priority
John Johansenc88d4c72010-07-29 14:48:00 -0700107 * @audit: the auditing mode of the profile
108 * @mode: the enforcement mode of the profile
John Johansenc88d4c72010-07-29 14:48:00 -0700109 * @path_flags: flags controlling path generation behavior
John Johansen72c8a762017-05-22 03:06:52 -0700110 * @disconnected: what to prepend if attach_disconnected is specified
John Johansenc88d4c72010-07-29 14:48:00 -0700111 * @size: the memory consumed by this profiles rules
John Johansenad5ff3d2012-02-16 07:07:53 -0800112 * @policy: general match rules governing policy
John Johansenc88d4c72010-07-29 14:48:00 -0700113 * @file: The set of rules governing basic file access and domain transitions
114 * @caps: capabilities for the profile
115 * @rlimits: rlimits for the profile
116 *
John Johansen0d259f02013-07-10 21:13:43 -0700117 * @dents: dentries for the profiles file entries in apparmorfs
118 * @dirname: name of the profile dir in apparmorfs
William Huae025be02017-01-15 16:49:28 -0800119 * @data: hashtable for free-form policy aa_data
John Johansen0d259f02013-07-10 21:13:43 -0700120 *
John Johansenc88d4c72010-07-29 14:48:00 -0700121 * The AppArmor profile contains the basic confinement data. Each profile
122 * has a name, and exists in a namespace. The @name and @exec_match are
123 * used to determine profile attachment against unconfined tasks. All other
124 * attachments are determined by profile X transition rules.
125 *
John Johansenc88d4c72010-07-29 14:48:00 -0700126 * Profiles have a hierarchy where hats and children profiles keep
127 * a reference to their parent.
128 *
129 * Profile names can not begin with a : and can not contain the \0
130 * character. If a profile name begins with / it will be considered when
131 * determining profile attachment on "unconfined" tasks.
132 */
133struct aa_profile {
134 struct aa_policy base;
John Johansen01e2b672013-07-10 21:06:43 -0700135 struct aa_profile __rcu *parent;
John Johansenc88d4c72010-07-29 14:48:00 -0700136
John Johansen98849df2017-01-16 00:42:16 -0800137 struct aa_ns *ns;
John Johansenc88d4c72010-07-29 14:48:00 -0700138 const char *rename;
139
John Johansen556d0be2013-07-10 21:17:43 -0700140 const char *attach;
John Johansenc88d4c72010-07-29 14:48:00 -0700141 struct aa_dfa *xmatch;
142 int xmatch_len;
John Johansenc88d4c72010-07-29 14:48:00 -0700143 enum audit_mode audit;
John Johansen03816502013-07-10 21:12:43 -0700144 long mode;
John Johansenc88d4c72010-07-29 14:48:00 -0700145 u32 path_flags;
John Johansen72c8a762017-05-22 03:06:52 -0700146 const char *disconnected;
John Johansenc88d4c72010-07-29 14:48:00 -0700147 int size;
148
John Johansenad5ff3d2012-02-16 07:07:53 -0800149 struct aa_policydb policy;
John Johansenc88d4c72010-07-29 14:48:00 -0700150 struct aa_file_rules file;
151 struct aa_caps caps;
Matthew Garrett8e51f902018-02-08 12:37:19 -0800152
153 int xattr_count;
154 char **xattrs;
Matthew Garrett8e51f902018-02-08 12:37:19 -0800155
John Johansenc88d4c72010-07-29 14:48:00 -0700156 struct aa_rlimit rlimits;
John Johansen0d259f02013-07-10 21:13:43 -0700157
Matthew Garrett9caafbe2018-05-24 13:27:46 -0700158 int secmark_count;
159 struct aa_secmark *secmark;
160
John Johansen5ac8c352017-01-16 00:42:55 -0800161 struct aa_loaddata *rawdata;
John Johansenf8eb8a12013-08-14 11:27:36 -0700162 unsigned char *hash;
John Johansen0d259f02013-07-10 21:13:43 -0700163 char *dirname;
164 struct dentry *dents[AAFS_PROF_SIZEOF];
William Huae025be02017-01-15 16:49:28 -0800165 struct rhashtable *data;
John Johansen637f6882017-06-09 08:14:28 -0700166 struct aa_label label;
John Johansenc88d4c72010-07-29 14:48:00 -0700167};
168
John Johansenc88d4c72010-07-29 14:48:00 -0700169extern enum profile_mode aa_g_profile_mode;
170
John Johansen18e99f12017-05-26 01:45:08 -0700171#define AA_MAY_LOAD_POLICY AA_MAY_APPEND
172#define AA_MAY_REPLACE_POLICY AA_MAY_WRITE
173#define AA_MAY_REMOVE_POLICY AA_MAY_DELETE
174
John Johansen637f6882017-06-09 08:14:28 -0700175#define profiles_ns(P) ((P)->ns)
176#define name_is_shared(A, B) ((A)->hname && (A)->hname == (B)->hname)
John Johansencff281f2017-01-16 00:42:15 -0800177
John Johansenc88d4c72010-07-29 14:48:00 -0700178void aa_add_profile(struct aa_policy *common, struct aa_profile *profile);
179
John Johansenc88d4c72010-07-29 14:48:00 -0700180
John Johansen83995882017-01-16 00:42:19 -0800181void aa_free_proxy_kref(struct kref *kref);
John Johansen637f6882017-06-09 08:14:28 -0700182struct aa_profile *aa_alloc_profile(const char *name, struct aa_proxy *proxy,
183 gfp_t gfp);
John Johansen181f7c92017-01-16 00:42:36 -0800184struct aa_profile *aa_new_null_profile(struct aa_profile *parent, bool hat,
185 const char *base, gfp_t gfp);
John Johansen8651e1d62013-07-10 21:11:43 -0700186void aa_free_profile(struct aa_profile *profile);
John Johansenc88d4c72010-07-29 14:48:00 -0700187void aa_free_profile_kref(struct kref *kref);
188struct aa_profile *aa_find_child(struct aa_profile *parent, const char *name);
John Johansen1741e9e2017-01-16 00:42:21 -0800189struct aa_profile *aa_lookupn_profile(struct aa_ns *ns, const char *hname,
190 size_t n);
John Johansen98849df2017-01-16 00:42:16 -0800191struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *name);
John Johansen637f6882017-06-09 08:14:28 -0700192struct aa_profile *aa_fqlookupn_profile(struct aa_label *base,
John Johansen31617dd2017-01-16 00:42:24 -0800193 const char *fqname, size_t n);
John Johansen98849df2017-01-16 00:42:16 -0800194struct aa_profile *aa_match_profile(struct aa_ns *ns, const char *name);
John Johansenc88d4c72010-07-29 14:48:00 -0700195
John Johansen637f6882017-06-09 08:14:28 -0700196ssize_t aa_replace_profiles(struct aa_ns *view, struct aa_label *label,
John Johansen18e99f12017-05-26 01:45:08 -0700197 u32 mask, struct aa_loaddata *udata);
John Johansen637f6882017-06-09 08:14:28 -0700198ssize_t aa_remove_profiles(struct aa_ns *view, struct aa_label *label,
199 char *name, size_t size);
John Johansencff281f2017-01-16 00:42:15 -0800200void __aa_profile_list_release(struct list_head *head);
John Johansenc88d4c72010-07-29 14:48:00 -0700201
202#define PROF_ADD 1
203#define PROF_REPLACE 0
204
John Johansen637f6882017-06-09 08:14:28 -0700205#define profile_unconfined(X) ((X)->mode == APPARMOR_UNCONFINED)
206
207/**
208 * aa_get_newest_profile - simple wrapper fn to wrap the label version
209 * @p: profile (NOT NULL)
210 *
211 * Returns refcount to newest version of the profile (maybe @p)
212 *
213 * Requires: @p must be held with a valid refcount
214 */
215static inline struct aa_profile *aa_get_newest_profile(struct aa_profile *p)
216{
217 return labels_profile(aa_get_newest_label(&p->label));
218}
John Johansenc88d4c72010-07-29 14:48:00 -0700219
John Johansenb9590ad2018-03-03 01:59:02 -0800220#define PROFILE_MEDIATES(P, T) ((P)->policy.start[(unsigned char) (T)])
John Johansen56974a62017-07-18 23:18:33 -0700221static inline unsigned int PROFILE_MEDIATES_AF(struct aa_profile *profile,
222 u16 AF) {
223 unsigned int state = PROFILE_MEDIATES(profile, AA_CLASS_NET);
224 __be16 be_af = cpu_to_be16(AF);
225
226 if (!state)
227 return 0;
228 return aa_dfa_match_len(profile->policy.dfa, state, (char *) &be_af, 2);
229}
230
John Johansenc88d4c72010-07-29 14:48:00 -0700231/**
232 * aa_get_profile - increment refcount on profile @p
233 * @p: profile (MAYBE NULL)
234 *
235 * Returns: pointer to @p if @p is NULL will return NULL
236 * Requires: @p must be held with valid refcount when called
237 */
238static inline struct aa_profile *aa_get_profile(struct aa_profile *p)
239{
240 if (p)
John Johansen637f6882017-06-09 08:14:28 -0700241 kref_get(&(p->label.count));
John Johansenc88d4c72010-07-29 14:48:00 -0700242
243 return p;
244}
245
246/**
John Johansen01e2b672013-07-10 21:06:43 -0700247 * aa_get_profile_not0 - increment refcount on profile @p found via lookup
248 * @p: profile (MAYBE NULL)
249 *
250 * Returns: pointer to @p if @p is NULL will return NULL
251 * Requires: @p must be held with valid refcount when called
252 */
253static inline struct aa_profile *aa_get_profile_not0(struct aa_profile *p)
254{
John Johansen637f6882017-06-09 08:14:28 -0700255 if (p && kref_get_unless_zero(&p->label.count))
John Johansen01e2b672013-07-10 21:06:43 -0700256 return p;
257
258 return NULL;
259}
260
261/**
262 * aa_get_profile_rcu - increment a refcount profile that can be replaced
263 * @p: pointer to profile that can be replaced (NOT NULL)
264 *
265 * Returns: pointer to a refcounted profile.
266 * else NULL if no profile
267 */
268static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)
269{
270 struct aa_profile *c;
271
272 rcu_read_lock();
273 do {
274 c = rcu_dereference(*p);
John Johansen637f6882017-06-09 08:14:28 -0700275 } while (c && !kref_get_unless_zero(&c->label.count));
John Johansen01e2b672013-07-10 21:06:43 -0700276 rcu_read_unlock();
277
278 return c;
279}
280
281/**
John Johansenc88d4c72010-07-29 14:48:00 -0700282 * aa_put_profile - decrement refcount on profile @p
283 * @p: profile (MAYBE NULL)
284 */
285static inline void aa_put_profile(struct aa_profile *p)
286{
John Johansen742058b2013-07-10 21:10:43 -0700287 if (p)
John Johansen637f6882017-06-09 08:14:28 -0700288 kref_put(&p->label.count, aa_label_kref);
John Johansenfa2ac462013-07-10 21:08:43 -0700289}
290
John Johansenc88d4c72010-07-29 14:48:00 -0700291static inline int AUDIT_MODE(struct aa_profile *profile)
292{
293 if (aa_g_audit != AUDIT_NORMAL)
294 return aa_g_audit;
295
296 return profile->audit;
297}
298
John Johansen2bd8dbb2017-01-16 00:42:50 -0800299bool policy_view_capable(struct aa_ns *ns);
John Johansenfd2a8042017-01-16 00:42:51 -0800300bool policy_admin_capable(struct aa_ns *ns);
John Johansen637f6882017-06-09 08:14:28 -0700301int aa_may_manage_policy(struct aa_label *label, struct aa_ns *ns,
John Johansen18e99f12017-05-26 01:45:08 -0700302 u32 mask);
John Johansenc88d4c72010-07-29 14:48:00 -0700303
304#endif /* __AA_POLICY_H */