Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46515736 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Kees Cook
Browse files

kvm: whitelist struct kvm_vcpu_arch



On x86, ARM and s390, struct kvm_vcpu_arch has a usercopy region
that is read and written by the KVM_GET/SET_CPUID2 ioctls (x86)
or KVM_GET/SET_ONE_REG (ARM/s390).  Without whitelisting the area,
KVM is completely broken on those architectures with usercopy hardening
enabled.

For now, allow writing to the entire struct on all architectures.
The KVM tree will not refine this to an architecture-specific
subset of struct kvm_vcpu_arch.

Cc: kernel-hardening@lists.openwall.com
Cc: Kees Cook <keescook@chromium.org>
Cc: Christian Borntraeger <borntraeger@redhat.com>
Cc: Christoffer Dall <cdall@linaro.org>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Acked-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
parent 08626a60
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -4029,8 +4029,12 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
	/* A kmem cache lets us meet the alignment requirements of fx_save. */
	/* A kmem cache lets us meet the alignment requirements of fx_save. */
	if (!vcpu_align)
	if (!vcpu_align)
		vcpu_align = __alignof__(struct kvm_vcpu);
		vcpu_align = __alignof__(struct kvm_vcpu);
	kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align,
	kvm_vcpu_cache =
					   SLAB_ACCOUNT, NULL);
		kmem_cache_create_usercopy("kvm_vcpu", vcpu_size, vcpu_align,
					   SLAB_ACCOUNT,
					   offsetof(struct kvm_vcpu, arch),
					   sizeof_field(struct kvm_vcpu, arch),
					   NULL);
	if (!kvm_vcpu_cache) {
	if (!kvm_vcpu_cache) {
		r = -ENOMEM;
		r = -ENOMEM;
		goto out_free_3;
		goto out_free_3;