Skip to main content

Linux Kernel CVE-2026-64567

| EUVDEUVD-2026-53261 HIGH
2026-08-05 Linux GHSA-834p-x3hc-j46g
7.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
7.8 HIGH

Local vector and low privileges reflect crafted-filesystem-image scenario; C/I/A:H justified by kernel-context out-of-bounds enabling GP fault and potential full kernel compromise.

3.1 AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
4.0 AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
SUSE
5.5 MEDIUM
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Red Hat
5.5 MEDIUM
qualitative

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

5
Analysis Generated
Aug 08, 2026 - 15:26 vuln.today
CVSS changed
Aug 08, 2026 - 15:22 NVD
7.8 (HIGH)
Patch available
Aug 05, 2026 - 09:01 EUVD
CVE Published
Aug 05, 2026 - 08:08 cve.org
HIGH 7.8
CVE Published
Aug 05, 2026 - 08:08 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

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

btrfs: reject free space cache with more entries than pages

When loading a v1 free space cache, __load_free_space_cache() takes num_entries and num_bitmaps straight from the on-disk btrfs_free_space_header. That header is stored in the tree_root under a key with type 0, which the tree-checker has no case for, so neither count is validated before the load trusts it.

The load loops num_entries times and maps the next page whenever the current one runs out, going through io_ctl_check_crc() -> io_ctl_map_page(), which does io_ctl->pages[io_ctl->index++]. But pages[] is allocated in io_ctl_init() from the cache inode's i_size, not from num_entries:

num_pages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS);

So if num_entries claims more records than the pages can hold, io_ctl->index runs off the end of pages[]. The write side never hits this because io_ctl_add_entry() and io_ctl_add_bitmap() both stop once io_ctl->index >= io_ctl->num_pages; the read side just never had the same check.

To trigger it, take a clean cache (num_entries = <N> here), set num_entries in the header to 0x10000, and fix up the leaf checksum so it still passes the tree-checker. The cache inode has i_size = 65536, so num_pages is 16 and pages[] is a 16-pointer (kmalloc-128) array. The load now tries to read 65536 entries, io_ctl->index walks up to 16, and pages[16] is read past the array:

BUG: KASAN: slab-out-of-bounds in io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) Read of size 8 at addr ffff88800c833a80 by task kworker/u8:3/58 io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) __load_free_space_cache (fs/btrfs/free-space-cache.c:655 fs/btrfs/free-space-cache.c:820) load_free_space_cache (fs/btrfs/free-space-cache.c:1017) caching_thread (fs/btrfs/block-group.c:880) btrfs_work_helper (fs/btrfs/async-thread.c:312) process_one_work worker_thread kthread ret_from_fork

free-space-cache.c:420 is io_ctl_map_page(), inlined into io_ctl_check_crc() at line 565, which is why that is the frame KASAN names. The out-of-bounds slot is then treated as a struct page and handed to crc32c(), so the bad read turns into a GP fault.

Add the missing check to io_ctl_check_crc(), which is where both the entry loop and the bitmap loop end up. When num_entries is too large the load now fails like any corrupt cache: __load_free_space_cache() drops it and rebuilds the free space from the extent tree, so a valid cache is never rejected.

AnalysisAI

Slab-out-of-bounds read in the Linux kernel btrfs free space cache loader allows a local attacker to trigger kernel memory corruption by supplying a crafted btrfs filesystem with an inflated num_entries value in the on-disk btrfs_free_space_header. All Linux kernel versions from commit 5b0e95bf607d through the patched stable releases across the 6.6, 6.12, 6.18, 7.1, and 7.2 series are affected. An attacker who can mount or cause the kernel to process such a crafted volume causes the io_ctl->index pointer to walk past the pages[] array boundary, with the overrun slot treated as a struct page and passed to crc32c(), culminating in a general protection fault with kernel code execution or information disclosure potential. No public exploit has been identified and this vulnerability is not in CISA KEV; EPSS places exploitation probability at the 5th percentile.

Technical ContextAI

The affected code path is __load_free_space_cache() in fs/btrfs/free-space-cache.c, which loads the btrfs v1 free space cache during the caching_thread background worker execution. The btrfs_free_space_header structure is stored in the tree_root under key type 0 - a type for which the kernel tree-checker has no validation case - meaning num_entries and num_bitmaps fields reach the loader unsanitized. The io_ctl->pages[] array is allocated in io_ctl_init() via kcalloc(num_pages, ...) where num_pages derives from DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE), bounding the array to the cache inode's actual size (e.g., 16 entries for i_size=65536). The read loop iterates num_entries times and calls io_ctl_map_page() (inlined into io_ctl_check_crc() at line 565), which blindly increments io_ctl->index without an upper bound check. This asymmetry with the write path - where io_ctl_add_entry() and io_ctl_add_bitmap() both guard against io_ctl->index >= io_ctl->num_pages - is the root cause. The out-of-bounds slot is interpreted as a struct page pointer and handed to crc32c(), turning the overread into a general protection fault. CPE data identifies the affected product as cpe:2.3:a:linux:linux across all branches originating from commit 5b0e95bf607ddd59b39f52d3d55e6581c817b530. Although the CWE is listed as N/A in the input, the root cause maps to CWE-129 (Improper Validation of Array Index) compounded by CWE-125 (Out-of-bounds Read).

RemediationAI

Upgrade to a patched Linux kernel stable release appropriate for the deployed series: 6.6.148, 6.12.101, 6.18.42, 7.1.6, or 7.2-rc4 or later. Individual stable-tree fix commits are available at git.kernel.org/stable/c/33878ba25e2638bc0c61623d7a05c9ca2b74c039 (6.6.x), git.kernel.org/stable/c/a2d8d5647ed854e38f941741aea45b9eb15a6350 (6.12.x), git.kernel.org/stable/c/5e1b2ca6b34939e70fb0785e8222b53cf060016f (6.18.x), git.kernel.org/stable/c/f9fef131fa3f59b857217f522fa5ea430d1b707c (7.1.x), and git.kernel.org/stable/c/404a0b986e0b6e79738fdf1f0ebbbc43b9acd2a2 (7.2). Where patching is not immediately feasible, restrict raw block device write access to root-only accounts to prevent crafting of malicious btrfs images. On systems where btrfs is not required, disable kernel module loading via 'install btrfs /bin/false' in modprobe configuration - note this will prevent all btrfs volumes from mounting, including legitimate ones. Avoid automounting externally sourced btrfs filesystems (USB devices, untrusted disk images) until patched. NVD advisory: https://nvd.nist.gov/vuln/detail/CVE-2026-64567.

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
openSUSE Tumbleweed Fixed
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected

Share

CVE-2026-64567 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy