data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2025-40025 in the interactive tracker

CVE-2025-40025

f2fs: fix to do sanity check on node footer for non inode dnode

7.8 EPSS 0.1% AV:L

Published 2025-10-28 (12 months ago) by the Linux kernel CNA. Subsystem fs/f2fs. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2025-40025 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
Debian 13trixievulnerable6.12.113-1No fix published anywhere yet, neither in Debian nor upstream for the series trixie tracks. Watch the Debian tracker page for this CVE. Advisories for trixie have historically landed a median of 11 days after publication.
Debian 14forkyfixed6.17.6-1Update the kernel and reboot. Fixed in 6.17.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed6.17.6-1Update the kernel and reboot. Fixed in 6.17.6-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

As syzbot reported below: ------------[ cut here ]------------ kernel BUG at fs/f2fs/file.c:1243! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 0 UID: 0 PID: 5354 Comm: syz.0.0 Not tainted 6.17.0-rc1-syzkaller-00211-g90d970cade8e #0 PREEMPT(full) RIP: 0010:f2fs_truncate_hole+0x69e/0x6c0 fs/f2fs/file.c:1243 Call Trace: <TASK> f2fs_punch_hole+0x2db/0x330 fs/f2fs/file.c:1306 f2fs_fallocate+0x546/0x990 fs/f2fs/file.c:2018 vfs_fallocate+0x666/0x7e0 fs/open.c:342 ksys_fallocate fs/open.c:366 [inline] __do_sys_fallocate fs/open.c:371 [inline] __se_sys_fallocate fs/open.c:369 [inline] __x64_sys_fallocate+0xc0/0x110 fs/open.c:369 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f1e65f8ebe9 w/ a fuzzed image, f2fs may encounter panic due to it detects inconsistent truncation range in direct node in f2fs_truncate_hole(). The root cause is: a non-inode dnode may has the same footer.ino and footer.nid, so the dnode will be parsed as an inode, then ADDRS_PER_PAGE() may return wrong blkaddr count which may be 923 typically, by chance, dn.ofs_in_node is equal to 923, then count can be calculated to 0 in below statement, later it will trigger panic w/ f2fs_bug_on(, count == 0 || ...). count = min(end_offset - dn.ofs_in_node, pg_end - pg_start); This patch introduces a new node_type NODE_TYPE_NON_INODE, then allowing passing the new_type to sanity_check_node_footer in f2fs_get_node_folio() to detect corruption that a non-inode dnode has the same footer.ino and footer.nid. Scripts to reproduce: mkfs.f2fs -f /dev/vdb mount /dev/vdb /mnt/f2fs touch /mnt/f2fs/foo touch /mnt/f2fs/bar dd if=/dev/zero of=/mnt/f2fs/foo bs=1M count=8 umount /mnt/f2fs inject.f2fs --node --mb i_nid --nid 4 --idx 0 --val 5 /dev/vdb mount /dev/vdb /mnt/f2fs xfs_io /mnt/f2fs/foo -c "fpunch 6984k 4k"

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

fs/f2fs/f2fs.h
fs/f2fs/gc.c
fs/f2fs/node.c
fs/f2fs/node.h
fs/f2fs/recovery.c

What this is
F2FS FILE SYSTEMMAINTAINERS section matched on fs/f2fs/ · linux-f2fs-devel@lists.sourceforge.net · Maintained
Kernel module
f2fs

Check it on the machine

grep -w CONFIG_F2FS_FS /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w f2fs

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.

  • bookworm, trixie, forky, sidMnot built on amd64/cloud-amd64, arm64/cloud-arm64
M
a module where it is built at all; some flavours do not build it
Build switch
CONFIG_F2FS_FS

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2025-10-28 (12 months ago)source
CVSS
7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.14%, higher than 3.3% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
fs/f2fs

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
3.86.17.2186098f34b8a
3.86.18c18ecd99e0c7

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:LAttack vector, local
The vulnerability is reached through local syscalls (fallocate/read/write/truncate) on a file residing in a mounted, attacker-crafted f2fs image; no network or remote protocol handling is involved.
AC:LAttack complexity, low
The attacker fully controls the on-disk node footer (footer.ino == footer.nid) and the punch-hole offset/length, so the misparse and the resulting out-of-bounds access are deterministic — the commit ships a byte-exact reproducer via inject.f2fs plus a single xfs_io fpunch.
PR:LPrivileges required, low
Once the crafted image is mounted (removable media/automount, shared workstation, or Android SD card), triggering requires only an unprivileged local user issuing a normal fallocate or read on a file in that filesystem — no capability check exists on the path from vfs_fallocate to f2fs_get_dnode_of_data.
UI:NUser interaction, none
After the malicious image is present, the attacker performs every step themselves; no victim action is needed to reach f2fs_truncate_hole or the read/write paths that hit the same misparse.
S:UScope, unchanged
The corruption is confined to kernel memory within the same security authority; no VM, IOMMU, or sandbox boundary is crossed.
C:HConfidentiality impact, high
f2fs_data_blkaddr() indexes i_addr (base byte 360) with a direct-node offset up to 1017, reading past the end of the 4 KiB node folio; the leaked adjacent kernel memory becomes dn->data_blkaddr, which f2fs then treats as a physical block address and may read into the page cache, exposing arbitrary disk and heap contents.
I:HIntegrity impact, high
__set_data_blkaddr() writes through the same out-of-bounds pointer, and with CONFIG_F2FS_CHECK_FS disabled the f2fs_bug_on degrades to WARN_ON so the underflowed, attacker-chosen count is passed to f2fs_truncate_data_blocks_range, yielding an attacker-controlled-length out-of-bounds write past the node folio plus invalidation of arbitrary filesystem blocks.
A:HAvailability impact, high
With CONFIG_F2FS_CHECK_FS enabled this is a hard BUG_ON at fs/f2fs/file.c:1243 causing immediate kernel panic (as syzbot reported), and without it the out-of-bounds writes corrupt adjacent kernel memory and filesystem metadata, crashing the system.