CVE-2021-47277
Severity CVSS v4.0:
Pending analysis
Type:
CWE-125
Out-of-bounds Read
Publication date:
21/05/2024
Last modified:
30/04/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
kvm: avoid speculation-based attacks from out-of-range memslot accesses<br />
<br />
KVM&#39;s mechanism for accessing guest memory translates a guest physical<br />
address (gpa) to a host virtual address using the right-shifted gpa<br />
(also known as gfn) and a struct kvm_memory_slot. The translation is<br />
performed in __gfn_to_hva_memslot using the following formula:<br />
<br />
hva = slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE<br />
<br />
It is expected that gfn falls within the boundaries of the guest&#39;s<br />
physical memory. However, a guest can access invalid physical addresses<br />
in such a way that the gfn is invalid.<br />
<br />
__gfn_to_hva_memslot is called from kvm_vcpu_gfn_to_hva_prot, which first<br />
retrieves a memslot through __gfn_to_memslot. While __gfn_to_memslot<br />
does check that the gfn falls within the boundaries of the guest&#39;s<br />
physical memory or not, a CPU can speculate the result of the check and<br />
continue execution speculatively using an illegal gfn. The speculation<br />
can result in calculating an out-of-bounds hva. If the resulting host<br />
virtual address is used to load another guest physical address, this<br />
is effectively a Spectre gadget consisting of two consecutive reads,<br />
the second of which is data dependent on the first.<br />
<br />
Right now it&#39;s not clear if there are any cases in which this is<br />
exploitable. One interesting case was reported by the original author<br />
of this patch, and involves visiting guest page tables on x86. Right<br />
now these are not vulnerable because the hva read goes through get_user(),<br />
which contains an LFENCE speculation barrier. However, there are<br />
patches in progress for x86 uaccess.h to mask kernel addresses instead of<br />
using LFENCE; once these land, a guest could use speculation to read<br />
from the VMM&#39;s ring 3 address space. Other architectures such as ARM<br />
already use the address masking method, and would be susceptible to<br />
this same kind of data-dependent access gadgets. Therefore, this patch<br />
proactively protects from these attacks by masking out-of-bounds gfns<br />
in __gfn_to_hva_memslot, which blocks speculation of invalid hvas.<br />
<br />
Sean Christopherson noted that this patch does not cover<br />
kvm_read_guest_offset_cached. This however is limited to a few bytes<br />
past the end of the cache, and therefore it is unlikely to be useful in<br />
the context of building a chain of data dependent accesses.
Impact
Base Score 3.x
7.10
Severity 3.x
HIGH
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.4.273 (excluding) | |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.5 (including) | 4.9.273 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (including) | 4.14.237 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (including) | 4.19.195 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.126 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.44 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.12.11 (excluding) |
| cpe:2.3:o:linux:linux_kernel:5.13:rc1:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.13:rc2:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.13:rc3:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.13:rc4:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.13:rc5:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/22b87fb17a28d37331bb9c1110737627b17f6781
- https://git.kernel.org/stable/c/3098b86390a6b9ea52657689f08410baf130ceff
- https://git.kernel.org/stable/c/361ce3b917aff93123e9e966d8608655c967f438
- https://git.kernel.org/stable/c/740621309b25bbf619b8a0ba5fd50a8e58989441
- https://git.kernel.org/stable/c/7af299b97734c7e7f465b42a2139ce4d77246975
- https://git.kernel.org/stable/c/bff1fbf0cf0712686f1df59a83fba6e31d2746a0
- https://git.kernel.org/stable/c/da27a83fd6cc7780fea190e1f5c19e87019da65c
- https://git.kernel.org/stable/c/ed0e2a893092c7fcb4ff7ba74e5efce53a6f5940
- https://git.kernel.org/stable/c/22b87fb17a28d37331bb9c1110737627b17f6781
- https://git.kernel.org/stable/c/3098b86390a6b9ea52657689f08410baf130ceff
- https://git.kernel.org/stable/c/361ce3b917aff93123e9e966d8608655c967f438
- https://git.kernel.org/stable/c/740621309b25bbf619b8a0ba5fd50a8e58989441
- https://git.kernel.org/stable/c/7af299b97734c7e7f465b42a2139ce4d77246975
- https://git.kernel.org/stable/c/bff1fbf0cf0712686f1df59a83fba6e31d2746a0
- https://git.kernel.org/stable/c/da27a83fd6cc7780fea190e1f5c19e87019da65c
- https://git.kernel.org/stable/c/ed0e2a893092c7fcb4ff7ba74e5efce53a6f5940



