CVE-2021-47094

HIGHNVD 7.17.1
EchelonGraph scoreMEDIUM confidence

Score 7.1 from GitHub Security Advisory (severity: HIGH) published 2024-03-04. NVD baseline CVSS 7.1; sources differ by 0.0.

Triggered by: GitHub Security Advisory CVSS
Sources: epss, ghsa, nvd
Trending — 3 sources updated this week
7.1EG
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS PROB: 0%CVSS: 7.1Exploit: None knownExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

In the Linux kernel, the following vulnerability has been resolved:

KVM: x86/mmu: Don't advance iterator after restart due to yielding

After dropping mmu_lock in the TDP MMU, restart the iterator during tdp_iter_next() and do not advance the iterator. Advancing the iterator results in skipping the top-level SPTE and all its children, which is fatal if any of the skipped SPTEs were not visited before yielding.

When zapping all SPTEs, i.e. when min_level == root_level, restarting the iter and then invoking tdp_iter_next() is always fatal if the current gfn has as a valid SPTE, as advancing the iterator results in try_step_side() skipping the current gfn, which wasn't visited before yielding.

Sprinkle WARNs on iter->yielded being true in various helpers that are often used in conjunction with yielding, and tag the helper with __must_check to reduce the probabily of improper usage.

Failing to zap a top-level SPTE manifests in one of two ways. If a valid SPTE is skipped by both kvm_tdp_mmu_zap_all() and kvm_tdp_mmu_put_root(), the shadow page will be leaked and KVM will WARN accordingly.

WARNING: CPU: 1 PID: 3509 at arch/x86/kvm/mmu/tdp_mmu.c:46 [kvm] RIP: 0010:kvm_mmu_uninit_tdp_mmu+0x3e/0x50 [kvm] Call Trace: kvm_arch_destroy_vm+0x130/0x1b0 [kvm] kvm_destroy_vm+0x162/0x2a0 [kvm] kvm_vcpu_release+0x34/0x60 [kvm] __fput+0x82/0x240 task_work_run+0x5c/0x90 do_exit+0x364/0xa10 ? futex_unqueue+0x38/0x60 do_group_exit+0x33/0xa0 get_signal+0x155/0x850 arch_do_signal_or_restart+0xed/0x750 exit_to_user_mode_prepare+0xc5/0x120 syscall_exit_to_user_mode+0x1d/0x40 do_syscall_64+0x48/0xc0 entry_SYSCALL_64_after_hwframe+0x44/0xae

If kvm_tdp_mmu_zap_all() skips a gfn/SPTE but that SPTE is then zapped by kvm_tdp_mmu_put_root(), KVM triggers a use-after-free in the form of marking a struct page as dirty/accessed after it has been put back on the free list. This directly triggers a WARN due to encountering a page with page_count() == 0, but it can also lead to data corruption and additional errors in the kernel.

WARNING: CPU: 7 PID: 1995658 at arch/x86/kvm/../../../virt/kvm/kvm_main.c:171 RIP: 0010:kvm_is_zone_device_pfn.part.0+0x9e/0xd0 [kvm] Call Trace: kvm_set_pfn_dirty+0x120/0x1d0 [kvm] __handle_changed_spte+0x92e/0xca0 [kvm] __handle_changed_spte+0x63c/0xca0 [kvm] __handle_changed_spte+0x63c/0xca0 [kvm] __handle_changed_spte+0x63c/0xca0 [kvm] zap_gfn_range+0x549/0x620 [kvm] kvm_tdp_mmu_put_root+0x1b6/0x270 [kvm] mmu_free_root_page+0x219/0x2c0 [kvm] kvm_mmu_free_roots+0x1b4/0x4e0 [kvm] kvm_mmu_unload+0x1c/0xa0 [kvm] kvm_arch_destroy_vm+0x1f2/0x5c0 [kvm] kvm_put_kvm+0x3b1/0x8b0 [kvm] kvm_vcpu_release+0x4e/0x70 [kvm] __fput+0x1f7/0x8c0 task_work_run+0xf8/0x1a0 do_exit+0x97b/0x2230 do_group_exit+0xda/0x2a0 get_signal+0x3be/0x1e50 arch_do_signal_or_restart+0x244/0x17f0 exit_to_user_mode_prepare+0xcb/0x120 syscall_exit_to_user_mode+0x1d/0x40 do_syscall_64+0x4d/0x90 entry_SYSCALL_64_after_hwframe+0x44/0xae

Note, the underlying bug existed even before commit 1af4a96025b3 ("KVM: x86/mmu: Yield in TDU MMU iter even if no SPTES changed") moved calls to tdp_mmu_iter_cond_resched() to the beginning of loops, as KVM could still incorrectly advance past a top-level entry when yielding on a lower-level entry. But with respect to leaking shadow pages, the bug was introduced by yielding before processing the current gfn.

