{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2025-21687",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2025-21687"
  ],
  "published": "2025-02-10T16:00:58Z",
  "summary": "vfio/platform: check the bounds of read/write syscalls",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nvfio/platform: check the bounds of read/write syscalls\n\ncount and offset are passed from user space and not checked, only\noffset is capped to 40 bits, which can be used to read/write out of\nbounds of the device.",
  "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.128",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2025-21687"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/f21636f24b6786c8b13f1af4319fa75ffcf17f38"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/9377cdc118cf327248f1a9dde7b87de067681dc9"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/d19a8650fd3d7aed8d1af1d9a77f979a8430eba1"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/ed81d82bb6e9df3a137f2c343ed689e6c68268ef"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/92340e6c5122d823ad064984ef7513eba9204048"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/f65ce06387f8c1fb54bd59e18a8428248ec68eaf"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/6bcb8a5b70b80143db9bf12dfa7d53636f824d53"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/1485932496a1b025235af8aa1e21988d6b7ccd54"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/c981c32c38af80737a2fedc16e270546d139ccdd"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/a20fcaa230f7472456d12cf761ed13938e320ac3"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/665cfd1083866f87301bbd232cb8ba48dcf4acce"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/ce9ff21ea89d191e477a02ad7eabf4f996b80a69"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-08-05T12:19:11Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.8,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - The vulnerability is triggered via read()/write()/pread()/pwrite() syscalls on a VFIO device file descriptor (/dev/vfio/<group> or /dev/vfio/devices/vfioN), requiring local access to the system. There is no network-facing path to vfio_platform_read/write.\nAC:L - The attacker directly and deterministically controls both the file offset (40 bits, unchecked against reg->size) and the byte count, so a single pwrite()/pread() reliably performs an out-of-bounds MMIO access at any chosen offset with no race, timing, or uncontrolled precondition.\nPR:L - Only an open fd on the VFIO device is needed; the IOMMU-backed VFIO path enforces no capability check (CAP_SYS_RAWIO is required only for the no-iommu mode), and VFIO is expressly designed to grant unprivileged users device access via file permissions. Handing the device node to a non-root user (QEMU, userspace drivers) is the normal deployment.\nUI:N - The attacker performs the entire attack by issuing syscalls on a descriptor it opens itself; no victim action, configuration change, or interaction with another user is required.\nS:U - The vulnerable component and the impacted component are both the Linux kernel \u2014 the out-of-bounds accesses land in kernel virtual address space managed by the same security authority. This is standard local kernel compromise, not a guest-to-host or IOMMU-crossing escape.\nC:H - ioread8/16/32 at an attacker-chosen offset up to 1 TiB past the ioremapped device window, with the value copied directly to userspace via copy_to_user, yields arbitrary kernel memory disclosure across the entire vmalloc/ioremap range (kernel stacks, vmalloc'd structures, other devices' MMIO).\nI:H - iowrite8/16/32 writes fully attacker-controlled data at an attacker-chosen kernel virtual address in the same 1 TiB window, giving an arbitrary kernel write that can corrupt VMAP_STACK kernel stacks, BPF JIT pages, and other drivers' registers (including SMMU control registers) \u2014 a direct path to code execution and privilege escalation.\nA:H - Accessing an unmapped virtual address in the out-of-bounds window causes a kernel data abort/oops or panic, and writes into unrelated devices' MMIO registers can wedge or hang the machine; this is trivially and repeatedly triggerable."
    }
  }
}
