Lines Matching full:profile
11 * task is confined by. Every task in the system has a profile attached
15 * Each profile exists in a profile namespace which is a container of
16 * visible profiles. Each namespace contains a special "unconfined" profile,
19 * Namespace and profile names can be written together in either
21 * :namespace:profile - used by kernel interfaces for easy detection
22 * namespace://profile - used by policy
24 * Profile names can not start with : or @ or ^ and may not contain \0
26 * Reserved profile names
27 * unconfined - special automatically generated unconfined profile
28 * inherit - special name to indicate profile inheritance
35 * a // in a profile or namespace name indicates a hierarchical name with the
38 * Profile and namespace hierarchies serve two different but similar purposes.
43 * The profile hierarchy severs two distinct purposes,
45 * subprograms under its own profile with different restriction than it
46 * self, and not have it use the system profile.
52 * but is allowed. NOTE: this is currently suboptimal because profile
53 * aliasing is not currently implemented so that a profile for each
58 * A profile or namespace name that can contain one or more // separators
62 * An fqname is a name that may contain both namespace and profile hnames.
66 * - locking of profile lists is currently fairly coarse. All profile
68 * FIXME: move profile lists to using rcu_lists
104 * @profile: the profile to add (NOT NULL)
106 * refcount @profile, should be put by __list_remove_profile
110 static void __add_profile(struct list_head *list, struct aa_profile *profile) in __add_profile() argument
115 AA_BUG(!profile); in __add_profile()
116 AA_BUG(!profile->ns); in __add_profile()
117 AA_BUG(!mutex_is_locked(&profile->ns->lock)); in __add_profile()
119 list_add_rcu(&profile->base.list, list); in __add_profile()
121 aa_get_profile(profile); in __add_profile()
122 l = aa_label_insert(&profile->ns->labels, &profile->label); in __add_profile()
123 AA_BUG(l != &profile->label); in __add_profile()
128 * __list_remove_profile - remove a profile from the list it is on
129 * @profile: the profile to remove (NOT NULL)
131 * remove a profile from the list, warning generally removal should
132 * be done with __replace_profile as most profile removals are
133 * replacements to the unconfined profile.
135 * put @profile list refcount
139 static void __list_remove_profile(struct aa_profile *profile) in __list_remove_profile() argument
141 AA_BUG(!profile); in __list_remove_profile()
142 AA_BUG(!profile->ns); in __list_remove_profile()
143 AA_BUG(!mutex_is_locked(&profile->ns->lock)); in __list_remove_profile()
145 list_del_rcu(&profile->base.list); in __list_remove_profile()
146 aa_put_profile(profile); in __list_remove_profile()
150 * __remove_profile - remove old profile, and children
151 * @profile: profile to be replaced (NOT NULL)
155 static void __remove_profile(struct aa_profile *profile) in __remove_profile() argument
157 AA_BUG(!profile); in __remove_profile()
158 AA_BUG(!profile->ns); in __remove_profile()
159 AA_BUG(!mutex_is_locked(&profile->ns->lock)); in __remove_profile()
162 __aa_profile_list_release(&profile->base.profiles); in __remove_profile()
164 aa_label_remove(&profile->label); in __remove_profile()
165 __aafs_profile_rmdir(profile); in __remove_profile()
166 __list_remove_profile(profile); in __remove_profile()
177 struct aa_profile *profile, *tmp; in __aa_profile_list_release() local
178 list_for_each_entry_safe(profile, tmp, head, base.list) in __aa_profile_list_release()
179 __remove_profile(profile); in __aa_profile_list_release()
233 * aa_free_profile - free a profile
234 * @profile: the profile to free (MAYBE NULL)
236 * Free a profile, its hats and null_profile. All references to the profile,
239 * If the profile was referenced from a task context, free_profile() will
242 void aa_free_profile(struct aa_profile *profile) in aa_free_profile() argument
247 AA_DEBUG("%s(%p)\n", __func__, profile); in aa_free_profile()
249 if (!profile) in aa_free_profile()
253 aa_policy_destroy(&profile->base); in aa_free_profile()
254 aa_put_profile(rcu_access_pointer(profile->parent)); in aa_free_profile()
256 aa_put_ns(profile->ns); in aa_free_profile()
257 kfree_sensitive(profile->rename); in aa_free_profile()
259 free_attachment(&profile->attach); in aa_free_profile()
265 list_for_each_entry_safe(rule, tmp, &profile->rules, list) { in aa_free_profile()
269 kfree_sensitive(profile->dirname); in aa_free_profile()
271 if (profile->data) { in aa_free_profile()
272 rht = profile->data; in aa_free_profile()
273 profile->data = NULL; in aa_free_profile()
278 kfree_sensitive(profile->hash); in aa_free_profile()
279 aa_put_loaddata(profile->rawdata); in aa_free_profile()
280 aa_label_destroy(&profile->label); in aa_free_profile()
282 kfree_sensitive(profile); in aa_free_profile()
286 * aa_alloc_profile - allocate, initialize and return a new profile
287 * @hname: name of the profile (NOT NULL)
290 * Returns: refcount profile or NULL on failure
295 struct aa_profile *profile; in aa_alloc_profile() local
299 profile = kzalloc(struct_size(profile, label.vec, 2), gfp); in aa_alloc_profile()
300 if (!profile) in aa_alloc_profile()
303 if (!aa_policy_init(&profile->base, NULL, hname, gfp)) in aa_alloc_profile()
305 if (!aa_label_init(&profile->label, 1, gfp)) in aa_alloc_profile()
308 INIT_LIST_HEAD(&profile->rules); in aa_alloc_profile()
314 list_add(&rules->list, &profile->rules); in aa_alloc_profile()
318 proxy = aa_alloc_proxy(&profile->label, gfp); in aa_alloc_profile()
323 profile->label.proxy = proxy; in aa_alloc_profile()
325 profile->label.hname = profile->base.hname; in aa_alloc_profile()
326 profile->label.flags |= FLAG_PROFILE; in aa_alloc_profile()
327 profile->label.vec[0] = profile; in aa_alloc_profile()
330 return profile; in aa_alloc_profile()
333 aa_free_profile(profile); in aa_alloc_profile()
338 /* TODO: profile accounting - setup in remove */
341 * __strn_find_child - find a profile on @head list using substring of @name
343 * @name: name of profile (NOT NULL)
348 * Returns: unrefcounted profile ptr, or NULL if not found
357 * __find_child - find a profile on @head list with a name matching @name
359 * @name: name of profile (NOT NULL)
363 * Returns: unrefcounted profile ptr, or NULL if not found
371 * aa_find_child - find a profile by @name in @parent
372 * @parent: profile to search (NOT NULL)
373 * @name: profile name to search for (NOT NULL)
375 * Returns: a refcounted profile or NULL if not found
379 struct aa_profile *profile; in aa_find_child() local
383 profile = __find_child(&parent->base.profiles, name); in aa_find_child()
384 } while (profile && !aa_get_profile_not0(profile)); in aa_find_child()
388 return profile; in aa_find_child()
392 * __lookup_parent - lookup the parent of a profile of name @hname
393 * @ns: namespace to lookup profile in (NOT NULL)
394 * @hname: hierarchical profile name to find parent of (NOT NULL)
396 * Lookups up the parent of a fully qualified profile name, the profile
398 * is used to load a new profile.
408 struct aa_profile *profile = NULL; in __lookup_parent() local
414 profile = __strn_find_child(&policy->profiles, hname, in __lookup_parent()
416 if (!profile) in __lookup_parent()
418 policy = &profile->base; in __lookup_parent()
422 if (!profile) in __lookup_parent()
424 return &profile->base; in __lookup_parent()
429 * @ns: namespace to lookup profile in (NOT NULL)
430 * @hname: hierarchical profile name to find parent of (NOT NULL)
443 struct aa_profile *parent, *profile = NULL; in __create_missing_ancestors() local
452 parent = profile; in __create_missing_ancestors()
453 profile = __strn_find_child(&policy->profiles, hname, in __create_missing_ancestors()
455 if (!profile) { in __create_missing_ancestors()
460 profile = aa_alloc_null(parent, name, gfp); in __create_missing_ancestors()
462 if (!profile) in __create_missing_ancestors()
465 profile->ns = aa_get_ns(ns); in __create_missing_ancestors()
467 policy = &profile->base; in __create_missing_ancestors()
471 if (!profile) in __create_missing_ancestors()
473 return &profile->base; in __create_missing_ancestors()
477 * __lookupn_profile - lookup the profile matching @hname
478 * @base: base list to start looking up profile name from (NOT NULL)
479 * @hname: hierarchical profile name (NOT NULL)
484 * Returns: unrefcounted profile pointer or NULL if not found
486 * Do a relative name lookup, recursing through profile tree.
491 struct aa_profile *profile = NULL; in __lookupn_profile() local
496 profile = __strn_find_child(&base->profiles, hname, in __lookupn_profile()
498 if (!profile) in __lookupn_profile()
501 base = &profile->base; in __lookupn_profile()
518 * aa_lookupn_profile - find a profile by its full or partial name
523 * Returns: refcounted profile or NULL if not found
528 struct aa_profile *profile; in aa_lookupn_profile() local
532 profile = __lookupn_profile(&ns->base, hname, n); in aa_lookupn_profile()
533 } while (profile && !aa_get_profile_not0(profile)); in aa_lookupn_profile()
536 /* the unconfined profile is not in the regular profile list */ in aa_lookupn_profile()
537 if (!profile && strncmp(hname, "unconfined", n) == 0) in aa_lookupn_profile()
538 profile = aa_get_newest_profile(ns->unconfined); in aa_lookupn_profile()
541 return profile; in aa_lookupn_profile()
552 struct aa_profile *profile; in aa_fqlookupn_profile() local
566 profile = aa_lookupn_profile(ns, name, n - (name - fqname)); in aa_fqlookupn_profile()
568 /* default profile for ns, currently unconfined */ in aa_fqlookupn_profile()
569 profile = aa_get_newest_profile(ns->unconfined); in aa_fqlookupn_profile()
571 profile = NULL; in aa_fqlookupn_profile()
574 return profile; in aa_fqlookupn_profile()
581 struct aa_profile *profile; in aa_alloc_null() local
584 profile = aa_alloc_profile(name, NULL, gfp); in aa_alloc_null()
585 if (!profile) in aa_alloc_null()
589 profile->label.flags |= FLAG_NULL; in aa_alloc_null()
590 rules = list_first_entry(&profile->rules, typeof(*rules), list); in aa_alloc_null()
603 profile->path_flags = parent->path_flags; in aa_alloc_null()
606 rcu_assign_pointer(profile->parent, aa_get_profile(parent)); in aa_alloc_null()
607 profile->ns = aa_get_ns(parent->ns); in aa_alloc_null()
610 return profile; in aa_alloc_null()
613 aa_free_profile(profile); in aa_alloc_null()
619 * aa_new_learning_profile - create or find a null-X learning profile
620 * @parent: profile that caused this profile to be created (NOT NULL)
621 * @hat: true if the null- learning profile is a hat
622 * @base: name to base the null profile off of
625 * Find/Create a null- complain mode profile used in learning mode. The
626 * name of the profile is unique and follows the format of parent//null-XXX.
630 * null profiles are added to the profile list but the list does not
634 * Returns: new refcounted profile else NULL on failure
639 struct aa_profile *p, *profile; in aa_new_learning_profile() local
664 profile = aa_find_child(parent, bname); in aa_new_learning_profile()
665 if (profile) in aa_new_learning_profile()
668 profile = aa_alloc_null(parent, name, gfp); in aa_new_learning_profile()
669 if (!profile) in aa_new_learning_profile()
671 profile->mode = APPARMOR_COMPLAIN; in aa_new_learning_profile()
673 profile->label.flags |= FLAG_HAT; in aa_new_learning_profile()
675 mutex_lock_nested(&profile->ns->lock, profile->ns->level); in aa_new_learning_profile()
678 aa_free_profile(profile); in aa_new_learning_profile()
679 profile = aa_get_profile(p); in aa_new_learning_profile()
681 __add_profile(&parent->base.profiles, profile); in aa_new_learning_profile()
683 mutex_unlock(&profile->ns->lock); in aa_new_learning_profile()
689 return profile; in aa_new_learning_profile()
693 aa_free_profile(profile); in aa_new_learning_profile()
699 * @profile: profile to test if it can be replaced (MAYBE NULL)
705 static int replacement_allowed(struct aa_profile *profile, int noreplace, in replacement_allowed() argument
708 if (profile) { in replacement_allowed()
709 if (profile->label.flags & FLAG_IMMUTIBLE) { in replacement_allowed()
710 *info = "cannot replace immutable profile"; in replacement_allowed()
713 *info = "profile already exists"; in replacement_allowed()
736 * @name: name of profile being manipulated (NOT NULL)
871 struct aa_profile *profile) in __list_lookup_parent() argument
873 const char *base = basename(profile->base.hname); in __list_lookup_parent()
874 long len = base - profile->base.hname; in __list_lookup_parent()
883 if (ent->new == profile) in __list_lookup_parent()
885 if (strncmp(ent->new->base.hname, profile->base.hname, len) == in __list_lookup_parent()
895 * @old: profile to be replaced (NOT NULL)
896 * @new: profile to replace @old with (NOT NULL)
952 * __lookup_replace - lookup replacement information for a profile
954 * @hname - name of profile to lookup
955 * @noreplace - true if not replacing an existing profile
956 * @p - Returns: profile to be replaced
959 * Returns: profile to replace (no ref) on success else ptr error
969 *info = "profile can not be replaced"; in __lookup_replace()
1008 * aa_replace_profiles - replace profile(s) on the profile list
1014 * unpack and replace a profile on the profile list and uses of that profile
1015 * by any task creds via invalidating the old version of the profile, which
1016 * tasks will notice to update their own cred. If the profile does not exist
1017 * on the profile list it is added.
1130 * profile that doesn't have in aa_replace_profiles()
1132 * individual profile loading where in aa_replace_profiles()
1137 * null profile will be replaced once in aa_replace_profiles()
1151 /* released on profile replacement or free_profile */ in aa_replace_profiles()
1193 /* dedup actual profile replacement */ in aa_replace_profiles()
1195 "same as current profile, skipping", in aa_replace_profiles()
1204 * TODO: finer dedup based on profile range in data. Load set in aa_replace_profiles()
1205 * can differ but profile may remain unchanged in aa_replace_profiles()
1249 info = "valid profile in failed atomic policy load"; in aa_replace_profiles()
1252 info = "unchecked profile in failed atomic policy load"; in aa_replace_profiles()
1269 * aa_remove_profiles - remove profile(s) from the system
1272 * @fqname: name of the profile or namespace to remove (NOT NULL)
1275 * Remove a profile or sub namespace from the current namespace, so that
1286 struct aa_profile *profile = NULL; in aa_remove_profiles() local
1292 info = "no profile specified"; in aa_remove_profiles()
1320 /* remove profile */ in aa_remove_profiles()
1322 profile = aa_get_profile(__lookup_profile(&ns->base, name)); in aa_remove_profiles()
1323 if (!profile) { in aa_remove_profiles()
1325 info = "profile does not exist"; in aa_remove_profiles()
1328 name = profile->base.hname; in aa_remove_profiles()
1330 __remove_profile(profile); in aa_remove_profiles()
1339 aa_put_profile(profile); in aa_remove_profiles()