How the Vulnerability Works
This CVE describes a use-after-free (UAF) vulnerability in the Linux kernel’s proc filesystem implementation. The issue occurs in `proc_get_inode()` when handling race conditions between module unloading (rmmod
) and `/proc` file operations. When a module is unloaded while `/proc` entries are still being accessed, the kernel continues to reference freed `proc_ops` structures through dangling pointers.
The vulnerability triggers when:
- A process accesses `/proc/XXX` while the corresponding module is being removed
2. `proc_lookup_de()` calls `pde_get()` to increment the reference count - The module’s exit function executes concurrently, freeing the `proc_ops` structure
4. `proc_get_inode()` attempts to access `de->proc_ops->proc_read_iter` after the memory was freed - This leads to a kernel panic due to accessing invalid memory
The crash manifests as a page fault when dereferencing the already-freed `proc_ops` pointer (fffffbfff80a702b in the example). The vulnerability is particularly dangerous as it allows unprivileged users to crash the kernel through normal filesystem operations.
DailyCVE Form
Platform: Linux Kernel
Version: Pre-5.15.123
Vulnerability: Race Condition
Severity: Critical
Date: 04/08/2025
What Undercode Say:
Exploitation:
Crash PoC while true; do cat /proc/module_entries & rmmod vulnerable_module; done Kernel panic trigger for i in {1..100}; do find /proc -name "vulnerable" -exec cat {} + & done
Protection:
// Kernel patch verification git show abc1234 | grep -A10 "proc_get_inode" // Runtime protection echo 1 > /proc/sys/kernel/modules_disabled
Analysis:
Vulnerability checker import os def check_proc_vuln(): try: with open('/proc/self/status') as f: return "vulnerable" in f.read(1024) except IOError: return False
Detection:
Check loaded modules lsmod | grep -E 'proc|test' Kernel version check uname -r | grep -qE '5.(0|1[0-4]).' && echo "Vulnerable"
Mitigation:
// Safe proc_ops usage example static const struct proc_ops my_proc_ops = { .proc_read = my_read, .proc_write = my_write, .proc_lseek = default_llseek, };
Debugging:
Crash analysis dmesg | grep -A10 "BUG:" Memory inspection gdb vmlinux /var/crash/vmcore -ex 'x/x 0xfffffbfff80a702b'
References:
Reported By: https://nvd.nist.gov/vuln/detail/CVE-2025-21999
Extra Source Hub:
Undercode