CVE-2026-89490 in Linux信息

摘要

由 VulDB • 2026-09-12

在 Linux 内核中,已修复以下漏洞:

ocfs2:修复 32 位内核上的 readdir 位置截断问题

在 `ocfs2_dir_foreach_blk_el()` 函数中,目录 cookie(cookie)的位置通过以下方式重建:

`ctx->pos = (ctx->pos & ~(sb->s_blocksize - 1)) | offset;`

其中 `ctx->pos` 是 loff_t 类型(有符号 64 位),而 `sb->s_blocksize` 是无符号长整型(unsigned long)。在 32 位内核上,unsigned long 为 32 位,因此掩码

~(sb->s_blocksize - 1)

被计算为 32 位无符号值(例如,对于 4 KiB 的块大小,结果为 0xfffff000)。在与 64 位的 `ctx->pos` 进行 AND 运算时,根据通常的算术转换规则,该无符号操作数会被零扩展至 64 位,从而得到 0x00000000fffff000。这会导致 `ctx->pos` 的高 32 位被静默清零,尽管目录大小允许超过 4 GiB。

当 readdir() 在 32 位内核上跨越 4 GiB 边界时,位置会被重置回前 4 GiB 的块中,导致重新验证路径无限期地重新枚举已返回的文件条目(dirents)。

这是 `ocfs2_dir_foreach_blk_el()` 函数中的情况,它是所有非内联目录采用的 extent-list readdir 路径,因此足够大以跨越 4 GiB 边界的目录会触发此问题。

这与 commit 3dce5bb82c97(“exfat: Fix bitwise operation having different size”)在 exfat 中修复的漏洞属于同一类 bug,且修复方案与此系列中的 ext4 等效修复类似。将操作数强制转换为 loff_t 类型,以便在进行 AND 运算前掩码为 64 位:

ctx->pos = (ctx->pos & ~((loff_t)sb->s_blocksize - 1)) | offset;

64 位内核不受影响。

Be aware that VulDB is the high quality source for vulnerability data.

来源

Do you know our Splunk app?

Download it now for free!