CVE-2024-57952

CVE-2024-57952

High · published February 12, 2025

CVSS v3.1
7.1
EPSS
0%
Percentile
11.9
In the wild
Unconfirmed
What it is

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

Revert "libfs: fix infinite directory reads for offset dir"

The current directory offset allocator (based on mtree_alloc_cyclic)

stores the next offset value to return in octx->next_offset. This

mechanism typically returns values that increase monotonically over

time. Eventually, though, the newly allocated offset value wraps

back to a low number (say, 2) which is smaller than other already-

allocated offset values.

Yu Kuai <[email protected]> reports that, after commit 64a7ce76fb90

("libfs: fix infinite directory reads for offset dir"), if a

directory's offset allocator wraps, existing entries are no longer

visible via readdir/getdents because offset_readdir() stops listing

entries once an entry's offset is larger than octx->next_offset.

These entries vanish persistently -- they can be looked up, but will

never again appear in readdir(3) output.

The reason for this is that the commit treats directory offsets as

monotonically increasing integer values rather than opaque cookies,

and introduces this comparison:

if (dentry2offset(dentry) >= last_index) {

On 64-bit platforms, the directory offset value upper bound is

2^63 - 1. Directory offsets will monotonically increase for millions

of years without wrapping.

On 32-bit platforms, however, LONG_MAX is 2^31 - 1. The allocator

can wrap after only a few weeks (at worst).

Revert commit 64a7ce76fb90 ("libfs: fix infinite directory reads for

offset dir") to prepare for a fix that can work properly on 32-bit

systems and might apply to recent LTS kernels where shmem employs

the simple_offset mechanism.

The record
Technical detail
CVSS v3.1
7.1 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00220 · 11.9th percentile
Published
2025-02-12T19:15Z
Affected products (9)
ProductVersionsFixed in
linux/linux_kernel≥ 6.11, < 6.12.126.12.12
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (3)
EPSS history
Timeline
  • 12 FEB 13:52Z
    Revert "libfs: fix infinite directory reads for offset dir"
    cvelistv5