CVE-2026-98283 (GCVE-0-2026-98283)
Vulnerability from cvelistv5
Published
2026-10-06 08:45
Modified
2026-10-19 09:16
Summary
In the Linux kernel, the following vulnerability has been resolved: KVM: PPC: Book3S HV: fix use-after-free in kvmhv_emulate_tlbie_all_lpid() kvmhv_emulate_tlbie_all_lpid() iterates the nested-guest IDR and drops mmu_lock before calling kvmhv_emulate_tlbie_lpid(), but does not hold a reference on the kvm_nested_guest pointer obtained from the IDR. A concurrent vCPU issuing a single-LPID tlbie (is=2, ric=2) can race through kvmhv_flush_nested() -> kvmhv_remove_nested() -> idr_remove / --refcnt -> kvmhv_release_nested() -> kfree(gp) in that window, leaving the iterating vCPU with a dangling pointer. The subsequent mutex_lock(&gp->tlb_lock) and accesses to gp->shadow_pgtable, gp->shadow_lpid and gp->l1_host all touch freed memory. The free path is fully L1-controlled. Fix this by incrementing gp->refcnt inside the loop before dropping mmu_lock, mirroring what kvmhv_get_nested() does, and releasing the reference with kvmhv_put_nested() after the per-guest work completes. This is the same get/put discipline already used at every other call site that drops mmu_lock while holding a nested-guest pointer.
Impacted products
Vendor Product Version
Linux Linux Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Version: e3b6b4661527e821ffbe3db83952fdb1e6e47c49
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "arch/powerpc/kvm/book3s_hv_nested.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "4d8f7b1f586375df8bce23a0909566ad5e852259",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            },
            {
              "lessThan": "e37fba1ba69385cff2d0e60b371ee19e7d1852d1",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            },
            {
              "lessThan": "24b634852413229bb8340d908b115c3365f3a247",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            },
            {
              "lessThan": "fbf69b7d0555ee83c871f58750770f74b7179ad1",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            },
            {
              "lessThan": "ec2d7a52b3996ae81131617b4afc0af31583c1b4",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            },
            {
              "lessThan": "51938dfa8a51a4f85328413fca9b6e21f9d2d088",
              "status": "affected",
              "version": "e3b6b4661527e821ffbe3db83952fdb1e6e47c49",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "arch/powerpc/kvm/book3s_hv_nested.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "4.20"
            },
            {
              "lessThan": "4.20",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.1.*",
              "status": "unaffected",
              "version": "6.1.189",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.158",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.112",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.54",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.8",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.3",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.1.189",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.158",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.112",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.54",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.8",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "4.20",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: PPC: Book3S HV: fix use-after-free in kvmhv_emulate_tlbie_all_lpid()\n\nkvmhv_emulate_tlbie_all_lpid() iterates the nested-guest IDR and drops\nmmu_lock before calling kvmhv_emulate_tlbie_lpid(), but does not hold a\nreference on the kvm_nested_guest pointer obtained from the IDR.  A\nconcurrent vCPU issuing a single-LPID tlbie (is=2, ric=2) can race\nthrough kvmhv_flush_nested() -\u003e kvmhv_remove_nested() -\u003e idr_remove /\n--refcnt -\u003e kvmhv_release_nested() -\u003e kfree(gp) in that window, leaving\nthe iterating vCPU with a dangling pointer.  The subsequent\nmutex_lock(\u0026gp-\u003etlb_lock) and accesses to gp-\u003eshadow_pgtable,\ngp-\u003eshadow_lpid and gp-\u003el1_host all touch freed memory.  The free path\nis fully L1-controlled.\n\nFix this by incrementing gp-\u003erefcnt inside the loop before dropping\nmmu_lock, mirroring what kvmhv_get_nested() does, and releasing the\nreference with kvmhv_put_nested() after the per-guest work completes.\nThis is the same get/put discipline already used at every other\ncall site that drops mmu_lock while holding a nested-guest pointer."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 8.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - The trigger is the H_TLB_INVALIDATE hcall made by code running inside an L1 guest on the POWER KVM-HV host, via kvmppc_pseries_do_hcall -\u003e kvmhv_do_nested_tlbie -\u003e kvmhv_emulate_priv_tlbie -\u003e kvmhv_emulate_tlbie_all_lpid. No network protocol carries the input; the attacker needs code execution in a local guest.\nAC:L - The L1 controls both sides of the race: one vCPU issues tlbie is=3 (all-LPID walk), another issues is=2 ric=2 after zeroing its own partition-table entry so kvmhv_flush_nested() calls kvmhv_remove_nested() and kfree(gp). Contention on gp-\u003etlb_lock widens the window and the attempt can be repeated. The only outside requirement is the VMM enabling KVM_CAP_PPC_NESTED_HV.\nPR:L - The attacker needs kernel/hypervisor-mode code in a nested-enabled L1 guest, which an ordinary tenant owns, but holds no privilege on the L0 host. The nesting_enabled() check is the only gate before kvmhv_do_nested_tlbie().\nUI:N - The L1 guest issues every hcall and controls every partition-table entry involved. No host operator or other user has to do anything.\nS:C - A guest-controlled vulnerability corrupts memory in the L0 host kernel (the kfree\u0027d kvm_nested_guest object), which crosses the guest-to-host boundary.\nC:H - After the free, kvmhv_emulate_tlbie_lpid() reads gp-\u003eshadow_pgtable, gp-\u003eshadow_lpid and gp-\u003el1_host from the dangling object. A reclaimed object lets the guest steer host page-table walks and host data reads.\nI:H - The freed gp is used for mutex_lock(\u0026gp-\u003etlb_lock), kvmppc_free_pgtable_radix() on gp-\u003eshadow_pgtable, and kvmhv_flush_nested()/kvmhv_put_nested() refcount writes. With a reclaimed object, these become host-kernel write and free primitives the guest controls.\nA:H - Using the freed kvm_nested_guest in the host can oops or panic the L0 host kernel, taking down every guest on the machine. The L1 can trigger it again at will."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-19T09:16:54.747Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/4d8f7b1f586375df8bce23a0909566ad5e852259"
        },
        {
          "url": "https://git.kernel.org/stable/c/e37fba1ba69385cff2d0e60b371ee19e7d1852d1"
        },
        {
          "url": "https://git.kernel.org/stable/c/24b634852413229bb8340d908b115c3365f3a247"
        },
        {
          "url": "https://git.kernel.org/stable/c/fbf69b7d0555ee83c871f58750770f74b7179ad1"
        },
        {
          "url": "https://git.kernel.org/stable/c/ec2d7a52b3996ae81131617b4afc0af31583c1b4"
        },
        {
          "url": "https://git.kernel.org/stable/c/51938dfa8a51a4f85328413fca9b6e21f9d2d088"
        }
      ],
      "title": "KVM: PPC: Book3S HV: fix use-after-free in kvmhv_emulate_tlbie_all_lpid()",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-98283",
    "datePublished": "2026-10-06T08:45:44.593Z",
    "dateReserved": "2026-09-25T10:25:14.335Z",
    "dateUpdated": "2026-10-19T09:16:54.747Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…