Thread (2 messages) flat view 2 messages, 1 author, 13d ago

Re: [PATCH] smack: fix cred UAF in smack_file_send_sigiotask()

From: Jann Horn <jannh@google.com>
Date: 2026-08-06 19:46:53
Also in: lkml, stable

On Thu, Aug 6, 2026 at 9:41 PM Jann Horn [off-list ref] wrote:
When inspecting the credentials of another task, objective credentials
(->real_cred, accessed with __task_cred()) must always be used.

Accessing ->cred on a non-current task is forbidden unless that task is
being created or destroyed; a task is allowed to change its own ->cred
pointer with no synchronization, and changing ->cred should only affect the
current syscall.

smack_file_send_sigiotask() was accessing both sets of credentials: First
tsk->cred, then __task_cred(tsk).

Fix it, always access the objective credentials here.

I have tested that this bug can lead to a KASAN-reported UAF of struct cred
in smack_file_send_sigiotask(), and that this fix prevents the race.
This is the testcase that I used to trigger a KASAN splat, with a
custom harness that allows me to test specific orderings of a race
condition:
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

static int pipefds[2];

/* runs in the same thread as test_thread1() */
void test_setup(void) {
  seteuid(1);
  signal(SIGIO, SIG_IGN);
  pipe(pipefds);
  fcntl(pipefds[0], F_SETFL, O_ASYNC);
  struct f_owner_ex owner = {
    .type = F_OWNER_TID,
    .pid = gettid()
  };
  fcntl(pipefds[0], F_SETOWN_EX, &owner);
}
void test_thread1(void) {
  access("/", R_OK);
}
void test_thread2(void) {
  write(pipefds[1], "A", 1);
}
void test_end(void) {}
Resulting in this splat:
==================================================================
BUG: KASAN: slab-use-after-free in smack_file_send_sigiotask+0x48/0x170
Read of size 8 at addr ffff8881001ad858 by task kcov-vsock-clie/60

CPU: 1 UID: 1 PID: 60 Comm: kcov-vsock-clie Not tainted
7.2.0-rc3-00019-ga4fe47ae7d00 #4 PREEMPT(full)
Call Trace:
 <TASK>
 __dump_stack+0x21/0x30
 dump_stack_lvl+0x95/0xd0
 print_address_description+0x77/0x1f0
 print_report+0x5b/0x70
[...]
 kasan_report+0x144/0x180
[...]
 __asan_load8+0xbb/0xc0
 smack_file_send_sigiotask+0x48/0x170
 security_file_send_sigiotask+0x85/0xc0
 send_sigio_to_task+0x141/0x350
[...]
 send_sigio+0x95/0x190
 kill_fasync+0xfe/0x180
 anon_pipe_write+0xe24/0xf50
[...]
 vfs_write+0x520/0x950
[...]
 ksys_write+0x11c/0x1f0
[...]
 __x64_sys_write+0x47/0x60
 x64_sys_call+0x2762/0x3030
 do_syscall_64+0xcd/0x310
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
[...]
 </TASK>

Allocated by task 59:
 kasan_save_track+0x3e/0x80
 kasan_save_alloc_info+0x3a/0x50
 __kasan_slab_alloc+0x52/0x70
 kmem_cache_alloc_noprof+0x161/0x290
 prepare_creds+0x3b/0x2d0
 do_faccessat+0x1cd/0x7d0
 __x64_sys_access+0x3b/0x50
 x64_sys_call+0x297e/0x3030
 do_syscall_64+0xcd/0x310
 entry_SYSCALL_64_after_hwframe+0x76/0x7e

Freed by task 59:
 kasan_save_track+0x3e/0x80
 kasan_save_free_info+0x44/0x50
 __kasan_slab_free+0x47/0x80
 kmem_cache_free+0x132/0x340
 put_cred_rcu+0x131/0x1b0
 __put_cred+0xb2/0x100
 do_faccessat+0x5cf/0x7d0
 __x64_sys_access+0x3b/0x50
 x64_sys_call+0x297e/0x3030
 do_syscall_64+0xcd/0x310
 entry_SYSCALL_64_after_hwframe+0x76/0x7e

The buggy address belongs to the object at ffff8881001ad800
 which belongs to the cache cred of size 144
The buggy address is located 88 bytes inside of
 freed 144-byte region [ffff8881001ad800, ffff8881001ad890)

The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1001ad
flags: 0x8000000000000000(zone=2)
page_type: f5(slab)
raw: 8000000000000000 ffff8881001ce280 dead000000000122 0000000000000000
raw: 0000000000000000 0000000000100010 00000000f5000000 0000000000000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
 ffff8881001ad700: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff8881001ad780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff8881001ad800: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                                    ^
 ffff8881001ad880: fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff8881001ad900: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help