{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2026-92504",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2026-92504"
  ],
  "published": "2026-09-17T16:10:40Z",
  "summary": "thermal: intel: int3400: clean up ODVP on probe failures",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nthermal: intel: int3400: clean up ODVP on probe failures\n\nevaluate_odvp() creates per-ODVP sysfs files before the thermal zone\nand later probe resources are registered. The current unwind path only\ncalls cleanup_odvp() from the late sysfs failure path, so failures after\nevaluate_odvp() but before that label, including\nthermal_tripless_zone_device_register() failures, leave the ODVP files\nand storage behind.\n\nMove the ODVP cleanup to the common ART/TRT unwind path so every failure\nafter evaluate_odvp() releases the ODVP state. Also clear the cached\nODVP pointers in cleanup_odvp(), because evaluate_odvp() can already call\nit for partial setup failures while probe continues.",
  "severity": [
    {
      "type": "CVSS_V3",
      "score": "CVSS:3.1/AV:L/AC:H/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.188",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2026-92504"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/5798c714fccf1b4939a98a812b9073da365172c8"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/bfd6df12ce6781e4bf1c7177dab42a8780177960"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/ad13e550ce51c66560bafd315eb5d09f2ee7c4ce"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/08df725b927512fa9672b146a00766da478b6c2e"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/bc0e96267a6715fcc4b81cf980034a5e65703780"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/d7b025d3fdf3cf8b726ce1d13f434f57477972bb"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/169772cd2147c517be5cfda2710d17f8c90d6f10"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/d83dc9ce57a746a6dca28439bcc0575d26fa6986"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-09-18T17:55:42Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.0,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - evaluate_odvp() in int3400_thermal_probe() creates odvpN attributes on the INT3400/INTC104x ACPI platform device; after a failed unwind the UAF is hit by reading those files in odvp_show(), not by a network or radio protocol payload.\nAC:H - The leak runs only when int3400_thermal_probe() fails after evaluate_odvp() but before the old free_sysfs label (thermal_tripless_zone_device_register(), sysfs_create_group() for uuids/imok, or device_create_bin_file()), or when evaluate_odvp() itself fails after allocating attrs; those are -ENOMEM/kernfs errors the attacker cannot force.\nPR:L - evaluate_odvp() creates each odvpN with mode 0444 on priv->pdev->dev.kobj; after probe kfree(priv) via free_art_trt without cleanup_odvp(), an unprivileged local user can open those leftover files and run odvp_show() with no CAP_SYS_ADMIN.\nUI:N - The attacker reads the leftover odvpN sysfs attributes themselves; no other user must mount media, bind int3400_thermal, or confirm a prompt.\nS:U - odvp_show() dereferences the probe-freed int3400_thermal_priv in the host kernel; this is not a VM, IOMMU, or sandbox escape.\nC:H - odvp_show() evaluates odvp_attr->priv->odvp[odvp_attr->odvp] after int3400_thermal_probe() kfree(priv) on free_art_trt, a slab UAF of int3400_thermal_priv that discloses kernel memory once that object is reclaimed.\nI:H - cleanup_odvp() used to leave priv->odvp/priv->odvp_attrs set after evaluate_odvp()'s out_err path; a later evaluate_odvp() from int3400_thermal_change_mode() or INT3400_ODVP_CHANGED then writes ACPI integers through the freed odvp buffer, and remove-path cleanup_odvp() double-frees it.\nA:H - odvp_show() dereferencing the freed priv, and evaluate_odvp() writing through a dangling priv->odvp, oops or panic the kernel."
    }
  }
}
