{
    "dataType": "CVE_RECORD",
    "dataVersion": "5.2",
    "cveMetadata": {
        "cveId": "CVE-2026-72203",
        "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "state": "PUBLISHED",
        "assignerShortName": "Linux",
        "dateReserved": "2026-08-09T03:40:39.912Z",
        "datePublished": "2026-08-15T05:54:00.321Z",
        "dateUpdated": "2026-08-18T06:56:21.384Z"
    },
    "containers": {
        "cna": {
            "providerMetadata": {
                "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
                "shortName": "Linux",
                "dateUpdated": "2026-08-18T06:56:21.384Z"
            },
            "descriptions": [
                {
                    "lang": "en",
                    "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nntfs: skip extent mft records in writeback to prevent deadlock\n\nThis patch fixes the ABBA deadlock between extent_lock and extent\nmrec_lock triggered by xfstests generic/113, that occurs since the commit\n6994acf33bae (\"ntfs: use base mft_no when looking up base inode for\n\t\textent record\").\n\nPath A (inode writeback):\n  VFS writeback\n    -> ntfs_write_inode()\n      -> __ntfs_write_inode()\n        -> mutex_lock(&ni->extent_lock)\n        -> mutex_lock(&tni->mrec_lock)\n\nPath B (MFT folio writeback):\n  VFS writeback of $MFT dirty folios\n    -> ntfs_mft_writepages()\n      -> ntfs_write_mft_block()\n        -> ntfs_may_write_mft_record()\n          -> holds one extent mrec_lock from a previous iteration\n          -> tries to acquire another base inode extent_lock\n\nBy removing all extent_lock and extent mrec_lock acquisition from the MFT\nfolio writeback path, the ABBA lock ordering is eliminated:\n\nPath A: __ntfs_write_inode(): extent_lock -> mrec_lock\nPath B (removed): ntfs_write_mft_block(): mrec_lock -> extent_lock\n\nPath B is always redundant for extent records because:\n\n1. mark_mft_record_dirty(ext_ni) does NOT dirty the MFT folio.\n   It only sets NInoDirty(ext_ni) and marks the base VFS inode dirty\n   via __mark_inode_dirty(I_DIRTY_DATASYNC), which triggers Path A.\n   Therefore, normal extent modifications never create a situation where\n   the MFT folio is dirty and Path B is not scheduled.\n\n2. The MFT folio only gets dirtied via ntfs_mft_mark_dirty() inside\n   ntfs_mft_record_alloc(). But all identified callers in attrib.c\n   (ntfs_attr_add, ntfs_attr_record_move_away,\n   ntfs_attr_make_non_resident, ntfs_attr_record_resize) follow through\n   with mark_mft_record_dirty(), which triggers Path A to write the\n   complete record.\n\n3. ntfs_evict_big_inode() calls ntfs_commit_inode() before freeing extent\n   inodes, ensuring all dirty extents are flushed via Path A before the\n   base inode leaves the icache."
                }
            ],
            "metrics": [
                {
                    "cvssV3_1": {
                        "version": "3.1",
                        "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
                        "baseScore": 7.5,
                        "baseSeverity": "HIGH"
                    },
                    "scenarios": [
                        {
                            "lang": "en",
                            "value": "AV:N - The ABBA deadlock is reachable through concurrent VFS writeback on an rw-mounted NTFS volume; ntfs registers ntfs_export_ops, so nfsd/ksmbd remote WRITE/CLOSE/fsync RPCs on an exported NTFS share hit __ntfs_write_inode() and ntfs_mft_writepages() the same as local aio/write syscalls.\nAC:L - xfstests generic/113 (aio-stress with concurrent O_DIRECT/O_SYNC writes) reliably reproduces the hang; an attacker controls both lock-order participants by issuing parallel file metadata writes and sync/writeback pressure without races or attacker-independent memory layout.\nPR:N - Exploitation needs only write access to an rw-mounted or NFS/SMB-exported NTFS volume to drive ntfs_mft_record_alloc and concurrent writeback; no CAP_SYS_ADMIN, root, or init-namespace privileges on the server are required to deadlock the writeback paths.\nUI:N - Once an NTFS volume is rw-mounted (dual-boot partition, removable media, loop mount, or network export), the attacker issues the concurrent writes itself; no additional victim clicks, opens, or cooperative actions are required beyond that standing configuration.\nS:U - The circular mutex wait between extent_lock and extent mrec_lock only hangs kernel writeback and I/O worker threads within the host kernel security authority; it does not cross VM, container, IOMMU, or other security-boundary scopes.\nC:N - This is a deterministic lock-order inversion with no out-of-bounds access, use-after-free, or information disclosure; blocked threads wait on mutexes without reading attacker-controlled freed memory or leaking kernel pointers.\nI:N - The defect prevents completion of metadata writeback by deadlocking mutex acquisition; it does not perform attacker-controlled memory writes, corrupt on-disk NTFS structures, or provide a metadata modification primitive beyond denying forward progress.\nA:H - The ABBA deadlock between inode writeback (extent_lock then extent mrec_lock) and $MFT folio writeback (held mrec_lock then extent_lock) hangs kworker writeback and sync/fsync callers indefinitely, causing system-wide I/O denial of service."
                        }
                    ]
                }
            ],
            "affected": [
                {
                    "product": "Linux",
                    "vendor": "Linux",
                    "defaultStatus": "unaffected",
                    "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                    "programFiles": [
                        "fs/ntfs/mft.c"
                    ],
                    "versions": [
                        {
                            "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
                            "lessThan": "f831ab09d521898bf1dd99bf5adfd630ea1428e3",
                            "status": "affected",
                            "versionType": "git"
                        },
                        {
                            "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
                            "lessThan": "76bc14c7097ff678b2b5dbfd4fa33b46897d87ce",
                            "status": "affected",
                            "versionType": "git"
                        }
                    ]
                },
                {
                    "product": "Linux",
                    "vendor": "Linux",
                    "defaultStatus": "affected",
                    "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                    "programFiles": [
                        "fs/ntfs/mft.c"
                    ],
                    "versions": [
                        {
                            "version": "2.6.12",
                            "status": "affected"
                        },
                        {
                            "version": "0",
                            "lessThan": "2.6.12",
                            "status": "unaffected",
                            "versionType": "semver"
                        },
                        {
                            "version": "7.1.5",
                            "lessThanOrEqual": "7.1.*",
                            "status": "unaffected",
                            "versionType": "semver"
                        },
                        {
                            "version": "7.2",
                            "lessThanOrEqual": "*",
                            "status": "unaffected",
                            "versionType": "original_commit_for_fix"
                        }
                    ]
                }
            ],
            "cpeApplicability": [
                {
                    "nodes": [
                        {
                            "operator": "OR",
                            "negate": false,
                            "cpeMatch": [
                                {
                                    "vulnerable": true,
                                    "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                                    "versionStartIncluding": "2.6.12",
                                    "versionEndExcluding": "7.1.5"
                                },
                                {
                                    "vulnerable": true,
                                    "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                                    "versionStartIncluding": "2.6.12",
                                    "versionEndExcluding": "7.2"
                                }
                            ]
                        }
                    ]
                }
            ],
            "references": [
                {
                    "url": "https://git.kernel.org/stable/c/f831ab09d521898bf1dd99bf5adfd630ea1428e3"
                },
                {
                    "url": "https://git.kernel.org/stable/c/76bc14c7097ff678b2b5dbfd4fa33b46897d87ce"
                }
            ],
            "title": "ntfs: skip extent mft records in writeback to prevent deadlock",
            "x_generator": {
                "engine": "bippy-1.2.0"
            }
        }
    }
}