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

Look up another CVE · open CVE-2026-97437 in the interactive tracker

CVE-2026-97437

ntfs3: fix out-of-bounds read in ntfs_dir_emit() and hdr_find_e()

7.1 EPSS 0.1% AV:L

Published 2026-09-24 (24 days ago) by the Linux kernel CNA. Subsystem fs/ntfs3. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2026-97437 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 12bookwormfixedDLA-4841-1 · 2026-10-17 · text6.1.190-1Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts.
Debian 13trixiefixedDSA-6528-1 · 2026-09-29 · text6.12.111-1Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian 12bookworm · linux-6.12fixedDLA-4817-1 · 2026-10-04 · text6.12.111-1~deb12u1Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

The bounds check in ntfs_dir_emit() compares fname->name_len (a character count) against e->size (a byte count) without accounting for the 2-byte-per-character UTF-16LE encoding or the ATTR_FILE_NAME header size: if (fname->name_len + sizeof(struct NTFS_DE) > le16_to_cpu(e->size)) This computes: name_len + 16 > e_size The correct check must account for the ATTR_FILE_NAME header (66 bytes before the name) and the UTF-16LE character size (2 bytes each): sizeof(NTFS_DE) + offsetof(ATTR_FILE_NAME, name) + name_len * sizeof(short) > e_size Which computes: 16 + 66 + name_len * 2 > e_size The correct calculation already exists as fname_full_size() in ntfs.h and is used in cmp_fnames(), namei.c, and fslog.c, but was not used in the readdir path. A crafted NTFS image with an index entry containing a small e->size but large fname->name_len bypasses the current check, causing ntfs_utf16_to_nls() to read past the entry boundary. Additionally, add a key_size validation in hdr_find_e() to ensure the declared key_size does not exceed the available entry data, preventing comparison functions from reading past entry boundaries on the lookup path.

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/ntfs3/dir.c
fs/ntfs3/index.c

What this is
NTFS3 FILESYSTEMMAINTAINERS section matched on fs/ntfs3/ · ntfs3@lists.linux.dev · Supported
Kernel module
ntfs3

Check it on the machine

grep -w CONFIG_NTFS3_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 ntfs3

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 does not build this code in 3 releases. It does build it in 2 releases, so the answer depends on which release the machine runs.

  • bookwormn
  • trixiem
  • forky, sidn
  • bookworm · linux-6.12m
n
not enabled on any flavour - this release does not build the code
m
a loadable module on every flavour - check lsmod, can be blacklisted
Build switch
CONFIG_NTFS3_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
2026-09-24 (24 days ago)source
CVSS
7.1 high
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.14%, higher than 2.8% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
fs/ntfs3

Upstream fixes

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

IntroducedFixed inCommit
5.155.15.222d1f98938e437
5.156.1.1890505f1e7bb5b
5.156.6.1582f7d0ec8c10d
5.156.12.111ed6da1abeec5
5.156.18.536a8149a20e46
5.157.2aa1bdbb39f49

Debian advisories

AdvisoryDateShipped toDebian
DLA-4841-12026-10-17bookworm 6.1.190-1tracker
DLA-4817-12026-10-04bookworm 6.12.111-1~deb12u1tracker
DSA-6528-12026-09-29trixie 6.12.111-1tracker

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 attacker-controlled bytes are on-disk NTFS_DE.size, ATTR_FILE_NAME.name_len and NTFS_DE.key_size. getdents64→iterate_dir→ntfs_readdir→ntfs_read_hdr→ntfs_dir_emit() and ntfs_lookup/ntfs_fill_super→ntfs_extend_init→dir_search_u→indx_find→hdr_find_e() consume those fields; no SMB, NFS, or TCP message carries them.
AC:LAttack complexity, low
A crafted index entry with e->size >= name_len+sizeof(NTFS_DE) but smaller than sizeof(NTFS_DE)+offsetof(ATTR_FILE_NAME,name)+name_len*2 bypasses the old ntfs_dir_emit() check so ntfs_utf16_to_nls() over-reads on every readdir of that directory; the same image can set key_size > e->size-sizeof(NTFS_DE) so hdr_find_e() passes an oversized key to cmp_fnames(). No race.
PR:NPrivileges required, none
Crafting the NTFS image needs no host account. ntfs_fs_type.fs_flags is only FS_REQUIRES_DEV|FS_ALLOW_IDMAP (no FS_USERNS_MOUNT), so mount_capable() requires init-namespace CAP_SYS_ADMIN; that mount is scored as UI:R, not attacker privilege. ntfs_dir_emit() and hdr_find_e() have no capable() gate after the volume is mounted.
UI:RUser interaction, required
The bad name_len and key_size are inert on-disk until a victim or automount helper mounts the image via path_mount→get_tree_bdev→ntfs_fill_super. That mount is the required user action; ntfs_extend_init() even calls dir_search_u()→hdr_find_e() during fill_super, and a subsequent getdents reaches ntfs_dir_emit().
S:UScope, unchanged
The over-read in ntfs_utf16_to_nls()/cmp_fnames() and any oops stay in the host kernel that mounted the volume. This is not a KVM/Xen guest-to-host escape or an IOMMU/DMA boundary bypass.
C:HConfidentiality impact, high
ntfs_dir_emit() hands attacker-chosen fname->name_len (u8, up to 255 UTF-16 units) to ntfs_utf16_to_nls() after a check that ignores the 66-byte ATTR_FILE_NAME header and 2-byte encoding, so up to ~321 bytes past the NTFS_DE—and past indx_read()'s kmalloc(1<<index_bits) if the entry is at the buffer tail—are converted and dir_emit()'d into getdents. hdr_find_e() likewise lets cmp_fnames() read past that slab.
I:NIntegrity impact, none
ntfs_utf16_to_nls() writes only into the PATH_MAX buffer kmalloc'd by ntfs_readdir(); dir_emit()/filldir() then copy that name to the user dirent. hdr_find_e's cmp_fnames() returns only a comparison integer. Neither path is an out-of-bounds write, UAF, or control-flow hijack.
A:HAvailability impact, high
indx_read() kmallocs 1<<index_bits (typically 4K) for the INDEX_BUFFER. An entry near the end with name_len=255, or key_size larger than the remaining payload, makes ntfs_utf16_to_nls() or fname_full_size() in cmp_fnames() read off that object, which can fault unmapped adjacent pages and oops the kernel.