In the Linux kernel, the following vulnerability has been resolved:
ocfs2: validate fast symlink target during inode read
ocfs2_validate_inode_block() already rejects several inconsistent
self-contained dinodes before they are exposed to the rest of the
filesystem. Fast symlinks need the same treatment.
A zero-cluster symlink is treated as a fast symlink and later read through
page_get_link() and ocfs2_fast_symlink_read_folio(). That path uses
strnlen() on the inline payload and then copies len + 1 bytes into the
folio. If a corrupt dinode stores an i_size that does not fit the inline
area or omits the terminating NUL at i_size, that copy reads past the end
of the inode block buffer.
Reject zero-cluster symlink dinodes whose i_size exceeds the inline
fast-symlink capacity or whose inline payload is not NUL-terminated
exactly at i_size when the inode block is validated. This keeps malformed
fast symlinks from reaching the read path.
Validation reproduced this kernel report:
KASAN use-after-free in ocfs2_fast_symlink_read_folio+0x12c/0x1f0
RIP: 0033:0x7f5c6d859aa7
Read of size 3905
Call trace:
dump_stack_lvl+0x66/0xa0 (?:?)
print_report+0xce/0x630 (?:?)
ocfs2_fast_symlink_read_folio+0x12c/0x1f0 (fs/ocfs2/inode.c:?)
srso_alias_return_thunk+0x5/0xfbef5 (?:?)
__virt_addr_valid+0x19f/0x330 (?:?)
kasan_report+0xe0/0x110 (?:?)
kasan_check_range+0x105/0x1b0 (?:?)
__asan_memcpy+0x23/0x60 (?:?)
filemap_read_folio+0x27/0xe0 (?:?)
filemap_read_folio+0x35/0xe0 (?:?)
do_read_cache_folio+0x138/0x230 (?:?)
__page_get_link+0x26/0x110 (?:?)
page_get_link+0x2e/0x70 (?:?)
vfs_readlink+0x15e/0x250 (?:?)
touch_atime+0x4d/0x370 (?:?)
do_readlinkat+0x186/0x200 (?:?)
do_user_addr_fault+0x65a/0x890 (?:?)
__x64_sys_readlink+0x46/0x60 (?:?)
do_syscall_64+0x115/0x6a0 (arch/x86/entry/syscall_64.c:87)
entry_SYSCALL_64_after_hwframe+0x77/0x7f (?:?)
CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 9.8
AV:N - OCFS2 cluster nodes commonly NFS-export shared LUNs; nfsd READLINK reaches vfs_readlink→page_get_link→ocfs2_fast_symlink_read_folio on a forged zero-cluster symlink dinode on the volume, giving a remote network attack path without a local syscall.
AC:L - A forged dinode fully controls i_size and inline bytes; strnlen() bounded only by ocfs2_fast_symlink_chars() then memcpy_to_folio() copies len+1 past the inode buffer_head (KASAN read ~3905), deterministically and without races.
PR:N - Triggering needs only permission to read the symlink: a remote NFS client on an exported share, or any unprivileged local/cluster user; planting the malformed dinode uses attacker-controlled on-disk metadata on shared storage, not init-namespace root on the victim.
UI:N - Once the corrupt fast symlink exists on a mounted/exported volume, readlink(2), NFS READLINK, or path lookup via get_link automatically pulls the inline target through ocfs2_fast_symlink_read_folio with no further deliberate victim action.
S:U - Impact stays within the host kernel parsing the OCFS2 symlink (memory disclosure/crash/privilege escalation on the server); no VM escape, IOMMU bypass, or cross-authority scope change.
C:H - memcpy_to_folio() performs an out-of-bounds read up to ~3900 bytes past the inode block buffer (KASAN UAF/slab read of size 3905); OOB/UAF kernel reads enable arbitrary adjacent-heap disclosure.
I:H - The same unvalidated strnlen/memcpy path corrupts kernel memory semantics (KASAN UAF) and, per kernel CNA guidance, UAF/OOB reads adjacent slab objects can be leveraged into write/control-flow primitives via heap grooming.
A:H - KASAN reports use-after-free in ocfs2_fast_symlink_read_folio during the over-wide memcpy; such kernel memory faults typically oops/panic the host, fully denying availability.
| Attack Vector |
Network |
Scope |
Unchanged |
| Attack Complexity |
Low |
Confidentiality Impact |
High |
| Privileges Required |
None |
Integrity Impact |
High |
| User Interaction |
None |
Availability Impact |
High |
AV:N - OCFS2 cluster nodes commonly NFS-export shared LUNs; nfsd READLINK reaches vfs_readlink→page_get_link→ocfs2_fast_symlink_read_folio on a forged zero-cluster symlink dinode on the volume, giving a remote network attack path without a local syscall.
AC:L - A forged dinode fully controls i_size and inline bytes; strnlen() bounded only by ocfs2_fast_symlink_chars() then memcpy_to_folio() copies len+1 past the inode buffer_head (KASAN read ~3905), deterministically and without races.
PR:N - Triggering needs only permission to read the symlink: a remote NFS client on an exported share, or any unprivileged local/cluster user; planting the malformed dinode uses attacker-controlled on-disk metadata on shared storage, not init-namespace root on the victim.
UI:N - Once the corrupt fast symlink exists on a mounted/exported volume, readlink(2), NFS READLINK, or path lookup via get_link automatically pulls the inline target through ocfs2_fast_symlink_read_folio with no further deliberate victim action.
S:U - Impact stays within the host kernel parsing the OCFS2 symlink (memory disclosure/crash/privilege escalation on the server); no VM escape, IOMMU bypass, or cross-authority scope change.
C:H - memcpy_to_folio() performs an out-of-bounds read up to ~3900 bytes past the inode block buffer (KASAN UAF/slab read of size 3905); OOB/UAF kernel reads enable arbitrary adjacent-heap disclosure.
I:H - The same unvalidated strnlen/memcpy path corrupts kernel memory semantics (KASAN UAF) and, per kernel CNA guidance, UAF/OOB reads adjacent slab objects can be leveraged into write/control-flow primitives via heap grooming.
A:H - KASAN reports use-after-free in ocfs2_fast_symlink_read_folio during the over-wide memcpy; such kernel memory faults typically oops/panic the host, fully denying availability.
CVSS 3.1