Message ID | 20250213153615.3642515-1-qperret@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | KVM: arm64: Fix alignment of kvm_hyp_memcache allocations | expand |
On Thu, 13 Feb 2025 15:36:14 +0000, Quentin Perret wrote: > When allocating guest stage-2 page-table pages at EL2, pKVM can consume > pages from the host-provided kvm_hyp_memcache. As pgtable.c expects > zeroed pages, guest_s2_zalloc_page() actively implements this zeroing > with a PAGE_SIZE memset. Unfortunately, we don't check the page > alignment of the host-provided address before doing so, which could > lead to the memset overrunning the page if the host was malicious. > > [...] Applied to fixes, thanks! [1/1] KVM: arm64: Fix alignment of kvm_hyp_memcache allocations commit: b938731ed2d4eea8e268a27bfc600581fedae2a9 Cheers, M.
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 7cfa024de4e3..d9db6dfbad09 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -100,7 +100,7 @@ static inline void push_hyp_memcache(struct kvm_hyp_memcache *mc, static inline void *pop_hyp_memcache(struct kvm_hyp_memcache *mc, void *(*to_va)(phys_addr_t phys)) { - phys_addr_t *p = to_va(mc->head); + phys_addr_t *p = to_va(mc->head & PAGE_MASK); if (!mc->nr_pages) return NULL;
When allocating guest stage-2 page-table pages at EL2, pKVM can consume pages from the host-provided kvm_hyp_memcache. As pgtable.c expects zeroed pages, guest_s2_zalloc_page() actively implements this zeroing with a PAGE_SIZE memset. Unfortunately, we don't check the page alignment of the host-provided address before doing so, which could lead to the memset overrunning the page if the host was malicious. Fix this by simply force-aligning all kvm_hyp_memcache allocations to page boundaries. Fixes: 60dfe093ec13 ("KVM: arm64: Instantiate guest stage-2 page-tables at EL2") Reported-by: Ben Simner <ben.simner@cl.cam.ac.uk> Signed-off-by: Quentin Perret <qperret@google.com> --- arch/arm64/include/asm/kvm_host.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)