{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2026-97508",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2026-97508"
  ],
  "published": "2026-09-24T16:08:25Z",
  "summary": "thunderbolt: Set tb->root_switch to NULL when domain is stopped",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nthunderbolt: Set tb->root_switch to NULL when domain is stopped\n\nSimilarly what we do with the firmware connection manager. This makes\ntb_xdp_handle_request() return error to the remote host. However, we\nneed to make sure we keep the uuid alive so that we can reply until the\nwhole domain is released.",
  "severity": [
    {
      "type": "CVSS_V3",
      "score": "CVSS:3.1/AV:A/AC:H/PR:N/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.189",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2026-97508"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/d9a638e7bc87e0e6fe3a75517ac481e72fc0058c"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/66b0fe27e277713c2b9f3c452c76330ed0bd7eaf"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/54ad3415cc211ca0d64ae1bf3234d6eb5c6aedd0"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/83d1af5b1b6e6c96ffa633ca2c9a77f6f4c93efa"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/f06e9fbae78a51832211b4495a19412c7d49ecb4"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/99f019d2e9eb79adc485fef8aa8ada2cd0c843e9"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/e56249d8a68e712f3b60e1f3fdbb5b4fea146468"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-10-03T11:04:09Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.5,
      "cvss_v3_severity": "High",
      "scenario": "AV:A - XDomain discovery packets (TB_CFG_PKG_XDOMAIN_REQ) from a connected Thunderbolt/USB4 peer enter via tb_ctl_rx_callback \u2192 tb_domain_event_cb \u2192 tb_xdomain_handle_request \u2192 tb_xdp_schedule_request and are handled in tb_xdp_handle_request, which then reads tb->root_switch after software-CM tb_stop(). This is a local Thunderbolt fabric, not a routable IP protocol.\nAC:H - The UAF requires software-CM tb_stop() to have already run tb_switch_remove(tb->root_switch) without clearing the pointer. tb_stop() is only called from tb_domain_remove() in nhi_pci_remove (NHI unbind/PCI removal), which a Thunderbolt peer cannot induce; UUID_REQUEST and other XDomain messages only queue system_wq work that then races that teardown.\nPR:N - tb_domain_event_cb dispatches TB_CFG_PKG_XDOMAIN_REQ to tb_xdomain_handle_request whenever tb_is_xdomain_enabled() (default-on xdomain module param plus ACPI OSC), with no device authorization or local credentials; UUID_REQUEST is answered even when tb_xdomain_find_by_route_locked() finds no xdomain.\nUI:N - Once a Thunderbolt/USB4 link exists, the peer injects XDomain control packets itself and tb_xdp_handle_request runs with no mount, sysfs write, or authorization dialog. Domain teardown is an attacker-independent condition and is scored as AC:H rather than a required victim UI step.\nS:U - The dangling tb->root_switch and sw->uuid accesses corrupt host kernel heap state inside the Thunderbolt driver; this does not cross a VM, IOMMU, or sandbox boundary.\nC:H - After tb_stop() frees the host switch, tb_xdp_handle_request still holds tb->root_switch->uuid and tb_xdp_uuid_response() uuid_copy()s those 16 bytes into a UUID_RESPONSE sent back to the peer; UAF of struct tb_switch is also a kernel disclosure primitive.\nI:H - tb_xdomain_find_by_route() calls switch_find_xdomain(tb->root_switch) which walks the freed host switch via tb_switch_for_each_port, and later request handlers may operate on a reallocated tb_xdomain; that slab UAF can be sprayed into an arbitrary write or control-flow hijack.\nA:H - Dereferencing the freed root switch in tb_xdp_handle_request (uuid load) or switch_find_xdomain (port walk) oopses the system_wq kworker, crashing the host."
    }
  }
}
