BUG: unable to handle kernel paging request in __run_timers (3)

Status: upstream: reported syz repro on 2026/11/12 05:56
Subsystems: virt
Labels: prio:normal
[Documentation on labels]
Reported-by: syzbot+0d91f453e89c72a04157@syzkaller.appspotmail.com
First crash: 4d01h, last: 4d01h
✨ AI-generated root cause summary:

proc_bus_pci_write() in drivers/pci/proc.c allows userspace to write raw values directly into the PCI configuration space of PCI devices without restricting writes to critical platform host bridge registers when lockdown is not active. Writing to device 00:00.0 (the Q35 Host Bridge / DRAM Controller) overwrites memory controller registers, causing QEMU to unmap system RAM and return all-ones (0xffffffffffffffff) for affected physical addresses. Consequently, when the timer subsystem in __run_timers() dequeues an active timer from an affected page, entry->next and entry->pprev evaluate to 0xffffffffffffffff, causing __hlist_del() to trigger a fatal supervisor write page fault at address 0xffffffffffffffff.

▶ ▼ ✨ Full AI root cause analysis
Based on kernel commit d164c7d754f0:

Root Cause Analysis

1. Crash Site and Failure Mechanism

The crash occurs in kernel/time/timer.c during softirq timer handling: run_timer_softirq() $\to$ run_timer_base() $\to$ __run_timers() $\to$ expire_timers() $\to$ detach_timer() $\to$ __hlist_del().

In include/linux/list.h:

static inline void __hlist_del(struct hlist_node *n)
{
	struct hlist_node *next = n->next;
	struct hlist_node **pprev = n->pprev;

	WRITE_ONCE(*pprev, next);
	if (next)
		WRITE_ONCE(next->pprev, pprev);
}

