CVE-2023-52828
NoneCVSS
—
EPSS
0.2%
Published
May 21, 2024
CISA due date
—
Cloudanix analysis
A bug in the Linux kernel's handling of certain networking programs could cause the whole system to crash unexpectedly when those programs run.
- Exploitation
- Local Privilege
- Attacker needs
- Local User
- Complexity
- Theoretical
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The BPF verifier's dead-code elimination after noreturn calls (such as bpf_throw) can leave a final call instruction as the last emitted JIT instruction; when the return address therefore falls exactly at ksym.end, bpf_prog_ksym_find and is_bpf_text_address treat the address as outside the program, producing an unreliable stack unwind and kernel panic.
Why it matters to the business
Systems running unpatched kernels may experience unexpected kernel panics when certain BPF programs that use throwing subprograms are loaded and executed, leading to service outages on hosts that rely on advanced eBPF functionality.
How an attack unfolds
An attacker with the ability to load unprivileged or privileged BPF programs constructs a call chain that ends in a noreturn subprogram; the resulting JIT image places the return address beyond the recorded program length, triggering a panic on any subsequent stack unwind.
How to fix it
Update the Linux kernel to a revision that contains commit 6058e4829696412457729a00734969acc6fd1d18 or later; rebuild and reboot with the patched kernel image. Where live patching is available, apply the vendor's kpatch or ksplice package that backports the ksym.end check.
How to confirm the fix worked
Confirm the running kernel contains the fix by checking that bpf_prog_ksym_find treats an IP equal to ksym.end as belonging to the program; load a minimal throwing BPF program and verify that a deliberate throw no longer produces a panic and that /proc/kallsyms shows the expected program bounds.
Typical attack path
- Obtain capability to load a BPF program (CAP_BPF or unprivileged_bpf_disabled=0)
- Craft a program containing a conditional path that ends with a call to a subprogram that always executes bpf_throw
- Load and attach the program so the verifier marks instructions after the throw as dead
- Trigger execution that reaches the throwing path, causing the stack walker to consult an IP outside the recorded ksym range
- Kernel panics during the unreliable unwind
How to detect it
Search kernel logs for "unreliable stack unwind" or "is_bpf_text_address" failures immediately after BPF program load or attachment events; correlate with audit logs showing bpf() syscalls that install programs containing call instructions near the end of their JIT image.
What your security team should do
- Prioritize kernel updates on all systems that permit unprivileged BPF or run production BPF programs with noreturn semantics
- Audit BPF program loaders and CI pipelines for use of bpf_throw or equivalent noreturn helpers
- Enable kernel panic-on-oops logging and monitor for BPF-related stack-unwind failures until patches are deployed
The record
In the Linux kernel, the following vulnerability has been resolved: bpf: Detect IP == ksym.end as part of BPF program Now that bpf_throw kfunc is the first such call instruction that has noreturn semantics within the verifier, this also kicks in dead code elimination in unprecedented ways. For one, any instruction following a bpf_throw call will never be marked as seen. Moreover, if a callchain ends up throwing, any instructions after the call instruction to the eventually throwing subprog in callers will also never be marked as seen. The tempting way to fix this would be to emit extra 'int3' instructions which bump the jited_len of a program, and ensure that during runtime when a program throws, we can discover its boundaries even if the call instruction to bpf_throw (or to subprogs that always throw) is emitted as the final instruction in the program. An example of such a program would be this: do_something(): ... r0 = 0 exit foo(): r1 = 0 call bpf_throw r0 = 0 exit bar(cond): if r1 != 0 goto pc+2 call do_something exit call foo r0 = 0 // Never seen by verifier exit // main(ctx): r1 = ... call bar r0 = 0 exit Here, if we do end up throwing, the stacktrace would be the following: bpf_throw foo bar main In bar, the final instruction emitted will be the call to foo, as such, the return address will be the subsequent instruction (which the JIT emits as int3 on x86). This will end up lying outside the jited_len of the program, thus, when unwinding, we will fail to discover the return address as belonging to any program and end up in a panic due to the unreliable stack unwinding of BPF programs that we never expect. To remedy this case, make bpf_prog_ksym_find treat IP == ksym.end as part of the BPF program, so that is_bpf_text_address returns true when such a case occurs, and we are able to unwind reliably when the final instruction ends up being a call instruction.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Debian:11 | linux | 0 | 5.10.205-1 |
| Debian:12 | linux | 0 | 6.1.64-1 |
| Debian:13 | linux | 0 | 6.6.8-1 |
| Linux | Kernel | 0 | 5.10.202 |
| Linux | Kernel | 4.11.0 | 5.10.202 |
| Ubuntu:16.04:LTS | linux-hwe-edge | 0 | No fix |
| Ubuntu:18.04:LTS | linux-aws-5.0 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-aws-5.3 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-azure | 0 | No fix |
| Ubuntu:18.04:LTS | linux-azure-5.3 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-azure-edge | 0 | No fix |
| Ubuntu:18.04:LTS | linux-gcp | 0 | No fix |
| Ubuntu:18.04:LTS | linux-gcp-5.3 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-gke-4.15 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-gke-5.4 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-gkeop-5.4 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-hwe | 0 | No fix |
| Ubuntu:18.04:LTS | linux-hwe-edge | 0 | No fix |
| Ubuntu:18.04:LTS | linux-oem | 0 | No fix |
| Ubuntu:18.04:LTS | linux-oracle-5.0 | 0 | No fix |
| Ubuntu:18.04:LTS | linux-oracle-5.3 | 0 | No fix |
| Ubuntu:20.04:LTS | linux | 0 | No fix |
| Ubuntu:20.04:LTS | linux-aws | 0 | No fix |
| Ubuntu:20.04:LTS | linux-aws-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-aws-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-aws-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-aws-5.15 | 0 | 5.15.0-1056.61~20.04.1 |
| Ubuntu:20.04:LTS | linux-aws-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-5.15 | 0 | 5.15.0-1058.66~20.04.2 |
| Ubuntu:20.04:LTS | linux-azure-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-fde | 0 | No fix |
| Ubuntu:20.04:LTS | linux-azure-fde-5.15 | 0 | 5.15.0-1058.66~20.04.2.1 |
| Ubuntu:20.04:LTS | linux-bluefield | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gcp | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gcp-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gcp-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gcp-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gcp-5.15 | 0 | 5.15.0-1053.61~20.04.1 |
| Ubuntu:20.04:LTS | linux-gcp-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gke | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gke-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gkeop | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gkeop-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-gkeop-5.15 | 0 | 5.15.0-1038.44~20.04.1 |
| Ubuntu:20.04:LTS | linux-hwe-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-hwe-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-hwe-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-hwe-5.15 | 0 | 5.15.0-100.110~20.04.1 |
| Ubuntu:20.04:LTS | linux-hwe-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-ibm | 0 | No fix |
| Ubuntu:20.04:LTS | linux-ibm-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-ibm-5.15 | 0 | 5.15.0-1048.51~20.04.1 |
| Ubuntu:20.04:LTS | linux-intel-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-intel-iotg-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-intel-iotg-5.15 | 0 | 5.15.0-1050.56~20.04.1 |
| Ubuntu:20.04:LTS | linux-iot | 0 | No fix |
| Ubuntu:20.04:LTS | linux-kvm | 0 | No fix |
| Ubuntu:20.04:LTS | linux-lowlatency-hwe-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-lowlatency-hwe-5.15 | 0 | 5.15.0-100.110~20.04.1 |
| Ubuntu:20.04:LTS | linux-nvidia-tegra-5.15 | 0 | 5.15.0-1025.25~20.04.1 |
| Ubuntu:20.04:LTS | linux-oem-5.10 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oem-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oem-5.14 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oem-5.6 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oracle | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oracle-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oracle-5.13 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oracle-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-oracle-5.15 | 0 | 5.15.0-1053.59~20.04.1 |
| Ubuntu:20.04:LTS | linux-oracle-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-raspi | 0 | No fix |
| Ubuntu:20.04:LTS | linux-raspi2 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-riscv | 0 | No fix |
| Ubuntu:20.04:LTS | linux-riscv-5.11 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-riscv-5.15 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-riscv-5.15 | 0 | 5.15.0-1051.55~20.04.1 |
| Ubuntu:20.04:LTS | linux-riscv-5.8 | 0 | No fix |
| Ubuntu:20.04:LTS | linux-xilinx-zynqmp | 0 | No fix |
| Ubuntu:22.04:LTS | linux | 0 | No fix |
| Ubuntu:22.04:LTS | linux | 0 | 5.15.0-100.110 |
| Ubuntu:22.04:LTS | linux-allwinner-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-aws | 0 | No fix |
| Ubuntu:22.04:LTS | linux-aws | 0 | 5.15.0-1056.61 |
| Ubuntu:22.04:LTS | linux-aws-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-aws-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-aws-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-aws-6.8 | 0 | 6.8.0-1009.9~22.04.2 |
| Ubuntu:22.04:LTS | linux-azure | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure | 0 | 5.15.0-1058.66 |
| Ubuntu:22.04:LTS | linux-azure-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure-6.8 | 0 | 6.8.0-1008.8~22.04.1 |
| Ubuntu:22.04:LTS | linux-azure-fde | 0 | 5.15.0-1058.66.1 |
| Ubuntu:22.04:LTS | linux-azure-fde-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure-fde-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-azure-fde-6.8 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gcp | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gcp | 0 | 5.15.0-1053.61 |
| Ubuntu:22.04:LTS | linux-gcp-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gcp-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gcp-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gcp-6.8 | 0 | 6.8.0-1010.11~22.04.1 |
| Ubuntu:22.04:LTS | linux-gke | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gke | 0 | 5.15.0-1052.57 |
| Ubuntu:22.04:LTS | linux-gkeop | 0 | No fix |
| Ubuntu:22.04:LTS | linux-gkeop | 0 | 5.15.0-1038.44 |
| Ubuntu:22.04:LTS | linux-hwe-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-hwe-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-hwe-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-hwe-6.8 | 0 | 6.8.0-38.38~22.04.1 |
| Ubuntu:22.04:LTS | linux-ibm | 0 | No fix |
| Ubuntu:22.04:LTS | linux-ibm | 0 | 5.15.0-1048.51 |
| Ubuntu:22.04:LTS | linux-intel-iot-realtime | 0 | No fix |
| Ubuntu:22.04:LTS | linux-intel-iotg | 0 | No fix |
| Ubuntu:22.04:LTS | linux-intel-iotg | 0 | 5.15.0-1050.56 |
| Ubuntu:22.04:LTS | linux-kvm | 0 | No fix |
| Ubuntu:22.04:LTS | linux-kvm | 0 | 5.15.0-1052.57 |
| Ubuntu:22.04:LTS | linux-lowlatency | 0 | No fix |
| Ubuntu:22.04:LTS | linux-lowlatency | 0 | 5.15.0-100.110 |
| Ubuntu:22.04:LTS | linux-lowlatency-hwe-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-lowlatency-hwe-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-lowlatency-hwe-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-lowlatency-hwe-6.8 | 0 | 6.8.0-38.38.1~22.04.2 |
| Ubuntu:22.04:LTS | linux-nvidia | 0 | No fix |
| Ubuntu:22.04:LTS | linux-nvidia | 0 | 5.15.0-1046.46 |
| Ubuntu:22.04:LTS | linux-nvidia-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-nvidia-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-nvidia-6.5 | 0 | 6.5.0-1014.14 |
| Ubuntu:22.04:LTS | linux-nvidia-6.8 | 0 | 6.8.0-1008.8~22.04.1 |
| Ubuntu:22.04:LTS | linux-nvidia-tegra | 0 | 5.15.0-1025.25 |
| Ubuntu:22.04:LTS | linux-nvidia-tegra-igx | 0 | 5.15.0-1012.12 |
| Ubuntu:22.04:LTS | linux-oem-5.17 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oem-6.0 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oem-6.1 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oem-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oracle | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oracle | 0 | 5.15.0-1053.59 |
| Ubuntu:22.04:LTS | linux-oracle-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-oracle-6.8 | 0 | 6.8.0-1006.6~22.04.3 |
| Ubuntu:22.04:LTS | linux-raspi | 0 | No fix |
| Ubuntu:22.04:LTS | linux-raspi | 0 | 5.15.0-1048.51 |
| Ubuntu:22.04:LTS | linux-realtime | 0 | No fix |
| Ubuntu:22.04:LTS | linux-riscv | 0 | No fix |
| Ubuntu:22.04:LTS | linux-riscv-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-riscv-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-riscv-6.8 | 0 | 6.8.0-38.38.1~22.04.1 |
| Ubuntu:22.04:LTS | linux-starfive-5.19 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-starfive-6.2 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-starfive-6.5 | 0 | No fix |
| Ubuntu:22.04:LTS | linux-xilinx-zynqmp | 0 | No fix |
| Ubuntu:22.04:LTS | linux-xilinx-zynqmp | 0 | 5.15.0-1030.34 |
| Ubuntu:22.04:LTS:for:NVIDIA:BlueField | linux-bluefield | 0 | No fix |
| Ubuntu:24.04:LTS | linux | 0 | 6.6.0-14.14 |
| Ubuntu:24.04:LTS | linux-aws | 0 | 6.6.0-1001.1 |
| Ubuntu:24.04:LTS | linux-azure | 0 | 6.6.0-1001.1 |
| Ubuntu:24.04:LTS | linux-azure-fde | 0 | No fix |
| Ubuntu:24.04:LTS | linux-gcp | 0 | 6.6.0-1001.1 |
| Ubuntu:24.04:LTS | linux-gke | 0 | 6.8.0-1003.5 |
| Ubuntu:24.04:LTS | linux-gkeop | 0 | 6.8.0-1001.3 |
| Ubuntu:24.04:LTS | linux-ibm | 0 | 6.8.0-1001.1 |
| Ubuntu:24.04:LTS | linux-lowlatency | 0 | 6.6.0-14.14.1 |
| Ubuntu:24.04:LTS | linux-nvidia | 0 | 6.8.0-1007.7 |
| Ubuntu:24.04:LTS | linux-nvidia-lowlatency | 0 | 6.8.0-1009.9.1 |
| Ubuntu:24.04:LTS | linux-oem-6.11 | 0 | 6.11.0-1007.7 |
| Ubuntu:24.04:LTS | linux-oem-6.8 | 0 | 6.8.0-1003.3 |
| Ubuntu:24.04:LTS | linux-oracle | 0 | 6.6.0-1001.1 |
| Ubuntu:24.04:LTS | linux-raspi | 0 | 6.7.0-1001.1 |
| Ubuntu:24.04:LTS | linux-raspi-realtime | 0 | No fix |
| Ubuntu:24.04:LTS | linux-raspi-realtime | 0 | 6.7.0-2001.1 |
| Ubuntu:24.04:LTS | linux-realtime | 0 | 6.8.0-1008.19 |
| Ubuntu:24.04:LTS | linux-riscv | 0 | 6.8.0-20.20.1 |
| Ubuntu:24.10 | linux | 0 | 6.8.0-31.31 |
| Ubuntu:24.10 | linux-aws | 0 | 6.8.0-1008.8 |
| Ubuntu:24.10 | linux-azure | 0 | 6.8.0-1007.7 |
| Ubuntu:24.10 | linux-gcp | 0 | 6.8.0-1007.7 |
| Ubuntu:24.10 | linux-lowlatency | 0 | 6.8.0-31.31.1 |
| Ubuntu:24.10 | linux-oracle | 0 | 6.8.0-1005.5 |
| Ubuntu:24.10 | linux-raspi | 0 | 6.8.0-1004.4 |
| Ubuntu:24.10 | linux-realtime | 0 | 6.11.0-1001.1 |
| Ubuntu:24.10 | linux-riscv | 0 | 6.8.0-31.31.1 |
| Ubuntu:Nvidia-BlueField:22.04:LTS | linux-bluefield | 0 | 5.15.0-1037.39 |
| Ubuntu:Pro:14.04:LTS | linux | 0 | No fix |
| Ubuntu:Pro:14.04:LTS | linux-aws | 0 | No fix |
| Ubuntu:Pro:14.04:LTS | linux-azure | 0 | No fix |
| Ubuntu:Pro:14.04:LTS | linux-lts-xenial | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-aws | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-aws-hwe | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-azure | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-gcp | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-hwe | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-hwe-edge | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-kvm | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | linux-oracle | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | linux | 0 | No fix |
Related vulnerabilities
- CVE-2025-38562 In the Linux kernel, the following vulnerability has been resolved: ksmbd: fix null… Also affects linux
- CVE-2025-38352 In the Linux kernel, the following vulnerability has been resolved: posix-cpu-timers: fix… Also affects linux
- CVE-2025-22037 In the Linux kernel, the following vulnerability has been resolved: ksmbd: fix null… Also affects linux
- CVE-2025-21760 In the Linux kernel, the following vulnerability has been resolved: ndisc: extend RCU… Also affects linux
- CVE-2025-21758 In the Linux kernel, the following vulnerability has been resolved: ipv6: mcast: add RCU… Also affects linux
- CVE-2025-21664 In the Linux kernel, the following vulnerability has been resolved: dm thin: make… Also affects linux
- CVE-2024-57946 In the Linux kernel, the following vulnerability has been resolved: virtio-blk: don't… Also affects linux
- CVE-2024-57945 In the Linux kernel, the following vulnerability has been resolved: riscv: mm: Fix the… Also affects linux