CVE-2026-89988: kprobes: Protect kprobe_blacklist with RCU

Published Sep 16, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

kprobes: Protect kprobeblacklist with RCU

withinkprobeblacklist() traverses kprobeblacklist without holding kprobemutex. When a module is unloaded, kproberemoveareablacklist() removes blacklist entries and immediately frees them with kfree(). A concurrent call to withinkprobeblacklist() can therefore dereference freed memory.

Furthermore, withinkprobeblacklist() can be called in atomic or non-preemptible contexts where the sleeping kprobemutex cannot be taken.

Protect kprobeblacklist with RCU. Use guard(rcu)() and listforeachentryrcu() for traversal, listaddtailrcu() for insertions, listdelrcu() for deletions, and kfreercu() to reclaim entries safely after a grace period.

Affected Software

1 affected component
Linux Linux kernel

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade Linux kernel kprobes (kprobe_blacklist) to a version that resolves this vulnerability.

    Patch kprobes: Protect kprobe_blacklist with RCU
  2. Configuration

    Apply the kernel fix that protects kprobe_blacklist with RCU: use guard(rcu)() in within_kprobe_blacklist(), traverse with list_for_each_entry_rcu(), insert with list_add_tail_rcu(), delete with list_del_rcu(), and reclaim memory with kfree_rcu() after module unload via kprobe_remove_area_blacklist() (avoid immediate kfree()).

    Linux kernel kprobes kprobe_blacklist synchronization = Protected with RCU; use guard(rcu)(), list_for_each_entry_rcu(), list_add_tail_rcu(), and list_del_rcu(); reclaim with kfree_rcu()

Event History

Sep 16, 2026
CVE Published
via MITRE·10:33 AM
Data Sourced
via MITRE·10:33 AM
Description

Frequently Asked Questions

1

What conditions are required for this issue to occur?

A module unload must remove kprobe blacklist entries while another execution concurrently calls within_kprobe_blacklist(). The concurrent traversal can then access an entry that was freed immediately after removal.

2

Why is locking with kprobe_mutex not a viable protection for this path?

within_kprobe_blacklist() may run in atomic or non-preemptible contexts. Because kprobe_mutex can sleep, it cannot safely be acquired in those contexts.

3

What does the resolved implementation change to prevent the race?

Blacklist traversal and updates are protected with RCU, including RCU list operations and deferred freeing with kfree_rcu(). This keeps removed entries valid until an RCU grace period has elapsed, preventing concurrent readers from dereferencing freed memory.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203