[SRU][P][PATCH 1/1] UBUNTU: SAUCE: apparmor5.0.0 [94/93]: apparmor: prevent profile->disconnected double free in aa_free_profile
John Johansen
john.johansen at canonical.com
Tue Aug 12 21:46:26 UTC 2025
sorry grabbed the questing patch, resend incoming
On 8/12/25 12:41, John Johansen wrote:
> BugLink: https://bugs.launchpad.net/bugs/2120233
>
> policy_unpack.c:unpack_profile looks for strings labeled "disconnected"
> and "disconnected_ipc", with the pointer stored for disconnected_ipc
> falling back onto the pointer stored for disconnected if disconnected_ipc
> is not present. However, policy.c:aa_free_profile unconditionally freed
> both pointers, resulting in a double free if the pointers are identical.
> To fix this, first check that the pointers are distinct before freeing the
> disconnected_ipc pointer separately.
>
> Under the right circumstances, KASAN would print a slab-use-after-free
> message from aa_free_profile.part.0:
>
> Call Trace:
> <snip>
> ? aa_free_profile.part.0
> ? aa_free_profile.part.0
> ? aa_free_profile.part.0
> __kasan_check_byte
> ? rcu_do_batch
> kfree_sensitive
> aa_free_profile.part.0
> ? rcu_do_batch
> aa_free_profile
> label_free_switch
> label_free_rcu
> rcu_do_batch
> <snip>
> Allocated by task 6130:
> <snip>
> aa_unpack_strdup
> unpack_profile
> aa_unpack
> aa_replace_profiles
> policy_update
> profile_replace
> <snip>
> Freed by task 17:
> kfree
> kfree_sensitive
> aa_free_profile.part.0
> aa_free_profile
> label_free_switch
> label_free_rcu
> rcu_do_batch
> <snip>
>
> The double free could also lead to a kernel panic due to invalid opcodes
> inside kfree:
>
> <snip>
> kfree_sensitive
> aa_free_profile.part.0
> ? rcu_do_batch
> aa_free_profile
> label_free_switch
> label_free_rcu
> rcu_do_batch
>
> Suggested-by: John Johansen <john.johansen at canonical.com>
> Fixes: 79a9a8a4c936 ("UBUNTU: SAUCE: apparmor4.0.0 [58/53]: apparmor: add mediation of disconnected paths in mqueues")
> Signed-off-by: Ryan Lee <ryan.lee at canonical.com>
> Signed-off-by: John Johansen <john.johansen at canonical.com>
> ---
> security/apparmor/policy.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/security/apparmor/policy.c b/security/apparmor/policy.c
> index 0a00fa0b9a22..d4b991d20521 100644
> --- a/security/apparmor/policy.c
> +++ b/security/apparmor/policy.c
> @@ -310,7 +310,14 @@ void aa_free_profile(struct aa_profile *profile)
> aa_put_ns(profile->ns);
> kfree_sensitive(profile->rename);
> kfree_sensitive(profile->disconnected);
> - kfree_sensitive(profile->disconnected_ipc);
> + /*
> + * If disconnected is specified while disconnected_ipc is not,
> + * disconnected_ipc will be set to disconnected in unpack_profile().
> + * Thus, we need to check that the pointers are distinct in order to
> + * prevent a double free.
> + */
> + if (profile->disconnected_ipc != profile->disconnected)
> + kfree_sensitive(profile->disconnected_ipc);
>
> free_attachment(&profile->attach);
> kfree_sensitive(profile->net_compat);
More information about the kernel-team
mailing list