CVE-2026-63811 in Linux
Summary
by MITRE • 07/19/2026
In the Linux kernel, the following vulnerability has been resolved:
f2fs: read COW data with the original inode during atomic write
When updating an atomic-write file, f2fs_write_begin() may read the previously written data back from the COW inode: prepare_atomic_write_begin() locates the block in the COW inode and sets use_cow, and the read bio is then built with the COW inode:
f2fs_submit_page_read(use_cow ? F2FS_I(inode)->cow_inode : inode, ...);
and f2fs_grab_read_bio() decides whether to schedule fs-layer decryption (STEP_DECRYPT) for the bio based on that inode via fscrypt_inode_uses_fs_layer_crypto().
However, the folio being filled belongs to the original inode (folio->mapping->host == inode), and the data stored in the COW block was encrypted (or left as plaintext) using the original inode's context, not the COW inode's -- see f2fs_encrypt_one_page(), which keys off fio->page->mapping->host. fscrypt_decrypt_pagecache_blocks() likewise operates on folio->mapping->host.
The COW inode is created as a tmpfile in the parent directory and inherits its encryption policy from there. With test_dummy_encryption the newly created COW inode gets the dummy policy and becomes encrypted, while a pre-existing regular file -- created before the policy applied, e.g. already present in the on-disk image -- stays unencrypted. The read path then sets STEP_DECRYPT based on the encrypted COW inode and calls fscrypt_decrypt_pagecache_blocks() on a folio whose host (the unencrypted original inode) has a NULL ->i_crypt_info, dereferencing it:
Oops: general protection fault, probably for non-canonical address ... KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
RIP: 0010:fscrypt_decrypt_pagecache_blocks+0xa0/0x310 Workqueue: f2fs_post_read_wq f2fs_post_read_work Call Trace: fscrypt_decrypt_bio+0x1eb/0x340 f2fs_post_read_work+0xba/0x140 process_one_work+0x91c/0x1a40 worker_thread+0x677/0xe90 kthread+0x2bc/0x3a0
The COW inode is only needed to locate the on-disk block, and that block address is already resolved into @blkaddr by prepare_atomic_write_begin() via __find_data_block(cow_inode, ...); f2fs_submit_page_read() then reads from that physical @blkaddr directly, so the inode argument only selects the post-read crypto context, not which block is fetched. Reading with @inode therefore returns the same (latest, not-yet-committed) COW data, while making both the fs-layer decryption decision and the inline crypto path use the correct (original inode's) key.
With the COW inode no longer used at the read site, the use_cow flag has no remaining consumer; drop it from f2fs_write_begin() and prepare_atomic_write_begin().
VulDB is the best source for vulnerability data and more expert information about this specific topic.
Analysis
by VulDB Data Team • 07/19/2026
The vulnerability described affects the f2fs filesystem implementation within the linux kernel, specifically during atomic write operations. This flaw stems from a critical misalignment between cryptographic context handling and data retrieval mechanisms when processing copy-on-write (COW) operations. The issue manifests when updating files using atomic write semantics, where the filesystem must read previously written data back from a COW inode during the write process.
During atomic writes, the f2fs_write_begin() function attempts to read previously written data by locating blocks within the COW inode and setting a use_cow flag. This causes the read bio to be constructed using the COW inode rather than the original inode. The core technical flaw occurs in how encryption context is determined during the read path, where f2fs_grab_read_bio() decides whether to schedule filesystem-layer decryption based on the COW inode's encryption policy via fscrypt_inode_uses_fs_layer_crypto(). However, the folio being filled belongs to the original inode, creating a fundamental mismatch between the encryption context used for reading and the context expected for decryption.
The cryptographic inconsistency arises because data stored in COW blocks was encrypted using the original inode's context, not the COW inode's context. The f2fs_encrypt_one_page() function relies on fio->page->mapping->host to determine encryption keys, which points to the original inode. Similarly, fscrypt_decrypt_pagecache_blocks() operates on folio->mapping->host, which again references the original inode. When a COW inode is created as a tmpfile in the parent directory, it inherits its encryption policy from that directory, potentially creating scenarios where newly created COW inodes get dummy encryption policies while pre-existing files retain their unencrypted status.
This mismatch leads to a null pointer dereference when the system attempts to access the encryption information of the original inode. The kernel's memory safety mechanism detects this fault with a general protection fault, specifically pointing to fscrypt_decrypt_pagecache_blocks() where it tries to dereference a NULL ->i_crypt_info field. This represents a classic security vulnerability categorized under CWE-476, null pointer dereference, which can lead to system instability and potential privilege escalation.
The operational impact of this vulnerability extends beyond simple system crashes. It represents a fundamental cryptographic breakdown in the filesystem's atomic write mechanism, where data integrity cannot be guaranteed during concurrent file modifications. Attackers could potentially exploit this weakness to bypass encryption controls or cause denial of service through kernel panic conditions. The vulnerability aligns with ATT&CK technique T1059.003 (Command and Scripting Interpreter: Windows Command Shell) as it exploits kernel-level command processing, though the specific implementation occurs in kernel space rather than user-space.
The fix addresses this by ensuring that read operations use the original inode for both data retrieval and cryptographic context determination, regardless of whether a COW operation is in progress. This approach eliminates the dependency on the COW inode for determining decryption parameters while maintaining the correct physical block address resolution through the existing blkaddr mechanism. The solution removes the use_cow flag from both f2fs_write_begin() and prepare_atomic_write_begin() functions since the COW inode is no longer needed at the read site, as the block address has already been resolved by __find_data_block(). This change ensures that cryptographic operations align with the actual data source while maintaining the correct physical data retrieval path. The resolution follows established kernel security principles for avoiding cross-context cryptographic mismatches and maintaining proper memory access validation.