[apparmor] [PATCH 1/2] apparmor: fix invalid deref of rawdata when export_binary is unset

John Johansen john.johansen at canonical.com
Thu Feb 5 07:39:22 UTC 2026


On 1/29/26 10:58, Georgia Garcia wrote:
> If the export_binary parameter is disabled on runtime, profiles that
> were loaded before that will still have their rawdata stored in
> apparmorfs, with a symbolic link to the rawdata on the policy
> directory. When one of those profiles are replaced, the rawdata is set
> to NULL, but when trying to resolve the symbolic links to rawdata for
> that profile, it will try to dereference profile->rawdata->name when
> profile->rawdata is now NULL causing an oops. Fix it by checking if
> rawdata is set.
> 
> [  168.653080] BUG: kernel NULL pointer dereference, address: 0000000000000088
> [  168.657420] #PF: supervisor read access in kernel mode
> [  168.660619] #PF: error_code(0x0000) - not-present page
> [  168.663613] PGD 0 P4D 0
> [  168.665450] Oops: Oops: 0000 [#1] SMP NOPTI
> [  168.667836] CPU: 1 UID: 0 PID: 1729 Comm: ls Not tainted 6.19.0-rc7+ #3 PREEMPT(voluntary)
> [  168.672308] Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
> [  168.679327] RIP: 0010:rawdata_get_link_base.isra.0+0x23/0x330
> [  168.682768] Code: 90 90 90 90 90 90 90 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 41 55 41 54 53 48 83 ec 18 48 89 55 d0 48 85 ff 0f 84 e3 01 00 00 <48> 83 3c 25 88 00 00 00 00 0f 84 d4 01 00 00 49 89 f6 49 89 cc e8
> [  168.689818] RSP: 0018:ffffcdcb8200fb80 EFLAGS: 00010282
> [  168.690871] RAX: ffffffffaee74ec0 RBX: 0000000000000000 RCX: ffffffffb0120158
> [  168.692251] RDX: ffffcdcb8200fbe0 RSI: ffff88c187c9fa80 RDI: ffff88c186c98a80
> [  168.693593] RBP: ffffcdcb8200fbc0 R08: 0000000000000000 R09: 0000000000000000
> [  168.694941] R10: 0000000000000000 R11: 0000000000000000 R12: ffff88c186c98a80
> [  168.696289] R13: 00007fff005aaa20 R14: 0000000000000080 R15: ffff88c188f4fce0
> [  168.697637] FS:  0000790e81c58280(0000) GS:ffff88c20a957000(0000) knlGS:0000000000000000
> [  168.699227] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  168.700349] CR2: 0000000000000088 CR3: 000000012fd3e000 CR4: 0000000000350ef0
> [  168.701696] Call Trace:
> [  168.702325]  <TASK>
> [  168.702995]  rawdata_get_link_data+0x1c/0x30
> [  168.704145]  vfs_readlink+0xd4/0x160
> [  168.705152]  do_readlinkat+0x114/0x180
> [  168.706214]  __x64_sys_readlink+0x1e/0x30
> [  168.708653]  x64_sys_call+0x1d77/0x26b0
> [  168.709525]  do_syscall_64+0x81/0x500
> [  168.710348]  ? do_statx+0x72/0xb0
> [  168.711109]  ? putname+0x3e/0x80
> [  168.711845]  ? __x64_sys_statx+0xb7/0x100
> [  168.712711]  ? x64_sys_call+0x10fc/0x26b0
> [  168.713577]  ? do_syscall_64+0xbf/0x500
> [  168.714412]  ? do_user_addr_fault+0x1d2/0x8d0
> [  168.715404]  ? irqentry_exit+0xb2/0x740
> [  168.716359]  ? exc_page_fault+0x90/0x1b0
> [  168.717307]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> 
> Signed-off-by: Georgia Garcia <georgia.garcia at canonical.com>

Acked-by: John Johansen <john.johansen at canonical.com>

I pulled patch 1/2 (bug fix) in, patch 2/2 will need more review, and have to wait in the queue for next cycle

> ---
>   security/apparmor/apparmorfs.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
> 
> diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
> index 907bd2667e28..4fb251a7e85a 100644
> --- a/security/apparmor/apparmorfs.c
> +++ b/security/apparmor/apparmorfs.c
> @@ -1644,6 +1644,14 @@ static const char *rawdata_get_link_base(struct dentry *dentry,
>   
>   	label = aa_get_label_rcu(&proxy->label);
>   	profile = labels_profile(label);
> +
> +	/* rawdata can be null when aa_g_export_binary is unset during
> +	 * runtime and a profile is replaced */
> +	if (!profile->rawdata) {
> +		aa_put_label(label);
> +		return ERR_PTR(-ENOENT);
> +	}
> +
>   	depth = profile_depth(profile);
>   	target = gen_symlink_name(depth, profile->rawdata->name, name);
>   	aa_put_label(label);




More information about the AppArmor mailing list