RustSec logo

History ⋅ Edit ⋅ JSON (OSV)

RUSTSEC-2026-0485

enter_l2_vcpu passes the wrong RCX operand to TDG.VP.ENTER

Reported
Issued
Package
tdx-guest (crates.io)
Type
Vulnerability
Categories
Keywords
#tdx #tdcall #l2-vm #confidential-computing
Aliases
References
CVSS Score
4.6 MEDIUM
CVSS Details
Attack Complexity
Low
Attack Requirements
None
Attack Vector
Local
Privileges Required
High
Availability Impact to the Subsequent System
None
Confidentiality Impact to the Subsequent System
None
Integrity Impact to the Subsequent System
None
User Interaction
None
Availability Impact to the Vulnerable System
Low
Confidentiality Impact to the Vulnerable System
Low
Integrity Impact to the Vulnerable System
Low
CVSS Vector
CVSS:4.0/AV:L/AC:L/AT:N/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N
Patched
  • >=0.3.1
Unaffected
  • <0.1.8
Affected Functions
Version
tdx_guest::tdcall::enter_l2_vcpu
  • >=0.1.8, <0.3.1

Description

tdx_guest::tdcall::enter_l2_vcpu() invokes the TDG.VP.ENTER TDCALL. RCX must carry the L2 VM index in bits 53:52 and the invalidation control value (InvdTranslations, 0 to 3) in bits 1:0. The function computed that value as (l2_vm_idx << 52) | (invd_translations as u64), but then passed the raw l2_vm_idx in RCX instead.

As a result, the TDX module received an operand that differs from the caller's request. The VM index field was 0, and the low bits of the index were interpreted as the invalidation control value. For example, VM 1 with InvdTlb (2) should produce 0x0010_0000_0000_0002, but produced 0x1.

Intel describes the issue as an incorrect calculation and classifies it as escalation of privilege, with a CVSS 4.0 base score of 4.6, in INTEL-SA-01462.

The flaw was corrected in commit 311d33b, released in 0.3.1, which passes the computed RCX value.

Reported by Borys Tsyrulnikov.

Advisory available under CC0-1.0 license.