When detach_timer() attempts to detach an expired struct timer_list residing at kernel virtual address 0xffff8880456d98d8 (physical address 0x456d98d8), it reads entry->next into R15 and entry->pprev into RAX. Both fields contain 0xffffffffffffffff. Executing WRITE_ONCE(*pprev, next) (mov %r15, (%rax)) attempts a supervisor write to virtual address 0xffffffffffffffff, triggering a fatal kernel page fault (#PF: supervisor write access in kernel mode, address ffffffffffffffff).

2. Root Cause and Trigger

The crash is triggered by proc_bus_pci_write() in drivers/pci/proc.c:

  1. The reproducer mounts procfs at ./proc, opens ./proc/bus/pci/00/00.0 with O_RDWR, and writes 125 (0x7d) bytes starting at offset 0 (*ppos = 0).
  2. Unless kernel lockdown (LOCKDOWN_PCI_ACCESS) is enforced, proc_bus_pci_write() performs unchecked raw configuration writes via pci_user_write_config_byte(), pci_user_write_config_word(), and pci_user_write_config_dword().
  3. PCI device 00:00.0 corresponds to Bus 0, Device 0, Function 0, which on QEMU's Q35 platform is the host bridge / MCH (Memory Controller Hub / DRAM controller).
  4. Writing raw values into configuration space offsets 0x00 through 0x7c of device 00:00.0 reconfigures critical memory-routing and chipset registers (such as PCIEXBAR at offset 0x60, PAM, and memory limit registers like TOLUD).
  5. As a result of reconfiguring the host bridge registers, QEMU's address space decoding modifies or unmaps physical RAM regions. Subsequent CPU read accesses to affected physical memory addresses (such as 0x456d98d8) return floating-bus all-ones (0xffffffffffffffff).
  6. When the timer softirq attempts to service and dequeue an active struct timer_list mapped in that address range, all struct fields read as 0xffffffffffffffff, leading directly to the wild pointer write in __hlist_del().
▶ ▼ ✨ AI Jobs (2)
ID Workflow Result Correct Bug Created Started Finished Revision
725521d0 repro-c 💥 BUG: unable to handle kernel paging request in __run_timers (3) 2026/11/11 15:09 2026/11/11 15:09 2026/11/12 00:46 8d68b303
504148f4 assessment-security DenialOfService: ✅ Exploitable: ✅ FilesystemTrigger: ❌ FuzzingArtifact: ❌ MemoryCorruption: ✅ NetworkNeedsSetup: ❌ NetworkTrigger: ❌ PeripheralTrigger: ❌ RemoteTrigger: ❌ Unprivileged: ❌ UserNamespace: ❌ VMGuestTrigger: ❌ VMHostTrigger: ❌ ❓ BUG: unable to handle kernel paging request in __run_timers (3) 2026/11/08 05:07 2026/11/08 05:07 2026/11/08 05:46 5cecaf1f
▶ ▼ Discussions (1)
Title Replies (including bot) Last reply
[syzbot] [virt?] BUG: unable to handle kernel paging request in __run_timers (3) 0 (1) 2026/11/12 05:56
▶ ▼ Similar bugs (15)
Kernel Title Rank 🛈 Repro Cause bisect Fix bisect Count Last Reported Patched Status
upstream BUG: unable to handle kernel paging request in __run_timers (2) sound virt net 21 4 284d 381d 0/29 auto-obsoleted due to no activity on 2026/05/01 08:57
upstream BUG: unable to handle kernel paging request in __run_timers net 8 2 2861d 2870d 0/29 auto-closed as invalid on 2019/07/10 08:52
android-54 KASAN: use-after-free Write in __run_timers (2) 22 syz, C 752 535d 624d 0/2 upstream: reported C repro on 2025/02/25 14:17
android-54 KASAN: use-after-free Write in __run_timers 22 syz 449 862d 2314d 0/2 auto-obsoleted due to no activity on 2024/09/11 00:16
upstream KASAN: invalid-access Write in __run_timers kernel -1 8 2091d 2098d 0/29 auto-closed as invalid on 2021/05/20 13:15
android-6-1 KASAN: use-after-free Write in __run_timers origin:lts 22 syz, C 1164 6h40m 710d 0/2 upstream: reported C repro on 2024/12/01 07:19
upstream KMSAN: uninit-value in __run_timers (3) net 7 syz, C error 4 1163d 1200d 0/29 auto-obsoleted due to no activity on 2024/01/10 00:11
upstream KASAN: slab-use-after-free Write in __run_timers net 22 1 621d 621d 0/29 closed as invalid on 2025/03/30 10:14
upstream general protection fault in __run_timers (4) prio:high netfilter 2 1 104d 100d 0/29 auto-obsoleted due to no activity on 2026/10/28 15:26
linux-5.15 KASAN: use-after-free Write in __run_timers origin:lts-only 22 syz, C error 1 301d 335d 0/3 auto-obsoleted due to no activity on 2026/06/03 21:03
android-54 KASAN: slab-out-of-bounds Write in __run_timers 21 4 1962d 2153d 0/2 auto-closed as invalid on 2021/10/26 12:53
upstream BUG: unable to handle kernel NULL pointer dereference in __run_timers arm 10 1 896d 892d 0/29 auto-obsoleted due to no activity on 2024/08/27 10:03
upstream general protection fault in __run_timers kernel 2 35 3340d 3362d 0/29 closed as invalid on 2017/10/22 12:45
upstream general protection fault in __run_timers (2) kernel 2 syz, C 5 3000d 3016d 0/29 closed as invalid on 2018/09/05 12:51
upstream general protection fault in __run_timers (3) kernel 2 1 2254d 2250d 0/29 auto-closed as invalid on 2020/12/09 00:33

Sample crash report:
BUG: unable to handle page fault for address: ffffffffffffffff
#PF: supervisor write access in kernel mode
#PF: error_code(0x0002) - not-present page
PGD fd99067 P4D fd99067 PUD fd9b067 PMD 0 
Oops: Oops: 0002 [#1] SMP KASAN NOPTI
CPU: 2 UID: 0 PID: 0 Comm: swapper/2 Not tainted syzkaller #0 PREEMPT(full) 
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
RIP: 0010:__hlist_del include/linux/list.h:1045 [inline]
RIP: 0010:detach_timer kernel/time/timer.c:892 [inline]
RIP: 0010:expire_timers kernel/time/timer.c:1783 [inline]
RIP: 0010:__run_timers+0x68a/0xb00 kernel/time/timer.c:2375
Code: 8b 3b 48 89 f8 48 c1 e8 03 42 80 3c 20 00 0f 85 08 03 00 00 48 8b 43 08 48 89 c2 48 c1 ea 03 42 80 3c 22 00 0f 85 db 02 00 00 <4c> 89 38 48 89 44 24 08 4d 85 ff 74 24 e8 54 50 15 00 49 8d 7f 08
RSP: 0018:ffffc90000658d48 EFLAGS: 00010046
RAX: ffffffffffffffff RBX: ffff8880456d98d8 RCX: 0000000000000102
RDX: 1fffffffffffffff RSI: ffffffff81f92b99 RDI: ffff8880456d98e0
RBP: ffffc90000658e08 R08: 0000000000000000 R09: 0000000000000001
R10: ffffffff926ab25f R11: 0000000000000001 R12: dffffc0000000000
R13: fffff520000cb1c1 R14: ffff88806a2266c0 R15: ffffffffffffffff
FS:  0000000000000000(0000) GS:ffff8880d4675000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffffffffffffff CR3: 0000000059bd9000 CR4: 0000000000352ef0
Call Trace:
 <IRQ>
 __run_timer_base kernel/time/timer.c:2387 [inline]
 __run_timer_base kernel/time/timer.c:2379 [inline]
 run_timer_base+0x114/0x190 kernel/time/timer.c:2396
 run_timer_softirq+0x1a/0x50 kernel/time/timer.c:2406
 handle_softirqs+0x216/0xa20 kernel/softirq.c:669
 __do_softirq kernel/softirq.c:703 [inline]
 invoke_softirq kernel/softirq.c:542 [inline]
 __irq_exit_rcu+0x178/0x220 kernel/softirq.c:786
 irq_exit_rcu+0x9/0x30 kernel/softirq.c:809
 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1062 [inline]
 sysvec_apic_timer_interrupt+0xa3/0xc0 arch/x86/kernel/apic/apic.c:1062
 </IRQ>
 <TASK>
 asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:674
RIP: 0010:pv_native_safe_halt+0xf/0x20 arch/x86/kernel/paravirt.c:64
Code: 67 a0 02 e9 43 61 03 00 0f 1f 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 0f 1e fa eb 07 0f 00 2d c3 6d 1c 00 fb f4 <c3> cc cc cc cc 66 2e 0f 1f 84 00 00 00 00 00 66 90 90 90 90 90 90
RSP: 0018:ffffc90000197e00 EFLAGS: 00000206
RAX: 000000000004ea47 RBX: ffff888020aba580 RCX: ffffffff8bef5325
RDX: 0000000000000001 RSI: ffffffff8e629989 RDI: ffffffff8c835980
RBP: ffffed10041574b0 R08: 0000000000000001 R09: ffffed100d446825
R10: ffff88806a23412b R11: 0000000000000001 R12: 0000000000000000
R13: 0000000000000000 R14: 1ffff92000032fc4 R15: dffffc0000000000
 arch_safe_halt arch/x86/include/asm/paravirt.h:62 [inline]
 default_idle+0x9/0x10 arch/x86/kernel/process.c:768
 default_idle_call+0x6c/0xb0 kernel/sched/idle.c:122
 cpuidle_idle_call kernel/sched/idle.c:199 [inline]
 do_idle+0x3ae/0x5b0 kernel/sched/idle.c:355
 cpu_startup_entry+0x4f/0x60 kernel/sched/idle.c:458
 start_secondary+0x21d/0x2d0 arch/x86/kernel/smpboot.c:312
 common_startup_64+0x13e/0x158
 </TASK>
Modules linked in:
CR2: ffffffffffffffff
---[ end trace 0000000000000000 ]---
----------------
Code disassembly (best guess):
   0:	8b 3b                	mov    (%rbx),%edi
   2:	48 89 f8             	mov    %rdi,%rax
   5:	48 c1 e8 03          	shr    $0x3,%rax
   9:	42 80 3c 20 00       	cmpb   $0x0,(%rax,%r12,1)
   e:	0f 85 08 03 00 00    	jne    0x31c
  14:	48 8b 43 08          	mov    0x8(%rbx),%rax
  18:	48 89 c2             	mov    %rax,%rdx
  1b:	48 c1 ea 03          	shr    $0x3,%rdx
  1f:	42 80 3c 22 00       	cmpb   $0x0,(%rdx,%r12,1)
  24:	0f 85 db 02 00 00    	jne    0x305
* 2a:	4c 89 38             	mov    %r15,(%rax) <-- trapping instruction
  2d:	48 89 44 24 08       	mov    %rax,0x8(%rsp)
  32:	4d 85 ff             	test   %r15,%r15
  35:	74 24                	je     0x5b
  37:	e8 54 50 15 00       	call   0x155090
  3c:	49 8d 7f 08          	lea    0x8(%r15),%rdi

Crashes (2):
Time Kernel Commit Syzkaller Config Log Report Syz repro C repro VM info Assets (help?) Manager Title
2026/11/08 05:07 upstream d164c7d754f0 5cecaf1f .config console log report syz / log [disk image (non-bootable)] [vmlinux] [kernel image] ci-qemu-upstream BUG: unable to handle kernel paging request in __run_timers
2026/11/08 05:53 upstream d164c7d754f0 5cecaf1f .config console log report syz / log [disk image (non-bootable)] [vmlinux] [kernel image] ci-qemu-upstream general protection fault in __run_timers
* Struck through repros no longer work on HEAD.