kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP
@ 2019-08-29 12:25 Thomas Huth
  2019-08-29 12:40 ` Cornelia Huck
  2019-08-29 13:57 ` David Hildenbrand
  0 siblings, 2 replies; 4+ messages in thread
From: Thomas Huth @ 2019-08-29 12:25 UTC (permalink / raw)
  To: Christian Borntraeger, Janosch Frank, kvm
  Cc: David Hildenbrand, Cornelia Huck, Heiko Carstens, Vasily Gorbik,
	linux-s390, linux-kernel

If the KVM_S390_MEM_OP ioctl is called with an access register >= 16,
then there is certainly a bug in the calling userspace application.
We check for wrong access registers, but only if the vCPU was already
in the access register mode before (i.e. the SIE block has recorded
it). The check is also buried somewhere deep in the calling chain (in
the function ar_translation()), so this is somewhat hard to find.

It's better to always report an error to the userspace in case this
field is set wrong, and it's safer in the KVM code if we block wrong
values here early instead of relying on a check somewhere deep down
the calling chain, so let's add another check to kvm_s390_guest_mem_op()
directly.

We also should check that the "size" is non-zero here (thanks to Janosch
Frank for the hint!). If we do not check the size, we could call vmalloc()
with this 0 value, and this will cause a kernel warning.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 v2: Check mop->size to be non-zero

 arch/s390/kvm/kvm-s390.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index f329dcb3f44c..49d7722229ae 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -4255,7 +4255,7 @@ static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
 	const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
 				    | KVM_S390_MEMOP_F_CHECK_ONLY;
 
-	if (mop->flags & ~supported_flags)
+	if (mop->flags & ~supported_flags || mop->ar >= NUM_ACRS || !mop->size)
 		return -EINVAL;
 
 	if (mop->size > MEM_OP_MAX_SIZE)
