FKIE_CVE-2026-89991
Vulnerability from fkie_nvd - Published: 2026-09-16 11:17 - Updated: 2026-09-16 11:17
Severity
Summary
In the Linux kernel, the following vulnerability has been resolved:
bpf: Fix infinite loop in pcpu_freelist push with one possible CPU
__pcpu_freelist_push() can loop forever when only one CPU is possible
and an NMI re-enters pcpu_freelist_push() while the interrupted context
holds that CPU's freelist lock.
After the current-CPU fast path fails, the fallback loop walks
cpu_possible_mask while skipping the current CPU. With CONFIG_SMP=n, or
when an SMP kernel is limited to one possible CPU with nr_cpus=1 or
possible_cpus=1, there are no other possible CPUs to examine. The loop
therefore makes no lock acquisition attempt and can never make progress.
The following stack was observed on a UP system:
NMI context:
pcpu_freelist_push
free_htab_elem
htab_map_delete_elem
[perf-event BPF program]
__perf_event_overflow
perf_event_nmi_handler
exc_nmi
Interrupted context:
__pcpu_freelist_push
pcpu_freelist_push
free_htab_elem
htab_map_delete_elem
[raw_tp/sys_enter BPF program]
__bpf_trace_sys_enter
do_syscall_64
raw_res_spin_lock() detects the same-CPU recursive acquisition and
returns -EDEADLK, but the subsequent fallback loop has no candidate head
on a system with one possible CPU.
Restore the extra fallback head that existed before the rqspinlock
conversion. Keep the current-CPU fast path, then try the other possible
CPUs and finally the extra head. The additional head lets a push, which
cannot fail without losing a preallocated element, make progress when the
only per-CPU head is held by the interrupted context.
Also check the extra head from the pop path so that nodes placed there
can be reused.
References
Impacted products
| Vendor | Product | Version |
|---|
{
"affected": [
{
"affectedData": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"kernel/bpf/percpu_freelist.c",
"kernel/bpf/percpu_freelist.h"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "a24a146ae2cb5d9faeea96d10010fcb6579abe1f",
"status": "affected",
"version": "f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb",
"versionType": "git"
},
{
"lessThan": "a5b5e62baceff9e252c6535cf42a027d04f226cf",
"status": "affected",
"version": "f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb",
"versionType": "git"
},
{
"lessThan": "efebf6496685c93150df5bb0794363ae70c5f58a",
"status": "affected",
"version": "f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"kernel/bpf/percpu_freelist.c",
"kernel/bpf/percpu_freelist.h"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "6.15"
},
{
"lessThan": "6.15",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"version": "6.18.51",
"versionType": "semver"
},
{
"lessThanOrEqual": "7.2.*",
"status": "unaffected",
"version": "7.2.5",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.3-rc2",
"versionType": "original_commit_for_fix"
}
]
}
],
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Fix infinite loop in pcpu_freelist push with one possible CPU\n\n__pcpu_freelist_push() can loop forever when only one CPU is possible\nand an NMI re-enters pcpu_freelist_push() while the interrupted context\nholds that CPU\u0027s freelist lock.\n\nAfter the current-CPU fast path fails, the fallback loop walks\ncpu_possible_mask while skipping the current CPU. With CONFIG_SMP=n, or\nwhen an SMP kernel is limited to one possible CPU with nr_cpus=1 or\npossible_cpus=1, there are no other possible CPUs to examine. The loop\ntherefore makes no lock acquisition attempt and can never make progress.\n\nThe following stack was observed on a UP system:\n\n NMI context:\n pcpu_freelist_push\n free_htab_elem\n htab_map_delete_elem\n [perf-event BPF program]\n __perf_event_overflow\n perf_event_nmi_handler\n exc_nmi\n\n Interrupted context:\n __pcpu_freelist_push\n pcpu_freelist_push\n free_htab_elem\n htab_map_delete_elem\n [raw_tp/sys_enter BPF program]\n __bpf_trace_sys_enter\n do_syscall_64\n\nraw_res_spin_lock() detects the same-CPU recursive acquisition and\nreturns -EDEADLK, but the subsequent fallback loop has no candidate head\non a system with one possible CPU.\n\nRestore the extra fallback head that existed before the rqspinlock\nconversion. Keep the current-CPU fast path, then try the other possible\nCPUs and finally the extra head. The additional head lets a push, which\ncannot fail without losing a preallocated element, make progress when the\nonly per-CPU head is held by the interrupted context.\n\nAlso check the extra head from the pop path so that nodes placed there\ncan be reused."
}
],
"id": "CVE-2026-89991",
"lastModified": "2026-09-16T11:17:10.240",
"metrics": {},
"published": "2026-09-16T11:17:10.240",
"references": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"url": "https://git.kernel.org/stable/c/a24a146ae2cb5d9faeea96d10010fcb6579abe1f"
},
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"url": "https://git.kernel.org/stable/c/a5b5e62baceff9e252c6535cf42a027d04f226cf"
},
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"url": "https://git.kernel.org/stable/c/efebf6496685c93150df5bb0794363ae70c5f58a"
}
],
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"vulnStatus": "Received"
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Loading…
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.
Loading…