CVE-2026-53145 (GCVE-0-2026-53145)
Vulnerability from cvelistv5
Published
2026-06-25 08:38
Modified
2026-08-05 12:33
Summary
In the Linux kernel, the following vulnerability has been resolved: drm/gem: Try to fix change_handle ioctl, attempt 4 [airlied: just added some comments on how to reenable] On-list because the cat is out of the bag and we're clearly not good enough to figure this out in private. The story thus far: 5e28b7b94408 ("drm: Set old handle to NULL before prime swap in change_handle") tried to fix a race condition between the gem_close and gem_change_handle ioctls, but got a few things wrong: - There's a confusion with the local variable handle, which is actually the new handle, and so the two-stage trick was actually applied to the wrong idr slot. 7164d78559b0 ("drm/gem: fix race between change_handle and handle_delete") tried to fix that by adding yet another code block, but forgot to add the error handling. Which meant we now have two paths, both kinda wrong. - dc366607c41c ("drm: Replace old pointer to new idr") tried to apply another fix, but inconsistently, again because of the handle confusion - this would be the right fix (kinda, somewhat, it's a mess) if we'd do the two-stage approach for the new handle. Except that wasn't the intent of the original fix. We also didn't have an igt merged for the original ioctl, which is a big no-go. This was attempted to address off-list in the original bugfix, and amd QA people claimed the bug was fixed now. Very clearly that's not the case. Here's my attempt to sort this out: - Rename the local variable to new_handle, the old aliasing with args->handle is just too dangerously confusing. - Merge the gem obj lookup with the two-stage idr_replace so that we avoid getting ourselves confused there. - This means we don't have a surplus temporary reference anymore, only an inherited from the idr. A concurrent gem_close on the new_handle could steal that. Fix that with the same two-stage approach create_tail uses. This is a bit overkill as documented in the comment, but I also don't trust my ability to understand this all correctly, so go with the established pattern we have from other ioctls instead for maximum paranoia. - Adjust error paths. I've tried to make the error and success paths common, because they are identical except for which handle is removed and on which we call idr_replace to (re)install the object again. But that made things messier to read, so I've left it at the more verbose version, which unfortunately hides the symmetry in the entire code flow a bit. - While at it, also replace the 7 space indent with 1 tab. And finally, because I flat out don't trust my abilities here at all anymore: - Disable the ioctl until we have the igt situation and everything else sorted out on-list and with full consensus. v2: Sashiko noticed that I didn't handle the error path for idr_replace correctly, it must be checked with IS_ERR_OR_NULL like in gem_handle_delete. So yeah, definitely should just the existing paths 1:1 because this is endless amounts of tricky. Also add the Fixes: line for the original ioctl, I forgot that too.
Impacted products
Vendor Product Version
Linux Linux Version: 672464dd53231509c9c771110798c56d4660e19e
Version: 61bd96d3e5472c253f9c1ab77608f0c8aaa9d025
Version: 5e28b7b94408897e41c63477aabc9e1db439bc8c
Version: 318b995cffcfcaa69a234d28123a3f4ae186a9df
Version: 38f12d0e10d83b66fa1466400d876a3a8da31542
Version: 0dfa42cfe4dbe114533480503934f43e33c1e83d
Version: cde2c9257cbe8463b9dcf7b1075177b72b5fd938
Create a notification for this product.
   Linux Linux Version: 6.18.32   
Version: 7.0.9   
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "adp": [
      {
        "affected": [
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:10"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel",
            "product": "Red Hat Enterprise Linux 10",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:6"
            ],
            "defaultStatus": "unknown",
            "packageName": "kernel",
            "product": "Red Hat Enterprise Linux 6",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:7"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel",
            "product": "Red Hat Enterprise Linux 7",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:7"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel-rt",
            "product": "Red Hat Enterprise Linux 7",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:8"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel",
            "product": "Red Hat Enterprise Linux 8",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:8"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel-rt",
            "product": "Red Hat Enterprise Linux 8",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:9"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel",
            "product": "Red Hat Enterprise Linux 9",
            "vendor": "Red Hat"
          },
          {
            "collectionURL": "https://access.redhat.com/downloads/content/package-browser/",
            "cpes": [
              "cpe:/o:redhat:enterprise_linux:9"
            ],
            "defaultStatus": "affected",
            "packageName": "kernel-rt",
            "product": "Red Hat Enterprise Linux 9",
            "vendor": "Red Hat"
          }
        ],
        "datePublic": "2026-06-25T00:00:00.000Z",
        "descriptions": [
          {
            "lang": "en",
            "value": "A flaw was found in the Linux kernel\u0027s Direct Rendering Manager (DRM) Graphics Execution Manager (GEM) subsystem. A race condition exists within the `change_handle` ioctl between `gem_close` and `gem_change_handle` operations. This could lead to incorrect handling of graphics memory, potentially resulting in system instability or unexpected behavior. The `change_handle` ioctl has been temporarily disabled to mitigate this issue."
          }
        ],
        "metrics": [
          {
            "other": {
              "content": {
                "namespace": "https://access.redhat.com/security/updates/classification/",
                "value": "Important"
              },
              "type": "Red Hat severity rating"
            }
          },
          {
            "cvssV3_1": {
              "attackComplexity": "HIGH",
              "attackVector": "LOCAL",
              "availabilityImpact": "HIGH",
              "baseScore": 7,
              "baseSeverity": "HIGH",
              "confidentialityImpact": "HIGH",
              "integrityImpact": "HIGH",
              "privilegesRequired": "LOW",
              "scope": "UNCHANGED",
              "userInteraction": "NONE",
              "vectorString": "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H",
              "version": "3.1"
            },
            "format": "CVSS"
          }
        ],
        "problemTypes": [
          {
            "descriptions": [
              {
                "cweId": "CWE-367",
                "description": "Time-of-check Time-of-use (TOCTOU) Race Condition",
                "lang": "en",
                "type": "CWE"
              }
            ]
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2026-07-15T00:44:51.168Z",
          "orgId": "0b0ca135-0b70-47e7-9f44-1890c2a1c46c",
          "shortName": "redhat-SADP"
        },
        "references": [
          {
            "tags": [
              "vdb-entry",
              "x_refsource_REDHAT"
            ],
            "url": "https://access.redhat.com/security/cve/CVE-2026-53145"
          },
          {
            "name": "RHBZ#2492773",
            "tags": [
              "issue-tracking",
              "x_refsource_REDHAT"
            ],
            "url": "https://bugzilla.redhat.com/show_bug.cgi?id=2492773"
          },
          {
            "tags": [
              "x_sadp-csaf-vex"
            ],
            "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-53145.json"
          }
        ],
        "timeline": [
          {
            "lang": "en",
            "time": "2026-06-25T00:00:00.000Z",
            "value": "Reported to Red Hat."
          },
          {
            "lang": "en",
            "time": "2026-06-25T00:00:00.000Z",
            "value": "Made public."
          }
        ],
        "title": "kernel: drm/gem: Try to fix change_handle ioctl, attempt 4",
        "x_adpType": "supplier",
        "x_generator": {
          "engine": "sadp-cli 1.0.0"
        }
      }
    ],
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/gpu/drm/drm_gem.c",
            "drivers/gpu/drm/drm_ioctl.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "c0639ede2f24ac224b2079cd35ecd5fd8ad4e3cd",
              "status": "affected",
              "version": "672464dd53231509c9c771110798c56d4660e19e",
              "versionType": "git"
            },
            {
              "lessThan": "1d9b93df7fc768228906e24220591ec1cddad391",
              "status": "affected",
              "version": "61bd96d3e5472c253f9c1ab77608f0c8aaa9d025",
              "versionType": "git"
            },
            {
              "lessThan": "1a4f03d22fb655e5f192244fb2c87d8066fcfca2",
              "status": "affected",
              "version": "5e28b7b94408897e41c63477aabc9e1db439bc8c",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "318b995cffcfcaa69a234d28123a3f4ae186a9df",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "38f12d0e10d83b66fa1466400d876a3a8da31542",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "0dfa42cfe4dbe114533480503934f43e33c1e83d",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "cde2c9257cbe8463b9dcf7b1075177b72b5fd938",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/gpu/drm/drm_gem.c",
            "drivers/gpu/drm/drm_ioctl.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "6.18.36",
              "status": "affected",
              "version": "6.18.32",
              "versionType": "semver"
            },
            {
              "lessThan": "7.0.13",
              "status": "affected",
              "version": "7.0.9",
              "versionType": "semver"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.36",
                  "versionStartIncluding": "6.18.32",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.0.13",
                  "versionStartIncluding": "7.0.9",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\ndrm/gem: Try to fix change_handle ioctl, attempt 4\n\n[airlied: just added some comments on how to reenable]\nOn-list because the cat is out of the bag and we\u0027re clearly not good\nenough to figure this out in private. The story thus far:\n\n5e28b7b94408 (\"drm: Set old handle to NULL before prime swap in\nchange_handle\") tried to fix a race condition between the gem_close and\ngem_change_handle ioctls, but got a few things wrong:\n\n- There\u0027s a confusion with the local variable handle, which is actually\n  the new handle, and so the two-stage trick was actually applied to the\n  wrong idr slot. 7164d78559b0 (\"drm/gem: fix race between\n  change_handle and handle_delete\") tried to fix that by adding yet\n  another code block, but forgot to add the error handling. Which meant\n  we now have two paths, both kinda wrong.\n\n- dc366607c41c (\"drm: Replace old pointer to new idr\") tried to apply\n  another fix, but inconsistently, again because of the handle confusion\n  - this would be the right fix (kinda, somewhat, it\u0027s a mess) if we\u0027d\n  do the two-stage approach for the new handle. Except that wasn\u0027t the\n  intent of the original fix.\n\nWe also didn\u0027t have an igt merged for the original ioctl, which is a big\nno-go. This was attempted to address off-list in the original bugfix,\nand amd QA people claimed the bug was fixed now. Very clearly that\u0027s not\nthe case. Here\u0027s my attempt to sort this out:\n\n- Rename the local variable to new_handle, the old aliasing with\n  args-\u003ehandle is just too dangerously confusing.\n\n- Merge the gem obj lookup with the two-stage idr_replace so that we\n  avoid getting ourselves confused there.\n\n- This means we don\u0027t have a surplus temporary reference anymore, only\n  an inherited from the idr. A concurrent gem_close on the new_handle\n  could steal that. Fix that with the same two-stage approach\n  create_tail uses. This is a bit overkill as documented in the comment,\n  but I also don\u0027t trust my ability to understand this all correctly, so\n  go with the established pattern we have from other ioctls instead for\n  maximum paranoia.\n\n- Adjust error paths. I\u0027ve tried to make the error and success paths\n  common, because they are identical except for which handle is removed\n  and on which we call idr_replace to (re)install the object again. But\n  that made things messier to read, so I\u0027ve left it at the more verbose\n  version, which unfortunately hides the symmetry in the entire code\n  flow a bit.\n\n- While at it, also replace the 7 space indent with 1 tab.\n\nAnd finally, because I flat out don\u0027t trust my abilities here at all\nanymore:\n\n- Disable the ioctl until we have the igt situation and everything else\n  sorted out on-list and with full consensus.\n\nv2:\n\nSashiko noticed that I didn\u0027t handle the error path for idr_replace\ncorrectly, it must be checked with IS_ERR_OR_NULL like in\ngem_handle_delete. So yeah, definitely should just the existing paths\n1:1 because this is endless amounts of tricky.\n\nAlso add the Fixes: line for the original ioctl, I forgot that too."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - The vulnerable code is reached through the local DRM core ioctl DRM_IOCTL_GEM_CHANGE_HANDLE on a DRM device file, not through network or physical input. Render nodes expose this ioctl path to local userspace.\nAC:L - The bug is a race between GEM_CHANGE_HANDLE and GEM_CLOSE on attacker-controlled handles, and the attacker can drive both sides with concurrent ioctl calls. Repetition and handle selection are under attacker control.\nPR:L - The ioctl was registered with DRM_RENDER_ALLOW, so it does not require DRM master, authentication, or CAP_SYS_ADMIN on a render node. It requires local unprivileged access to the DRM device file.\nUI:N - No victim action is required after the attacker has local execution and device access. The attacker triggers the race directly with ioctl calls.\nS:U - The impact remains within the kernel security authority of the same host. This is not a VM escape, IOMMU bypass, or cross-scope boundary violation.\nC:H - The race can leave a dangling GEM object pointer in the per-file IDR, producing a use-after-free. Under the required kernel guidance, UAF memory corruption is scored as high confidentiality impact.\nI:H - The dangling drm_gem_object can be reused and later dereferenced through driver callbacks, making function pointer hijack or arbitrary kernel write/code execution defensible. Under the required kernel guidance, UAF is high integrity impact.\nA:H - The UAF and handle-count corruption can trigger kernel warnings, crashes, or panics through later GEM close/lookup paths. Kernel crash availability impact is high."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-05T12:33:28.496Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/c0639ede2f24ac224b2079cd35ecd5fd8ad4e3cd"
        },
        {
          "url": "https://git.kernel.org/stable/c/1d9b93df7fc768228906e24220591ec1cddad391"
        },
        {
          "url": "https://git.kernel.org/stable/c/1a4f03d22fb655e5f192244fb2c87d8066fcfca2"
        }
      ],
      "title": "drm/gem: Try to fix change_handle ioctl, attempt 4",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-53145",
    "datePublished": "2026-06-25T08:38:32.228Z",
    "dateReserved": "2026-06-09T07:44:35.387Z",
    "dateUpdated": "2026-08-05T12:33:28.496Z",
    "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…