data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2024-26768 in the interactive tracker

CVE-2024-26768

LoongArch: Change acpi_core_pic[NR_CPUS] to acpi_core_pic[MAX_CORE_PIC]

7.2 EPSS 0.6% AV:N

Published 2024-04-03 (3 years ago) by the Linux kernel CNA. Subsystem arch/loongarch. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2024-26768 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
Debian 13trixiefixed6.7.7-1Update the kernel and reboot. Fixed in 6.7.7-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed6.7.7-1Update the kernel and reboot. Fixed in 6.7.7-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed6.7.7-1Update the kernel and reboot. Fixed in 6.7.7-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

With default config, the value of NR_CPUS is 64. When HW platform has more then 64 cpus, system will crash on these platforms. MAX_CORE_PIC is the maximum cpu number in MADT table (max physical number) which can exceed the supported maximum cpu number (NR_CPUS, max logical number), but kernel should not crash. Kernel should boot cpus with NR_CPUS, let the remainder cpus stay in BIOS. The potential crash reason is that the array acpi_core_pic[NR_CPUS] can be overflowed when parsing MADT table, and it is obvious that CORE_PIC should be corresponding to physical core rather than logical core, so it is better to define the array as acpi_core_pic[MAX_CORE_PIC]. With the patch, system can boot up 64 vcpus with qemu parameter -smp 128, otherwise system will crash with the following message. [ 0.000000] CPU 0 Unable to handle kernel paging request at virtual address 0000420000004259, era == 90000000037a5f0c, ra == 90000000037a46ec [ 0.000000] Oops[#1]: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.8.0-rc2+ #192 [ 0.000000] Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 2/2/2022 [ 0.000000] pc 90000000037a5f0c ra 90000000037a46ec tp 9000000003c90000 sp 9000000003c93d60 [ 0.000000] a0 0000000000000019 a1 9000000003d93bc0 a2 0000000000000000 a3 9000000003c93bd8 [ 0.000000] a4 9000000003c93a74 a5 9000000083c93a67 a6 9000000003c938f0 a7 0000000000000005 [ 0.000000] t0 0000420000004201 t1 0000000000000000 t2 0000000000000001 t3 0000000000000001 [ 0.000000] t4 0000000000000003 t5 0000000000000000 t6 0000000000000030 t7 0000000000000063 [ 0.000000] t8 0000000000000014 u0 ffffffffffffffff s9 0000000000000000 s0 9000000003caee98 [ 0.000000] s1 90000000041b0480 s2 9000000003c93da0 s3 9000000003c93d98 s4 9000000003c93d90 [ 0.000000] s5 9000000003caa000 s6 000000000a7fd000 s7 000000000f556b60 s8 000000000e0a4330 [ 0.000000] ra: 90000000037a46ec platform_init+0x214/0x250 [ 0.000000] ERA: 90000000037a5f0c efi_runtime_init+0x30/0x94 [ 0.000000] CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE) [ 0.000000] PRMD: 00000000 (PPLV0 -PIE -PWE) [ 0.000000] EUEN: 00000000 (-FPE -SXE -ASXE -BTE) [ 0.000000] ECFG: 00070800 (LIE=11 VS=7) [ 0.000000] ESTAT: 00010000 [PIL] (IS= ECode=1 EsubCode=0) [ 0.000000] BADV: 0000420000004259 [ 0.000000] PRID: 0014c010 (Loongson-64bit, Loongson-3A5000) [ 0.000000] Modules linked in: [ 0.000000] Process swapper (pid: 0, threadinfo=(____ptrval____), task=(____ptrval____)) [ 0.000000] Stack : 9000000003c93a14 9000000003800898 90000000041844f8 90000000037a46ec [ 0.000000] 000000000a7fd000 0000000008290000 0000000000000000 0000000000000000 [ 0.000000] 0000000000000000 0000000000000000 00000000019d8000 000000000f556b60 [ 0.000000] 000000000a7fd000 000000000f556b08 9000000003ca7700 9000000003800000 [ 0.000000] 9000000003c93e50 9000000003800898 9000000003800108 90000000037a484c [ 0.000000] 000000000e0a4330 000000000f556b60 000000000a7fd000 000000000f556b08 [ 0.000000] 9000000003ca7700 9000000004184000 0000000000200000 000000000e02b018 [ 0.000000] 000000000a7fd000 90000000037a0790 9000000003800108 0000000000000000 [ 0.000000] 0000000000000000 000000000e0a4330 000000000f556b60 000000000a7fd000 [ 0.000000] 000000000f556b08 000000000eaae298 000000000eaa5040 0000000000200000 [ 0.000000] ... [ 0.000000] Call Trace: [ 0.000000] [<90000000037a5f0c>] efi_runtime_init+0x30/0x94 [ 0.000000] [<90000000037a46ec>] platform_init+0x214/0x250 [ 0.000000] [<90000000037a484c>] setup_arch+0x124/0x45c [ 0.000000] [<90000000037a0790>] start_kernel+0x90/0x670 [ 0.000000] [<900000000378b0d8>] kernel_entry+0xd8/0xdc

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

arch/loongarch/include/asm/acpi.h
arch/loongarch/kernel/acpi.c

What this is
LOONGARCHMAINTAINERS section matched on arch/loongarch/ · loongarch@lists.linux.dev · Maintained

Check it on the machine

grep -w CONFIG_ACPI /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

Show whether Debian builds this, per release

Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.

  • bookwormYnot built on armhf/armmp, armhf/armmp-lpae, armhf/rt/armmp, ppc64el/powerpc64le
  • trixieYnot built on armel/rpi, armhf/armmp, armhf/armmp-lpae, armhf/rt/armmp, ppc64el/powerpc64le, ppc64el/powerpc64le-64k, s390x/s390x
  • forky, sidYnot built on armhf/armmp, armhf/armmp-lpae, ppc64el/powerpc64le, ppc64el/powerpc64le-64k, s390x/s390x
Y
built in where it is built at all; some flavours do not build it
Build switch
CONFIG_ACPI

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2024-04-03 (3 years ago)source
CVSS
7.2 high
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
network (AV:N)source
EPSS
0.60%, higher than 47.8% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
arch/loongarch

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
5.196.6.1988e189bd16e5
5.196.7.70f6810e39898
5.196.84551b30525cf

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:NAttack vector, network
The overflow is reached only from `__init` MADT parsing during `setup_arch()`, with input supplied by platform firmware, the hypervisor's VM configuration, or a root-supplied initrd ACPI table override — all of which require local control of the machine's boot environment rather than physical presence.
AC:LAttack complexity, low
The out-of-bounds store is deterministic — any MADT `Core PIC` entry with `core_id >= NR_CPUS` reliably writes past `acpi_core_pic[]`, with no race to win and no memory layout the attacker cannot already influence.
PR:HPrivileges required, high
This is pre-userspace code, so no unprivileged or namespace-based path exists; supplying the MADT requires firmware control, hypervisor/VM-configuration control, or real root to plant an initrd table override (itself blocked under kernel lockdown).
UI:NUser interaction, none
Once the crafted or oversized MADT is in place the corruption occurs automatically on the next boot, with no action required from any other user.
S:UScope, unchanged
The out-of-bounds write corrupts kernel `.bss` within the same kernel security authority; no VM, IOMMU, or sandbox boundary is crossed by the overflow itself.
C:HConfidentiality impact, high
Writing a 20-byte structure at an unvalidated `u32`-scaled offset corrupts arbitrary adjacent kernel globals, and such memory corruption of early-boot state (EFI/`loongson_sysconf` structures, pointers used later by the kernel) is leverageable to disclose kernel memory.
I:HIntegrity impact, high
This is a direct out-of-bounds write of attacker/firmware-controlled contents at an attacker-influenced index, giving a powerful write primitive over kernel data — per guidance, OOB writes score High.
A:HAvailability impact, high
The documented result is a kernel Oops in `efi_runtime_init` during `start_kernel()`, rendering the system unbootable — a complete availability loss.