{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2024-56662",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2024-56662"
  ],
  "published": "2024-12-27T15:08:24Z",
  "summary": "acpi: nfit: vmalloc-out-of-bounds Read in acpi_nfit_ctl",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nacpi: nfit: vmalloc-out-of-bounds Read in acpi_nfit_ctl\n\nFix an issue detected by syzbot with KASAN:\n\nBUG: KASAN: vmalloc-out-of-bounds in cmd_to_func drivers/acpi/nfit/\ncore.c:416 [inline]\nBUG: KASAN: vmalloc-out-of-bounds in acpi_nfit_ctl+0x20e8/0x24a0\ndrivers/acpi/nfit/core.c:459\n\nThe issue occurs in cmd_to_func when the call_pkg->nd_reserved2\narray is accessed without verifying that call_pkg points to a buffer\nthat is appropriately sized as a struct nd_cmd_pkg. This can lead\nto out-of-bounds access and undefined behavior if the buffer does not\nhave sufficient space.\n\nTo address this, a check was added in acpi_nfit_ctl() to ensure that\nbuf is not NULL and that buf_len is less than sizeof(*call_pkg)\nbefore accessing it. This ensures safe access to the members of\ncall_pkg, including the nd_reserved2 array.",
  "severity": [
    {
      "type": "CVSS_V3",
      "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H"
    }
  ],
  "affected": [
    {
      "package": {
        "ecosystem": "Raspberry Pi OS:12",
        "name": "linux"
      },
      "versions": [
        "1:6.1.47-1+rpt4"
      ],
      "ecosystem_specific": {
        "binaries": [
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-2712",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v6",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7l",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v8",
            "binary_version": "1:6.1.47-1+rpt4"
          }
        ]
      },
      "database_specific": {
        "per_version": {
          "1:6.1.47-1+rpt4": {
            "linux_commit": "655fc658a15ae7a6f37103754adb39ba52a9a14e",
            "upstream_version": "6.1.47",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.1.121",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2024-56662"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/616aa5f3c86e0479bcbb81e41c08c43ff32af637"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/bbdb3307f609ec4dc9558770f464ede01fe52aed"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/143f723e9eb4f0302ffb7adfdc7ef77eab3f68e0"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/e08dc2dc3c3f7938df0e4476fe3e6fdec5583c1d"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/212846fafb753a48e869e2a342fc1e24048da771"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/265e98f72bac6c41a4492d3e30a8e5fd22fe0779"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-08-05T11:52:36Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.8,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - The vulnerability is reached exclusively through the `ND_IOCTL_CALL` ioctl on the local libnvdimm character devices `/dev/ndctl%d` or `/dev/nmem%d`, requiring local system access. There is no remote or adjacent-network path into `acpi_nfit_ctl()`.\nAC:L - The attacker fully controls `nd_size_in`/`nd_size_out` in the ioctl payload, and the u32 overflow in `__nd_ioctl()` deterministically produces an undersized `vmalloc()` buffer on every attempt; the OOB read in `cmd_to_func()` occurs unconditionally before any command-mask validation. No race, timing window, or uninfluenceable memory layout is involved.\nPR:L - The entire path from `nd_ioctl()` through `acpi_nfit_ctl()` contains no `capable()` or capability check of any kind \u2014 access is gated only by filesystem permissions on the nvdimm device node plus the `O_RDONLY` rejection, so any account or container granted write access to `/dev/ndctl0`/`/dev/nmem0` (e.g. a delegated pmem-management group or a management container given the device) can trigger it. Since no in-kernel privilege gate exists, this is scored as low privileges rather than real root.\nUI:N - Exploitation is a single self-contained ioctl issued by the attacker's own process; no victim action, mount, or file open is required.\nS:U - The out-of-bounds access corrupts and discloses kernel memory within the same kernel security authority, and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - The undersized allocation causes reads of up to 40 bytes of stale kernel page data past the allocation (`nd_reserved2` and `nd_fw_size`), and the desynchronized `nd_size_in` is then passed to `acpi_evaluate_dsm()` as a buffer descriptor of attacker-chosen length (up to ~4 GB) pointing into the vmap area, exposing far more than a strictly bounded few bytes.\nI:H - The same undersized-buffer condition yields an out-of-bounds write: `call_pkg->nd_fw_size = out_obj->buffer.length` writes 4 bytes past the allocation, and `memcpy(call_pkg->nd_payload + call_pkg->nd_size_in, ...)` writes DSM output to an attacker-controlled offset roughly 4 GB beyond `buf`. An out-of-bounds write with attacker-influenced destination and length is a control-flow-hijack-capable primitive.\nA:H - The OOB access triggers a KASAN BUG on hardened kernels, and on production kernels the ~4 GB buffer length handed to the ACPI interpreter and the wild `memcpy` destination in the vmap region reliably fault, producing a kernel oops or panic. The condition is trivially repeatable."
    }
  }
}