Alternatively, tdp_mmu_iter_cond_resched() could simply fall through, or callers could jump to their "retry" label. The downside of that approach is that tdp_mmu_iter_cond_resched() _must_ be called before anything else in the loop, and there's no easy way to enfornce that requirement.

Ideally, KVM would handling the cond_resched() fully within the iterator macro (the code is actually quite clean) and avoid this entire class of bugs, but that is extremely difficult do wh ---truncated---

CVSS v3
7.1
EG Score
7.1(medium)
EG Risk
32(Track)
EG Risk 32/100SSVC: Track

EG Risk is EchelonGraph's 0–100 priority score: it fuses intrinsic severity with real-world exploitation and automatability so you can rank equal-severity CVEs and fix the most dangerous first. Higher = act sooner. Distinct from the 0–10 EG Score (severity).

How it’s computed
Severity71% × 45%
Exploitation0% × 40%
Automatability0% × 15%
Action: Routine — remediate on your standard cadence.
EPSS PROB
0%
EPSS %ILE
12%
KEV
Not listed

Published

March 4, 2024

Last Modified

August 5, 2026

Advisory Details (2)

Auto-updated Aug 5, 2026
No patch confirmed yet.
generic

KVM: x86/mmu: Don't advance iterator after restart due to yielding - kernel/git/stable/linux.git - Linux kernel stable tree

https://git.kernel.org/stable/c/3a0f64de479cae75effb630a2e0a237ca0d0623c
generic

KVM: x86/mmu: Don't advance iterator after restart due to yielding - kernel/git/stable/linux.git - Linux kernel stable tree

https://git.kernel.org/stable/c/d884eefd75cc54887bc2e9e724207443525dfb2c

Data Freshness Timeline

