{"api_version":"1","generated_at":"2026-08-22T02:51:10+00:00","cve":"CVE-2026-74446","urls":{"html":"https://cve.report/CVE-2026-74446","api":"https://cve.report/api/cve/CVE-2026-74446.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-74446","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-74446"},"summary":{"title":"drm/amdkfd: hold event_mutex while checkpointing CRIU events","description":"In the Linux kernel, the following vulnerability has been resolved:\n\ndrm/amdkfd: hold event_mutex while checkpointing CRIU events\n\nkfd_criu_checkpoint_events() counts the entries in p->event_idr via\nkfd_get_num_events(), allocates an array sized to that count, and then\nwalks the same IDR to fill it. Neither the count nor the walk holds\np->event_mutex.\n\nThe CRIU checkpoint caller holds only p->mutex. Event create and destroy\n(kfd_event_create()/kfd_event_destroy()) take p->event_mutex and do not\ntake p->mutex, so a second thread in the same process can insert or remove\nevents between the count and the walk. If an event is inserted, the walk\niterates more entries than were counted and writes past the end of the\nev_privs allocation; if an event is removed, the walk dereferences an\nentry that is being freed.\n\nHold p->event_mutex across the count and the walk so both observe a\nconsistent view of p->event_idr. The lock is released before\ncopy_to_user(), which only touches the local buffer. The caller already\nholds p->mutex and the create/destroy paths never take p->mutex, so the\np->mutex -> p->event_mutex order is not inverted and no deadlock is\nintroduced.\n\n(cherry picked from commit ff57e223ab105795b05d3ef3f3c35a5a441bcbaa)","state":"PUBLISHED","assigner":"Linux","published_at":"2026-08-15 13:17:49","updated_at":"2026-08-19 17:21:01"},"problem_types":[],"metrics":[{"version":"3.1","source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"}},{"version":"3.1","source":"CNA","type":"DECLARED","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"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"}}],"references":[{"url":"https://git.kernel.org/stable/c/ff8bc5a68a9a70bdc38d61a72c7a49c56063f9d2","name":"https://git.kernel.org/stable/c/ff8bc5a68a9a70bdc38d61a72c7a49c56063f9d2","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/bed80be08c0bee47fa242a4256ac873477c815f8","name":"https://git.kernel.org/stable/c/bed80be08c0bee47fa242a4256ac873477c815f8","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/6a52f48157fa7fb81e0c146937fd6c8b0c1cfdbd","name":"https://git.kernel.org/stable/c/6a52f48157fa7fb81e0c146937fd6c8b0c1cfdbd","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/9a7f765985f64fd4a7a58f7bc9cd80a1f4230628","name":"https://git.kernel.org/stable/c/9a7f765985f64fd4a7a58f7bc9cd80a1f4230628","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/2040b7e39027cb83bb8c7b84a4c95c2f6053c32f","name":"https://git.kernel.org/stable/c/2040b7e39027cb83bb8c7b84a4c95c2f6053c32f","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/8f7196f25b14f4290738639a50459b56a5ff2784","name":"https://git.kernel.org/stable/c/8f7196f25b14f4290738639a50459b56a5ff2784","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-74446","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-74446","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 8f7196f25b14f4290738639a50459b56a5ff2784 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 2040b7e39027cb83bb8c7b84a4c95c2f6053c32f git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 9a7f765985f64fd4a7a58f7bc9cd80a1f4230628 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 6a52f48157fa7fb81e0c146937fd6c8b0c1cfdbd git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 bed80be08c0bee47fa242a4256ac873477c815f8 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 40e8a766a761f7fdc8530347527b344fddf6f1a8 ff8bc5a68a9a70bdc38d61a72c7a49c56063f9d2 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 5.18","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 5.18 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.1.183 6.1.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.6.151 6.6.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.12.103 6.12.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.18.44 6.18.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.1.8 7.1.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":{"cve_year":"2026","cve_id":"74446","cve":"CVE-2026-74446","epss":"0.001290000","percentile":"0.029440000","score_date":"2026-08-19","updated_at":"2026-08-20 00:13:09"},"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["drivers/gpu/drm/amd/amdkfd/kfd_events.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"8f7196f25b14f4290738639a50459b56a5ff2784","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"},{"lessThan":"2040b7e39027cb83bb8c7b84a4c95c2f6053c32f","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"},{"lessThan":"9a7f765985f64fd4a7a58f7bc9cd80a1f4230628","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"},{"lessThan":"6a52f48157fa7fb81e0c146937fd6c8b0c1cfdbd","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"},{"lessThan":"bed80be08c0bee47fa242a4256ac873477c815f8","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"},{"lessThan":"ff8bc5a68a9a70bdc38d61a72c7a49c56063f9d2","status":"affected","version":"40e8a766a761f7fdc8530347527b344fddf6f1a8","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["drivers/gpu/drm/amd/amdkfd/kfd_events.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"5.18"},{"lessThan":"5.18","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"6.1.*","status":"unaffected","version":"6.1.183","versionType":"semver"},{"lessThanOrEqual":"6.6.*","status":"unaffected","version":"6.6.151","versionType":"semver"},{"lessThanOrEqual":"6.12.*","status":"unaffected","version":"6.12.103","versionType":"semver"},{"lessThanOrEqual":"6.18.*","status":"unaffected","version":"6.18.44","versionType":"semver"},{"lessThanOrEqual":"7.1.*","status":"unaffected","version":"7.1.8","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.2","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.1.183","versionStartIncluding":"5.18","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.6.151","versionStartIncluding":"5.18","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.12.103","versionStartIncluding":"5.18","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.18.44","versionStartIncluding":"5.18","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.1.8","versionStartIncluding":"5.18","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2","versionStartIncluding":"5.18","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\ndrm/amdkfd: hold event_mutex while checkpointing CRIU events\n\nkfd_criu_checkpoint_events() counts the entries in p->event_idr via\nkfd_get_num_events(), allocates an array sized to that count, and then\nwalks the same IDR to fill it. Neither the count nor the walk holds\np->event_mutex.\n\nThe CRIU checkpoint caller holds only p->mutex. Event create and destroy\n(kfd_event_create()/kfd_event_destroy()) take p->event_mutex and do not\ntake p->mutex, so a second thread in the same process can insert or remove\nevents between the count and the walk. If an event is inserted, the walk\niterates more entries than were counted and writes past the end of the\nev_privs allocation; if an event is removed, the walk dereferences an\nentry that is being freed.\n\nHold p->event_mutex across the count and the walk so both observe a\nconsistent view of p->event_idr. The lock is released before\ncopy_to_user(), which only touches the local buffer. The caller already\nholds p->mutex and the create/destroy paths never take p->mutex, so the\np->mutex -> p->event_mutex order is not inverted and no deadlock is\nintroduced.\n\n(cherry picked from commit ff57e223ab105795b05d3ef3f3c35a5a441bcbaa)"}],"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 bug is reached only through AMDKFD_IOC_CRIU_OP_CHECKPOINT on /dev/kfd, a local character-device ioctl in the amdgpu/amdkfd GPU compute stack, not via any network-facing kernel service.\nAC:L - Exploitation needs a race between CRIU checkpoint and concurrent event create/destroy in the same KFD process; the attacker controls both threads and can repeat the ioctl and event churn until the TOCTOU window is hit reliably.\nPR:L - CRIU checkpoint requires CAP_CHECKPOINT_RESTORE or CAP_SYS_ADMIN, both obtainable by an unprivileged user via a user namespace (same model as other namespace-granted caps); GPU tenant access to /dev/kfd on ROCm/HPC nodes is sufficient.\nUI:N - No victim interaction is required beyond the attacker opening /dev/kfd and driving CRIU checkpoint and event ioctls from their own process threads.\nS:U - Impact is kernel heap corruption and privilege escalation within the host kernel security domain; it does not cross a guest/host or IOMMU/DMA trust boundary on its own.\nC:H - Concurrent event removal causes the checkpoint walk to dereference kfd_event objects being freed (UAF), and OOB writes of 64-byte kfd_criu_event_priv_data entries can corrupt adjacent kernel memory to leak data.\nI:H - If events are inserted between kfd_get_num_events() and the IDR walk, the checkpoint loop writes past the end of the kvzalloc ev_privs buffer, enabling heap overflow and control of freed-object contents for arbitrary write primitives.\nA:H - The UAF and heap out-of-bounds write can trigger kernel oops/panic during checkpoint or corrupt critical kernel structures, causing denial of service or system crash."}]}],"providerMetadata":{"dateUpdated":"2026-08-19T16:36:41.097Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/8f7196f25b14f4290738639a50459b56a5ff2784"},{"url":"https://git.kernel.org/stable/c/2040b7e39027cb83bb8c7b84a4c95c2f6053c32f"},{"url":"https://git.kernel.org/stable/c/9a7f765985f64fd4a7a58f7bc9cd80a1f4230628"},{"url":"https://git.kernel.org/stable/c/6a52f48157fa7fb81e0c146937fd6c8b0c1cfdbd"},{"url":"https://git.kernel.org/stable/c/bed80be08c0bee47fa242a4256ac873477c815f8"},{"url":"https://git.kernel.org/stable/c/ff8bc5a68a9a70bdc38d61a72c7a49c56063f9d2"}],"title":"drm/amdkfd: hold event_mutex while checkpointing CRIU events","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-74446","datePublished":"2026-08-15T12:26:52.677Z","dateReserved":"2026-08-15T05:44:03.898Z","dateUpdated":"2026-08-19T16:36:41.097Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-08-15 13:17:49","lastModifiedDate":"2026-08-19 17:21:01","problem_types":[],"metrics":{"cvssMetricV31":[{"source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","cvssData":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"},"exploitabilityScore":1.8,"impactScore":5.9}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"74446","Ordinal":"1","Title":"drm/amdkfd: hold event_mutex while checkpointing CRIU events","CVE":"CVE-2026-74446","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"74446","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\ndrm/amdkfd: hold event_mutex while checkpointing CRIU events\n\nkfd_criu_checkpoint_events() counts the entries in p->event_idr via\nkfd_get_num_events(), allocates an array sized to that count, and then\nwalks the same IDR to fill it. Neither the count nor the walk holds\np->event_mutex.\n\nThe CRIU checkpoint caller holds only p->mutex. Event create and destroy\n(kfd_event_create()/kfd_event_destroy()) take p->event_mutex and do not\ntake p->mutex, so a second thread in the same process can insert or remove\nevents between the count and the walk. If an event is inserted, the walk\niterates more entries than were counted and writes past the end of the\nev_privs allocation; if an event is removed, the walk dereferences an\nentry that is being freed.\n\nHold p->event_mutex across the count and the walk so both observe a\nconsistent view of p->event_idr. The lock is released before\ncopy_to_user(), which only touches the local buffer. The caller already\nholds p->mutex and the create/destroy paths never take p->mutex, so the\np->mutex -> p->event_mutex order is not inverted and no deadlock is\nintroduced.\n\n(cherry picked from commit ff57e223ab105795b05d3ef3f3c35a5a441bcbaa)","Type":"Description","Title":"drm/amdkfd: hold event_mutex while checkpointing CRIU events"}]}}}