[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 9/9] x86/shadow: harden shadow_size()


  • To: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Thu, 12 Jan 2023 11:42:57 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5L1kQiY5uTx4IWBhotb8+wwYea9jsU5PILmCT8+5Gzg=; b=Ram6RUzwRxY/FmX2AJvnutOH66FSDsGAHSD204VpNZIFzoyaTmHz5pugIaBcygVmxIwEXc9QZKM4m7nLGzjbz2SRk/d1Gsq5l0OTe+8WXNS7sxvY75hJ8ULjHg53tQH24ICdsXEHUkcq+XjwspE5KHpP64YX5cztmQ7gwCHL0J3q4A0fxwBXy731ATJ3fRL9Rsplqb+Lz7oyMYw04yaWWN+OuAJWVc1wUK5zUo7hfvl8dt6W7j6Rd0MFZlLmBfjpkqq6oETkKHzHDRi/c7yh+nY/5gJO8ZcQkAYmnDkvlrWAVBaCped9EAPrkVQnVsoLbw8NkMwhlkev9BW1m3et8g==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ed/8imk65PyNLgtUf+88xhSGQ6/PKjzxRMFENwEr/Ox4z5q8yhnOASG2F6speCxuHMAIDe8UNR/+pgo94zg6k0fXJ2K+L3fySISCbctpA4UwnwzZLyXYZ7igXPVAJ9r0vLgkJoFDclGR6EIXwH6I+d79pvQymeAsCngwEAGUXBYmBmHxH+tvDHVQCazEwI996H+Nn0ImBCTzCalRHftXEeWXmf0ADkH4gD+Q1AsXk46J2K8Eocnlz0XQQ+XxNMxbLMyPkmkKehByV4kTANPnHbPL9UA2P7yTW3s5bDcqnujFjVwvDtfKFqQZ//NF5ANxgPmF3xu4QBj8zXb54UssJQ==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Wei Liu <wl@xxxxxxx>, Roger Pau Monne <roger.pau@xxxxxxxxxx>, "Tim (Xen.org)" <tim@xxxxxxx>, George Dunlap <George.Dunlap@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Thu, 12 Jan 2023 10:43:11 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 12.01.2023 11:31, Andrew Cooper wrote:
> On 12/01/2023 9:47 am, Jan Beulich wrote:
>> On 12.01.2023 00:15, Andrew Cooper wrote:
>>> On 11/01/2023 1:57 pm, Jan Beulich wrote:
>>>> Make HVM=y release build behavior prone against array overrun, by
>>>> (ab)using array_access_nospec(). This is in particular to guard against
>>>> e.g. SH_type_unused making it here unintentionally.
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>>> ---
>>>> v2: New.
>>>>
>>>> --- a/xen/arch/x86/mm/shadow/private.h
>>>> +++ b/xen/arch/x86/mm/shadow/private.h
>>>> @@ -27,6 +27,7 @@
>>>>  // been included...
>>>>  #include <asm/page.h>
>>>>  #include <xen/domain_page.h>
>>>> +#include <xen/nospec.h>
>>>>  #include <asm/x86_emulate.h>
>>>>  #include <asm/hvm/support.h>
>>>>  #include <asm/atomic.h>
>>>> @@ -368,7 +369,7 @@ shadow_size(unsigned int shadow_type)
>>>>  {
>>>>  #ifdef CONFIG_HVM
>>>>      ASSERT(shadow_type < ARRAY_SIZE(sh_type_to_size));
>>>> -    return sh_type_to_size[shadow_type];
>>>> +    return array_access_nospec(sh_type_to_size, shadow_type);
>>> I don't think this is warranted.
>>>
>>> First, if the commit message were accurate, then it's a problem for all
>>> arrays of size SH_type_unused, yet you've only adjusted a single instance.
>> Because I think the risk is higher here than for other arrays. In
>> other cases we have suitable build-time checks (HASH_CALLBACKS_CHECK()
>> in particular) which would trip upon inappropriate use of one of the
>> types which are aliased to SH_type_unused when !HVM.
>>
>>> Secondly, if it were reliably 16 then we could do the basically-free
>>> "type &= 15;" modification.  (It appears my change to do this
>>> automatically hasn't been taken yet.), but we'll end up with lfence
>>> variation here.
>> How could anything be "reliably 16"? Such enums can change at any time:
>> They did when making HVM types conditional, and they will again when
>> adding types needed for 5-level paging.
>>
>>> But the value isn't attacker controlled.  shadow_type always comes from
>>> Xen's metadata about the guest, not the guest itself.  So I don't see
>>> how this can conceivably be a speculative issue even in principle.
>> I didn't say anything about there being a speculative issue here. It
>> is for this very reason that I wrote "(ab)using".
> 
> Then it is entirely wrong to be using a nospec accessor.
> 
> Speculation problems are subtle enough, without false uses of the safety
> helpers.
> 
> If you want to "harden" against runtime architectural errors, you want
> to up the ASSERT() to a BUG(), which will execute faster than sticking
> an hiding an lfence in here, and not hide what is obviously a major
> malfunction in the shadow pagetable logic.

I should have commented on this earlier already: What lfence are you
talking about? As to BUG() - the goal here specifically is to avoid a
crash in release builds, by forcing the function to return zero (via
having it use array slot zero for out of range indexes).

Jan



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.