(refreshed 13× in last 7d / 46× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

Showing the most recent 100 of 125 total refreshes for this CVE.

  1. 2026-08-07 16:24 UTCEPSS rescore
  2. 2026-08-06 13:44 UTCEPSS rescore
  3. 2026-08-05 19:15 UTCEPSS rescore
  4. 2026-08-05 09:43 UTCEG score recompute
  5. 2026-08-05 09:43 UTCGHSA enrichment
  6. 2026-08-04 15:06 UTCEPSS rescore
  7. 2026-08-04 12:21 UTCEG score recompute
  8. 2026-08-04 12:21 UTCGHSA enrichment
  9. 2026-08-04 10:34 UTCEPSS rescore
  10. 2026-08-04 09:53 UTCEG score recompute
  11. 2026-08-04 09:53 UTCGHSA enrichment
  12. 2026-08-03 10:33 UTCEPSS rescore
  13. 2026-08-02 02:24 UTCEPSS rescore
  14. 2026-08-01 11:06 UTCOSV refresh
  15. 2026-08-01 04:13 UTCEPSS rescore
  16. 2026-07-30 16:25 UTCEPSS rescore
  17. 2026-07-30 01:28 UTCEPSS rescore
  18. 2026-07-28 15:33 UTCEPSS rescore
  19. 2026-07-26 14:52 UTCEPSS rescore
  20. 2026-07-25 14:15 UTCEPSS rescore
  21. 2026-07-24 14:15 UTCEPSS rescore
  22. 2026-07-24 14:15 UTCEPSS rescore
  23. 2026-07-23 14:16 UTCEPSS rescore
  24. 2026-07-23 02:06 UTCEG score recompute
  25. 2026-07-22 22:52 UTCEG score recompute
Show 75 more
  1. 2026-07-22 14:06 UTCEPSS rescore
  2. 2026-07-21 15:22 UTCEPSS rescore
  3. 2026-07-21 15:22 UTCEPSS rescore
  4. 2026-07-20 17:05 UTCEPSS rescore
  5. 2026-07-19 14:29 UTCEPSS rescore
  6. 2026-07-19 02:27 UTCEPSS rescore
  7. 2026-07-19 02:27 UTCEPSS rescore
  8. 2026-07-18 10:02 UTCEPSS rescore
  9. 2026-07-16 17:00 UTCEPSS rescore
  10. 2026-07-16 17:00 UTCEPSS rescore
  11. 2026-07-15 16:55 UTCEPSS rescore
  12. 2026-07-15 01:58 UTCEPSS rescore
  13. 2026-07-15 01:58 UTCEPSS rescore
  14. 2026-07-14 17:55 UTCOSV refresh
  15. 2026-07-13 22:27 UTCEPSS rescore
  16. 2026-07-13 06:11 UTCEPSS rescore
  17. 2026-07-13 06:11 UTCEPSS rescore
  18. 2026-07-12 05:44 UTCEPSS rescore
  19. 2026-07-11 08:25 UTCEPSS rescore
  20. 2026-07-09 19:07 UTCEPSS rescore
  21. 2026-07-09 19:07 UTCEPSS rescore
  22. 2026-07-08 15:12 UTCEPSS rescore
  23. 2026-07-08 15:12 UTCEPSS rescore
  24. 2026-07-07 13:43 UTCEPSS rescore
  25. 2026-07-06 16:25 UTCEPSS rescore
  26. 2026-07-06 16:25 UTCEPSS rescore
  27. 2026-07-06 02:21 UTCEPSS rescore
  28. 2026-07-06 02:21 UTCEPSS rescore
  29. 2026-07-05 02:28 UTCEPSS rescore
  30. 2026-07-05 02:28 UTCEPSS rescore
  31. 2026-07-04 06:29 UTCEPSS rescore
  32. 2026-07-04 06:29 UTCEPSS rescore
  33. 2026-07-01 15:04 UTCEPSS rescore
  34. 2026-06-30 23:20 UTCEPSS rescore
  35. 2026-06-29 14:04 UTCEPSS rescore
  36. 2026-06-29 14:04 UTCEPSS rescore
  37. 2026-06-28 14:05 UTCEPSS rescore
  38. 2026-06-28 04:54 UTCEPSS rescore
  39. 2026-06-28 04:54 UTCEPSS rescore
  40. 2026-06-27 03:07 UTCEPSS rescore
  41. 2026-06-27 03:06 UTCEPSS rescore
  42. 2026-06-26 18:39 UTCOSV refresh
  43. 2026-06-25 13:48 UTCEPSS rescore
  44. 2026-06-25 13:48 UTCEPSS rescore
  45. 2026-06-24 14:03 UTCEPSS rescore
  46. 2026-06-24 14:03 UTCEPSS rescore
  47. 2026-06-23 21:31 UTCEPSS rescore
  48. 2026-06-23 21:31 UTCEPSS rescore
  49. 2026-06-22 14:24 UTCEPSS rescore
  50. 2026-06-21 14:55 UTCEPSS rescore
  51. 2026-06-21 01:58 UTCEPSS rescore
  52. 2026-06-21 01:58 UTCEPSS rescore
  53. 2026-06-19 19:24 UTCEPSS rescore
  54. 2026-06-19 19:24 UTCEPSS rescore
  55. 2026-06-18 17:51 UTCEPSS rescore
  56. 2026-06-18 17:51 UTCEPSS rescore
  57. 2026-06-17 17:51 UTCEPSS rescore
  58. 2026-06-17 17:51 UTCEPSS rescore
  59. 2026-06-16 17:51 UTCEPSS rescore
  60. 2026-06-15 17:46 UTCEPSS rescore
  61. 2026-06-14 23:15 UTCEPSS rescore
  62. 2026-06-14 23:15 UTCEPSS rescore
  63. 2026-06-13 22:58 UTCEPSS rescore
  64. 2026-06-13 22:58 UTCEPSS rescore
  65. 2026-06-12 23:10 UTCEPSS rescore
  66. 2026-06-11 13:58 UTCEPSS rescore
  67. 2026-06-10 22:16 UTCEPSS rescore
  68. 2026-06-10 13:20 UTCEPSS rescore
  69. 2026-06-09 03:00 UTCOSV refresh
  70. 2026-06-08 14:15 UTCEPSS rescore
  71. 2026-06-08 14:15 UTCEPSS rescore
  72. 2026-06-08 14:15 UTCEPSS rescore
  73. 2026-06-07 15:23 UTCEPSS rescore
  74. 2026-06-07 15:23 UTCEPSS rescore
  75. 2026-06-06 13:46 UTCEPSS rescore

Frequently asked(5)

What is CVE-2021-47094?
CVE-2021-47094 is a high vulnerability published on March 4, 2024. In the Linux kernel, the following vulnerability has been resolved: KVM: x86/mmu: Don't advance iterator after restart due to yielding After dropping mmu_lock in the TDP MMU, restart the iterator during tdpiternext() and do not advance the iterator. Advancing the iterator results in skipping the…
When was CVE-2021-47094 disclosed?
CVE-2021-47094 was first published in the National Vulnerability Database on March 4, 2024, with the most recent update on August 5, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2021-47094 actively exploited?
CVE-2021-47094 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 0% probability of exploitation in the next 30 days, which ranks it in the top 87.9% of all scored CVEs.
What is the CVSS score of CVE-2021-47094?
CVE-2021-47094 has a CVSS v3 base score of 7.1 (NVD).
How do I remediate CVE-2021-47094?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2021-47094, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

Explore the affected products and dependency analysis for CVE-2021-47094

Explore →

Is Your Infrastructure Affected by CVE-2021-47094?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.