{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2026-93796",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2026-93796"
  ],
  "published": "2026-09-24T16:08:25Z",
  "summary": "wifi: iwlwifi: pcie: null RX pointers after free",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nwifi: iwlwifi: pcie: null RX pointers after free\n\nWhen iwl_pcie_tx_init() fails after RX init, nic init unwinds via\niwl_pcie_rx_free().\n\nThe freed RX members stayed non-NULL on the live transport object,\nso later teardown or retry could touch stale RX state.\nSet rx_pool, global_table, rxq, and alloc_page to NULL after free\nto make repeated cleanup and retry paths safe.",
  "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": null,
            "compiled_filter": false
          }
        }
      }
    },
    {
      "package": {
        "ecosystem": "Raspberry Pi OS:13",
        "name": "linux"
      },
      "versions": [
        "1:6.18.29-1+rpt1",
        "1:6.18.33-1+rpt1",
        "1:6.18.34-1+rpt1",
        "1:6.18.39-1+rpt1",
        "1:6.18.50-1+rpt1"
      ],
      "ecosystem_specific": {
        "binaries": [
          {
            "binary_name": "linux-image-6.18.29+rpt-rpi-2712",
            "binary_version": "1:6.18.29-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.29+rpt-rpi-v8",
            "binary_version": "1:6.18.29-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.29+rpt-rpi-v8-rt",
            "binary_version": "1:6.18.29-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.33+rpt-rpi-2712",
            "binary_version": "1:6.18.33-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.33+rpt-rpi-v8",
            "binary_version": "1:6.18.33-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.33+rpt-rpi-v8-rt",
            "binary_version": "1:6.18.33-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.34+rpt-rpi-2712",
            "binary_version": "1:6.18.34-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.34+rpt-rpi-v8",
            "binary_version": "1:6.18.34-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.34+rpt-rpi-v8-rt",
            "binary_version": "1:6.18.34-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.39+rpt-rpi-2712",
            "binary_version": "1:6.18.39-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.39+rpt-rpi-v8",
            "binary_version": "1:6.18.39-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.39+rpt-rpi-v8-rt",
            "binary_version": "1:6.18.39-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.50+rpt-rpi-2712",
            "binary_version": "1:6.18.50-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.50+rpt-rpi-v8",
            "binary_version": "1:6.18.50-1+rpt1"
          },
          {
            "binary_name": "linux-image-6.18.50+rpt-rpi-v8-rt",
            "binary_version": "1:6.18.50-1+rpt1"
          }
        ]
      },
      "database_specific": {
        "per_version": {
          "1:6.18.29-1+rpt1": {
            "linux_commit": "66318c5b5cd8145a662303af12ed39ac07eb27cc",
            "upstream_version": "6.18.29",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.18.53"
          },
          "1:6.18.33-1+rpt1": {
            "linux_commit": "95b85bebbedcaedfa7ca79116ed38b7376fba412",
            "upstream_version": "6.18.33",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.18.53"
          },
          "1:6.18.34-1+rpt1": {
            "linux_commit": "c8c7494100e99ee05b11aaa4f0588a223a63d1af",
            "upstream_version": "6.18.34",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.18.53"
          },
          "1:6.18.39-1+rpt1": {
            "linux_commit": "60ea684a8ace97bb0db1a16e20753bdd6ab371ff",
            "upstream_version": "6.18.39",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.18.53"
          },
          "1:6.18.50-1+rpt1": {
            "linux_commit": "cff533aec2fa601846766b32ff57204e0a61bed7",
            "upstream_version": "6.18.50",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.18.53"
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2026-93796"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/6ec5bf430cf7466cb412e47f2761594092781fac"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/3456c5bcc987aeb182e50e30c9b02be8420e9953"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/2c79d7a7b583050c9f58041465cb46fe3483ab5d"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-09-25T12:45:48Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 7.0,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - The dangling pointers are created in iwl_pcie_rx_free() when iwl_pcie_nic_init() unwinds a failed iwl_pcie_tx_init() after iwl_pcie_rx_init(). That runs from iwl_trans_pcie_start_fw() during iwl_mvm_start_get_nvm()/iwl_mvm_up() (PCI firmware callback or mac80211 drv_start), not from iwl_pcie_rx_handle() or any 802.11 frame parse.\nAC:H - iwl_pcie_nic_init() only calls iwl_pcie_rx_free() when iwl_pcie_tx_init() fails after a successful iwl_pcie_rx_init(). Reachable failures are ENOMEM in iwl_pcie_tx_alloc() or a non-power-of-two slots_num in iwl_queue_init(); the attacker cannot make RX allocation succeed and the subsequent TX allocation fail on demand.\nPR:L - iwl_op_mode_mvm_start() calls iwl_mvm_start_get_nvm() \u2192 iwl_run_init_mvm_ucode() \u2192 iwl_trans_start_fw() with no capable() check from iwl_req_fw_callback after PCI bind. A local unprivileged process on a host with iwlwifi is sufficient; init-namespace CAP_NET_ADMIN is not required to reach this unwind.\nUI:N - After iwl_pcie_rx_free() in the nic_init unwind, iwl_mvm_start_get_nvm() always calls iwl_mvm_stop_device() (and iwl_run_init_ucode() always calls iwl_trans_stop_device()), so iwl_pcie_rx_napi_sync() uses the stale rxq with no victim mount, file open, or association.\nS:U - The UAF and double-free of trans_pcie->rxq, rx_pool, global_table, and alloc_page stay inside the host iwlwifi PCIe transport on the same kernel authority; this is not a KVM/Xen guest-to-host escape or an IOMMU/DMA bypass.\nC:H - iwl_pcie_rx_free() kfree()s rxq/rx_pool/global_table and __free_pages()s alloc_page without NULL, then iwl_pcie_rx_napi_sync() and _iwl_pcie_rx_init() dereference those freed objects; UAF of those slabs/pages enables arbitrary kernel read.\nI:H - _iwl_pcie_rx_init() writes the dangling rxq/rx_pool/global_table (list restock, netif_napi_add), and a later iwl_pcie_rx_free() from iwl_trans_pcie_free() double-frees the same kmalloc objects, giving a heap write/control-flow primitive.\nA:H - iwl_pcie_rx_napi_sync() walking a kfree'd rxq, or a second iwl_pcie_rx_free() of the same pointers from iwl_trans_pcie_free(), is a kernel oops or panic."
    }
  }
}