-- 
2.18.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP
  2019-08-29 12:25 [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP Thomas Huth
@ 2019-08-29 12:40 ` Cornelia Huck
  2019-08-29 13:38   ` Christian Borntraeger
  2019-08-29 13:57 ` David Hildenbrand
  1 sibling, 1 reply; 4+ messages in thread
From: Cornelia Huck @ 2019-08-29 12:40 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Christian Borntraeger, Janosch Frank, kvm, David Hildenbrand,
	Heiko Carstens, Vasily Gorbik, linux-s390, linux-kernel

On Thu, 29 Aug 2019 14:25:17 +0200
Thomas Huth <thuth@redhat.com> wrote:

> If the KVM_S390_MEM_OP ioctl is called with an access register >= 16,
> then there is certainly a bug in the calling userspace application.
> We check for wrong access registers, but only if the vCPU was already
> in the access register mode before (i.e. the SIE block has recorded
> it). The check is also buried somewhere deep in the calling chain (in
> the function ar_translation()), so this is somewhat hard to find.
> 
> It's better to always report an error to the userspace in case this
> field is set wrong, and it's safer in the KVM code if we block wrong
> values here early instead of relying on a check somewhere deep down
> the calling chain, so let's add another check to kvm_s390_guest_mem_op()
> directly.
> 
> We also should check that the "size" is non-zero here (thanks to Janosch
> Frank for the hint!). If we do not check the size, we could call vmalloc()
> with this 0 value, and this will cause a kernel warning.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v2: Check mop->size to be non-zero
> 
>  arch/s390/kvm/kvm-s390.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index f329dcb3f44c..49d7722229ae 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -4255,7 +4255,7 @@ static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
>  	const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
>  				    | KVM_S390_MEMOP_F_CHECK_ONLY;
>  
> -	if (mop->flags & ~supported_flags)
> +	if (mop->flags & ~supported_flags || mop->ar >= NUM_ACRS || !mop->size)
>  		return -EINVAL;
>  
>  	if (mop->size > MEM_OP_MAX_SIZE)

Reviewed-by: Cornelia Huck <cohuck@redhat.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP
  2019-08-29 12:40 ` Cornelia Huck
@ 2019-08-29 13:38   ` Christian Borntraeger
  0 siblings, 0 replies; 4+ messages in thread
From: Christian Borntraeger @ 2019-08-29 13:38 UTC (permalink / raw)
  To: Cornelia Huck, Thomas Huth
  Cc: Janosch Frank, kvm, David Hildenbrand, Heiko Carstens,
	Vasily Gorbik, linux-s390, linux-kernel



On 29.08.19 14:40, Cornelia Huck wrote:
> On Thu, 29 Aug 2019 14:25:17 +0200
> Thomas Huth <thuth@redhat.com> wrote:
> 
>> If the KVM_S390_MEM_OP ioctl is called with an access register >= 16,
>> then there is certainly a bug in the calling userspace application.
>> We check for wrong access registers, but only if the vCPU was already
>> in the access register mode before (i.e. the SIE block has recorded
>> it). The check is also buried somewhere deep in the calling chain (in
>> the function ar_translation()), so this is somewhat hard to find.
>>
>> It's better to always report an error to the userspace in case this
>> field is set wrong, and it's safer in the KVM code if we block wrong
>> values here early instead of relying on a check somewhere deep down
>> the calling chain, so let's add another check to kvm_s390_guest_mem_op()
>> directly.
>>
>> We also should check that the "size" is non-zero here (thanks to Janosch
>> Frank for the hint!). If we do not check the size, we could call vmalloc()
>> with this 0 value, and this will cause a kernel warning.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>

I will add cc stable.

Thanks applied.
>> ---
>>  v2: Check mop->size to be non-zero
>>
>>  arch/s390/kvm/kvm-s390.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
>> index f329dcb3f44c..49d7722229ae 100644
>> --- a/arch/s390/kvm/kvm-s390.c
>> +++ b/arch/s390/kvm/kvm-s390.c
>> @@ -4255,7 +4255,7 @@ static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
>>  	const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
>>  				    | KVM_S390_MEMOP_F_CHECK_ONLY;
>>  
>> -	if (mop->flags & ~supported_flags)
>> +	if (mop->flags & ~supported_flags || mop->ar >= NUM_ACRS || !mop->size)
>>  		return -EINVAL;
>>  
>>  	if (mop->size > MEM_OP_MAX_SIZE)
> 
> Reviewed-by: Cornelia Huck <cohuck@redhat.com>
> 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP
  2019-08-29 12:25 [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP Thomas Huth
  2019-08-29 12:40 ` Cornelia Huck
@ 2019-08-29 13:57 ` David Hildenbrand
  1 sibling, 0 replies; 4+ messages in thread
From: David Hildenbrand @ 2019-08-29 13:57 UTC (permalink / raw)
  To: Thomas Huth, Christian Borntraeger, Janosch Frank, kvm
  Cc: Cornelia Huck, Heiko Carstens, Vasily Gorbik, linux-s390, linux-kernel

On 29.08.19 14:25, Thomas Huth wrote:
> If the KVM_S390_MEM_OP ioctl is called with an access register >= 16,
> then there is certainly a bug in the calling userspace application.
> We check for wrong access registers, but only if the vCPU was already
> in the access register mode before (i.e. the SIE block has recorded
> it). The check is also buried somewhere deep in the calling chain (in
> the function ar_translation()), so this is somewhat hard to find.
> 
> It's better to always report an error to the userspace in case this
> field is set wrong, and it's safer in the KVM code if we block wrong
> values here early instead of relying on a check somewhere deep down
> the calling chain, so let's add another check to kvm_s390_guest_mem_op()
> directly.
> 
> We also should check that the "size" is non-zero here (thanks to Janosch
> Frank for the hint!). If we do not check the size, we could call vmalloc()
> with this 0 value, and this will cause a kernel warning.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v2: Check mop->size to be non-zero
> 
>  arch/s390/kvm/kvm-s390.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index f329dcb3f44c..49d7722229ae 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -4255,7 +4255,7 @@ static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
>  	const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
>  				    | KVM_S390_MEMOP_F_CHECK_ONLY;
>  
> -	if (mop->flags & ~supported_flags)
> +	if (mop->flags & ~supported_flags || mop->ar >= NUM_ACRS || !mop->size)
>  		return -EINVAL;
>  
>  	if (mop->size > MEM_OP_MAX_SIZE)
> 

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 

Thanks,

David / dhildenb

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-08-29 13:57 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-29 12:25 [PATCH v2] KVM: s390: Test for bad access register and size at the start of S390_MEM_OP Thomas Huth
2019-08-29 12:40 ` Cornelia Huck
2019-08-29 13:38   ` Christian Borntraeger
2019-08-29 13:57 ` David Hildenbrand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).