CVE-2025-38407 Information
Description
In the Linux kernel the following vulnerability has been resolved:
riscv: cpu_ops_sbi: Use static array for boot_data
Since commit 6b9f29b81b15 ( iscv: Enable pcpu page first chunk allocator) if NUMA is enabled the page percpu allocator may be used on very sparse configurations or when requested on boot with percpu_alloc=page.
In that case percpu data gets put in the vmalloc area. However sbi_hsm_hart_start() needs the physical address of a sbi_hart_boot_data and simply assumes that __pa() would work. This causes the just started hart to immediately access an invalid address and hang.
Fortunately struct sbi_hart_boot_data is not too large so we can simply allocate an array for boot_data statically putting it in the kernel image.
This fixes NUMA=y SMP boot on Sophgo SG2042.
To reproduce on QEMU: Set CONFIG_NUMA=y and CONFIG_DEBUG_VIRTUAL=y then run with:
qemu-system-riscv64 -M virt -smp 2 -nographic
-kernel arch/riscv/boot/Image
-append \percpu_alloc=page\n
Kernel output:
[ 0.000000] Booting Linux on hartid 0
[ 0.000000] Linux version 6.16.0-rc1 (dram@sakuya) (riscv64-unknown-linux-gnu-gcc (GCC) 14.2.1 20250322 GNU ld (GNU Binutils) 2.44) 11 SMP Tue Jun 24 14:56:22 CST 2025
…
[ 0.000000] percpu: 28 4K pages/cpu s85784 r8192 d20712
…
[ 0.083192] smp: Bringing up secondary CPUs …
[ 0.086722] ————[ cut here ]————
[ 0.086849] virt_to_phys used for non-linear address: (ptrval) (0xff2000000001d080)
[ 0.088001] WARNING: CPU: 0 PID: 1 at arch/riscv/mm/physaddr.c:14 __virt_to_phys+0xae/0xe8
[ 0.088376] Modules linked in:
[ 0.088656] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.16.0-rc1 11 NONE
[ 0.088833] Hardware name: riscv-virtioqemu (DT)
[ 0.088948] epc : __virt_to_phys+0xae/0xe8
[ 0.089001] ra : __virt_to_phys+0xae/0xe8
[ 0.089037] epc : ffffffff80021eaa ra : ffffffff80021eaa sp : ff2000000004bbc0
[ 0.089057] gp : ffffffff817f49c0 tp : ff60000001d60000 t0 : 5f6f745f74726976
[ 0.089076] t1 : 0000000000000076 t2 : 705f6f745f747269 s0 : ff2000000004bbe0
[ 0.089095] s1 : ff2000000001d080 a0 : 0000000000000000 a1 : 0000000000000000
[ 0.089113] a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000
[ 0.089131] a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000
[ 0.089155] s2 : ffffffff8130dc00 s3 : 0000000000000001 s4 : 0000000000000001
[ 0.089174] s5 : ffffffff8185eff8 s6 : ff2000007f1eb000 s7 : ffffffff8002a2ec
[ 0.089193] s8 : 0000000000000001 s9 : 0000000000000001 s10: 0000000000000000
[ 0.089211] s11: 0000000000000000 t3 : ffffffff8180a9f7 t4 : ffffffff8180a9f7
[ 0.089960] t5 : ffffffff8180a9f8 t6 : ff2000000004b9d8
[ 0.089984] status: 0000000200000120 badaddr: ffffffff80021eaa cause: 0000000000000003
[ 0.090101] [
Reference
https://git.kernel.org/stable/c/02c725cd55eb5052b88eeaa3f60a391ef4dcaec5 https://git.kernel.org/stable/c/2b29be967ae456fc09c320d91d52278cf721be1e https://git.kernel.org/stable/c/f5fe094f35a37adea40b2fd52c99bb1333be9b07
Related CNNVD
CNNVD-202507-3236 (Published: 2025-07-25)
Share on: