{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-38252", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2025-04-16T04:51:23.997Z", "datePublished": "2025-07-09T10:42:31.477Z", "dateUpdated": "2026-08-05T12:00:44.757Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:00:44.757Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\ncxl/ras: Fix CPER handler device confusion\n\nBy inspection, cxl_cper_handle_prot_err() is making a series of fragile\nassumptions that can lead to crashes:\n\n1/ It assumes that endpoints identified in the record are a CXL-type-3\n device, nothing guarantees that.\n\n2/ It assumes that the device is bound to the cxl_pci driver, nothing\n guarantees that.\n\n3/ Minor, it holds the device lock over the switch-port tracing for no\n reason as the trace is 100% generated from data in the record.\n\nCorrect those by checking that the PCIe endpoint parents a cxl_memdev\nbefore assuming the format of the driver data, and move the lock to where\nit is required. Consequently this also makes the implementation ready for\nCXL accelerators that are not bound to cxl_pci." } ], "metrics": [ { "cvssV3_1": { "version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.8, "baseSeverity": "HIGH" }, "scenarios": [ { "lang": "en", "value": "AV:L - The vulnerable handler is driven by ACPI APEI/GHES CXL Protocol Error records processed entirely on the local host; there is no network- or peer-supplied data path. The most severe reachable trigger is local — a VM tenant or local user driving an assigned/attached CXL endpoint into protocol errors, or the local EINJ CXL protocol-error injection path.\nAC:L - Once a CXL Protocol Error record naming a non-cxl_pci endpoint is processed, the type confusion is deterministic — no race to win and no memory-layout condition to guess. The endpoint branch is taken for every non-port PCIe device and `pci_get_drvdata()` is blindly cast, so the attacker reliably reaches the bad dereference.\nPR:L - No capability, credential, or privilege check exists anywhere on the path from `ghes_do_proc()` through `cxl_cper_post_prot_err()` to `cxl_cper_handle_prot_err()`. An unprivileged-equivalent actor — a guest tenant controlling a passed-through CXL/PCIe device, or a local user with access to a CXL device that can be driven into link errors — suffices; host root is not required.\nUI:N - The record is consumed automatically by the GHES notification path and the CXL workqueue with no victim action. No mount, file open, or any other user step is involved.\nS:U - The type confusion and its consequences are confined to the kernel's own memory and security authority. No IOMMU, hypervisor, or sandbox boundary is bypassed by the defect itself.\nC:H - The confused `cxlmd` pointer is dereferenced by `dev_name()` and `cxlmd->cxlds->serial`, copying strings and a 64-bit value read from an unvalidated kernel address into the ftrace ring buffer. That is an unbounded out-of-bounds read that leaks kernel memory contents and pointer-derived data.\nI:H - This is a type confusion — another driver's private structure is reinterpreted as `struct cxl_dev_state`, with the interpreted pointer chased through multiple levels. Per type-confusion handling, the corrupted interpretation of driver-owned state and the falsified RAS telemetry it produces are treated as a high integrity impact.\nA:H - Dereferencing a garbage `cxlmd` taken from a foreign driver's private data reliably faults, producing a kernel oops in the `cxl_cper_prot_err_work_fn` workqueue context. Repeated error records reproduce the crash, giving a full denial of service." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/cxl/core/ras.c" ], "versions": [ { "version": "36f257e3b0ba904f5a4e7fa8dafaa60e88cdd28c", "lessThan": "4bcb8dd36e9e3fad6c22862ac5b6993df838309b", "status": "affected", "versionType": "git" }, { "version": "36f257e3b0ba904f5a4e7fa8dafaa60e88cdd28c", "lessThan": "3c70ec71abdaf4e4fa48cd8fdfbbd864d78235a8", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/cxl/core/ras.c" ], "versions": [ { "version": "6.15", "status": "affected" }, { "version": "0", "lessThan": "6.15", "status": "unaffected", "versionType": "semver" }, { "version": "6.15.5", "lessThanOrEqual": "6.15.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.16", "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": "6.15", "versionEndExcluding": "6.15.5" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.15", "versionEndExcluding": "6.16" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/4bcb8dd36e9e3fad6c22862ac5b6993df838309b" }, { "url": "https://git.kernel.org/stable/c/3c70ec71abdaf4e4fa48cd8fdfbbd864d78235a8" } ], "title": "cxl/ras: Fix CPER handler device confusion", "x_generator": { "engine": "bippy-1.2.0" } } } }