Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-17 Thread Tian, Kevin
> From: Paul Durrant 
> Sent: Friday, March 13, 2020 5:26 PM
> 
> > -Original Message-
> > From: Jan Beulich 
> > Sent: 13 March 2020 08:10
> > To: Tian, Kevin 
> > Cc: xen-devel@lists.xenproject.org; Andrew Cooper
> ; Paul Durrant
> > 
> > Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined
> devices optional
> >
> > On 13.03.2020 04:05, Tian, Kevin wrote:
> > >> From: Jan Beulich 
> > >> Sent: Tuesday, March 10, 2020 6:31 PM
> > >>
> > >> On 10.03.2020 06:30, Tian, Kevin wrote:
> >  From: Jan Beulich 
> >  Sent: Monday, March 9, 2020 7:09 PM
> > 
> >  Containing still in flight DMA was introduced to work around certain
> >  devices / systems hanging hard upon hitting a "not-present" IOMMU
> fault.
> >  Passing through (such) devices (on such systems) is inherently
> insecure
> >  (as guests could easily arrange for IOMMU faults of any kind to occur).
> >  Defaulting to a mode where admins may not even become aware of
> > >> issues
> >  with devices can be considered undesirable. Therefore convert this
> mode
> >  of operation to an optional one, not one enabled by default.
> > >>>
> > >>> Here is another thought. The whole point of quarantine is to contain
> > >>> the device after it is deassigned from untrusted guest.
> > >>
> > >> I'd question the "untrusted" here. Assigning devices to untrusted
> > >> guests is problematic anyway, unless you're the device manufacturer
> > >> and device firmware writer, and hence you can guarantee the device
> > >> to not offer any backdoors or alike. Therefore I view quarantining
> > >
> > > Aren't all guests untrusted from hypervisor p.o.v, which is the reason
> > > why IOMMU was introduced in the first place?
> >
> > "Untrusted" is always meant from the perspective of the host admin.
> >
> > > I may overlook the history of quarantine feature. Based on my study
> > > of quarantine related changes, looks initially Paul pointed out such
> > > problem that a device may have in-fly DMAs to touch dom0 memory
> > > after it is deassigned. Then he introduced the quarantine concept by
> > > putting a quarantined device into dom_io w/o any valid mapping,
> > > with a whitelist approach. You later extended as a default behavior
> > > for all PCI devices. Now Paul found some device which cannot tolerate
> > > read-fault and then came up this scratch-page idea.
> > >
> > > Now I wonder why we are doing such explicit quarantine in the first
> > > place. Shouldn't we always seek resetting the device when it is deassigned
> > > from a guest? 'reset' should cancel/quiescent all in-fly DMAs for most
> > > devices if they implement 'reset' correctly.
> >
> > And the important word here is "should". Paul and colleagues found
> > it may not do so in reality.
> 
> Yeah... we have to live with what we've got. Yes, it's buggy as hell but we
> have to do our best to stop it wedging hosts whilst trying to prevent
> scribbling over critical parts of memory.

'should' is applied to most devices who can gracefully handle the reset
request, and then for exception we come with ad-hoc band-aid.

> 
> >
> > > If doing that way, we don't
> > > need a quarantine option at all, and then the bogus device in Paul's
> > > latest finding could be handled by a standalone option w/o struggling
> > > whether 'full' is a right name vs. 'basic'. or we may introduce a reset
> > > flag when assigning such device to indicate such special requirement,
> > > so a scratch page/dom_io can be linked specifically for such device
> > > post reset, assuming it is not a platform-level bug from Paul's response?
> >
> > Which would imply host admins to know such properties of their
> > devices, and better _without_ first having run into problems.
> >
> 
> It is a device-level bug. We could, I guess, have a per-device quirk to say
> whether it should get a context entry pointing at a scratch page or not.
> 

If all except me think supporting such device in upstream is necessary, 
per-device quirk at least sounds better to me than enforcing a global 
quarantine policy for all devices.

Thanks
Kevin
___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-17 Thread Tian, Kevin
> From: Paul Durrant 
> Sent: Friday, March 13, 2020 5:26 PM
> 
> > -Original Message-
> > From: Tian, Kevin 
> > Sent: 13 March 2020 03:23
> > To: p...@xen.org; 'Jan Beulich' 
> > Cc: xen-devel@lists.xenproject.org; 'Andrew Cooper'
> 
> > Subject: RE: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of
> quarantined devices optional
> >
> > > From: Paul Durrant 
> > > Sent: Wednesday, March 11, 2020 12:05 AM
> > >
> > [...]
> > >
> > > >
> > > > > However, is a really saying that things will break if any of the
> > > > > PTEs has their present bit clear?
> > > >
> > > > Well, you said that read faults are fatal (to the host). Reads will,
> > > > for any address with an unpopulated PTE, result in a fault and hence
> > > > by implication be fatal.
> > >
> > > Oh I see. I thought there was an implication that the IOMMU could not
> cope
> > > with non-present PTEs in some way. Agreed that, when the device is
> assigned
> > > to the guest, then it can arrange (via ballooning) for a non-present entry
> to
> > > be hit by a read transaction, resulting in a lock-up. But dealing with a
> > > malicious guest was not the issue at hand... dealing with a buggy device
> that
> > > still tried to DMA after reset and whilst in quarantine was the problem.
> > >
> >
> > More thinking on this, I wonder whether the scratch page is sufficient, or
> > whether we should support such device in the first place. Looking at
> > 0c35d446:
> > --
> > The reason for doing this is that some hardware may continue to re-try
> > DMA (despite FLR) in the event of an error, or even BME being cleared,
> and
> > will fail to deal with DMA read faults gracefully. Having a scratch page
> > mapped will allow pending DMA reads to complete and thus such buggy
> > hardware will eventually be quiesced.
> > --
> >
> > 'eventually'... what does it exactly mean?
> 
> It means after a period of time we can only determine empirically.
> 
> > How would an user know a
> > device has been quiesced before he attempts to re-assign the device
> > to other domU or dom0? by guess?
> 
> Yes, a guess, but an educated one.
> 
> > Note the exact behavior of such
> > device, after different guest behaviors (hang, kill, bug, etc.), is not
> > documented. Who knows whether a in-fly DMA may be triggered when
> > the new owner starts to initialize the device again? How many stale
> > states are remaining on such device which, even not triggerring in-fly
> > DMAs, may change the desired behavior of the new owner? e.g. it's
> > possible one control register configured by the old owner, but not
> > touched by the new owner. If it cannot be reset, what's the point of
> > supporting assignment of such bogus device?
> >
> 
> Because I'm afraid it is quite ubiquitous and we need to deal with it.

it sounds the whole passthrough is in dangerous if your statement is true...

> 
> > Thereby I feel any support of such bogus device should be maintained
> > offtree, instead of in upstream Xen. Thoughts?
> >
> 
> I don't see the harm in the code being upstream. There may well be other
> devices with similar issues and it provides an option for an admin to try.
> 
___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-13 Thread Paul Durrant
> -Original Message-
> From: Jan Beulich 
> Sent: 13 March 2020 08:10
> To: Tian, Kevin 
> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
> ; Paul Durrant
> 
> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> optional
> 
> On 13.03.2020 04:05, Tian, Kevin wrote:
> >> From: Jan Beulich 
> >> Sent: Tuesday, March 10, 2020 6:31 PM
> >>
> >> On 10.03.2020 06:30, Tian, Kevin wrote:
>  From: Jan Beulich 
>  Sent: Monday, March 9, 2020 7:09 PM
> 
>  Containing still in flight DMA was introduced to work around certain
>  devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
>  Passing through (such) devices (on such systems) is inherently insecure
>  (as guests could easily arrange for IOMMU faults of any kind to occur).
>  Defaulting to a mode where admins may not even become aware of
> >> issues
>  with devices can be considered undesirable. Therefore convert this mode
>  of operation to an optional one, not one enabled by default.
> >>>
> >>> Here is another thought. The whole point of quarantine is to contain
> >>> the device after it is deassigned from untrusted guest.
> >>
> >> I'd question the "untrusted" here. Assigning devices to untrusted
> >> guests is problematic anyway, unless you're the device manufacturer
> >> and device firmware writer, and hence you can guarantee the device
> >> to not offer any backdoors or alike. Therefore I view quarantining
> >
> > Aren't all guests untrusted from hypervisor p.o.v, which is the reason
> > why IOMMU was introduced in the first place?
> 
> "Untrusted" is always meant from the perspective of the host admin.
> 
> > I may overlook the history of quarantine feature. Based on my study
> > of quarantine related changes, looks initially Paul pointed out such
> > problem that a device may have in-fly DMAs to touch dom0 memory
> > after it is deassigned. Then he introduced the quarantine concept by
> > putting a quarantined device into dom_io w/o any valid mapping,
> > with a whitelist approach. You later extended as a default behavior
> > for all PCI devices. Now Paul found some device which cannot tolerate
> > read-fault and then came up this scratch-page idea.
> >
> > Now I wonder why we are doing such explicit quarantine in the first
> > place. Shouldn't we always seek resetting the device when it is deassigned
> > from a guest? 'reset' should cancel/quiescent all in-fly DMAs for most
> > devices if they implement 'reset' correctly.
> 
> And the important word here is "should". Paul and colleagues found
> it may not do so in reality.

Yeah... we have to live with what we've got. Yes, it's buggy as hell but we 
have to do our best to stop it wedging hosts whilst trying to prevent 
scribbling over critical parts of memory.

> 
> > If doing that way, we don't
> > need a quarantine option at all, and then the bogus device in Paul's
> > latest finding could be handled by a standalone option w/o struggling
> > whether 'full' is a right name vs. 'basic'. or we may introduce a reset
> > flag when assigning such device to indicate such special requirement,
> > so a scratch page/dom_io can be linked specifically for such device
> > post reset, assuming it is not a platform-level bug from Paul's response?
> 
> Which would imply host admins to know such properties of their
> devices, and better _without_ first having run into problems.
> 

It is a device-level bug. We could, I guess, have a per-device quirk to say 
whether it should get a context entry pointing at a scratch page or not.

  Paul


___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-13 Thread Paul Durrant
> -Original Message-
> From: Tian, Kevin 
> Sent: 13 March 2020 03:23
> To: p...@xen.org; 'Jan Beulich' 
> Cc: xen-devel@lists.xenproject.org; 'Andrew Cooper' 
> 
> Subject: RE: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of 
> quarantined devices optional
> 
> > From: Paul Durrant 
> > Sent: Wednesday, March 11, 2020 12:05 AM
> >
> [...]
> >
> > >
> > > > However, is a really saying that things will break if any of the
> > > > PTEs has their present bit clear?
> > >
> > > Well, you said that read faults are fatal (to the host). Reads will,
> > > for any address with an unpopulated PTE, result in a fault and hence
> > > by implication be fatal.
> >
> > Oh I see. I thought there was an implication that the IOMMU could not cope
> > with non-present PTEs in some way. Agreed that, when the device is assigned
> > to the guest, then it can arrange (via ballooning) for a non-present entry 
> > to
> > be hit by a read transaction, resulting in a lock-up. But dealing with a
> > malicious guest was not the issue at hand... dealing with a buggy device 
> > that
> > still tried to DMA after reset and whilst in quarantine was the problem.
> >
> 
> More thinking on this, I wonder whether the scratch page is sufficient, or
> whether we should support such device in the first place. Looking at
> 0c35d446:
> --
> The reason for doing this is that some hardware may continue to re-try
> DMA (despite FLR) in the event of an error, or even BME being cleared, and
> will fail to deal with DMA read faults gracefully. Having a scratch page
> mapped will allow pending DMA reads to complete and thus such buggy
> hardware will eventually be quiesced.
> --
> 
> 'eventually'... what does it exactly mean?

It means after a period of time we can only determine empirically.

> How would an user know a
> device has been quiesced before he attempts to re-assign the device
> to other domU or dom0? by guess?

Yes, a guess, but an educated one.

> Note the exact behavior of such
> device, after different guest behaviors (hang, kill, bug, etc.), is not
> documented. Who knows whether a in-fly DMA may be triggered when
> the new owner starts to initialize the device again? How many stale
> states are remaining on such device which, even not triggerring in-fly
> DMAs, may change the desired behavior of the new owner? e.g. it's
> possible one control register configured by the old owner, but not
> touched by the new owner. If it cannot be reset, what's the point of
> supporting assignment of such bogus device?
> 

Because I'm afraid it is quite ubiquitous and we need to deal with it.

> Thereby I feel any support of such bogus device should be maintained
> offtree, instead of in upstream Xen. Thoughts?
> 

I don't see the harm in the code being upstream. There may well be other 
devices with similar issues and it provides an option for an admin to try.

  Paul


___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-13 Thread Jan Beulich
On 13.03.2020 04:05, Tian, Kevin wrote:
>> From: Jan Beulich 
>> Sent: Tuesday, March 10, 2020 6:31 PM
>>
>> On 10.03.2020 06:30, Tian, Kevin wrote:
 From: Jan Beulich 
 Sent: Monday, March 9, 2020 7:09 PM

 Containing still in flight DMA was introduced to work around certain
 devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
 Passing through (such) devices (on such systems) is inherently insecure
 (as guests could easily arrange for IOMMU faults of any kind to occur).
 Defaulting to a mode where admins may not even become aware of
>> issues
 with devices can be considered undesirable. Therefore convert this mode
 of operation to an optional one, not one enabled by default.
>>>
>>> Here is another thought. The whole point of quarantine is to contain
>>> the device after it is deassigned from untrusted guest.
>>
>> I'd question the "untrusted" here. Assigning devices to untrusted
>> guests is problematic anyway, unless you're the device manufacturer
>> and device firmware writer, and hence you can guarantee the device
>> to not offer any backdoors or alike. Therefore I view quarantining
> 
> Aren't all guests untrusted from hypervisor p.o.v, which is the reason
> why IOMMU was introduced in the first place?

"Untrusted" is always meant from the perspective of the host admin.

> I may overlook the history of quarantine feature. Based on my study
> of quarantine related changes, looks initially Paul pointed out such 
> problem that a device may have in-fly DMAs to touch dom0 memory
> after it is deassigned. Then he introduced the quarantine concept by
> putting a quarantined device into dom_io w/o any valid mapping, 
> with a whitelist approach. You later extended as a default behavior
> for all PCI devices. Now Paul found some device which cannot tolerate
> read-fault and then came up this scratch-page idea.
> 
> Now I wonder why we are doing such explicit quarantine in the first
> place. Shouldn't we always seek resetting the device when it is deassigned
> from a guest? 'reset' should cancel/quiescent all in-fly DMAs for most
> devices if they implement 'reset' correctly.

And the important word here is "should". Paul and colleagues found
it may not do so in reality.

> If doing that way, we don't
> need a quarantine option at all, and then the bogus device in Paul's
> latest finding could be handled by a standalone option w/o struggling
> whether 'full' is a right name vs. 'basic'. or we may introduce a reset
> flag when assigning such device to indicate such special requirement,
> so a scratch page/dom_io can be linked specifically for such device 
> post reset, assuming it is not a platform-level bug from Paul's response?  

Which would imply host admins to know such properties of their
devices, and better _without_ first having run into problems.

Jan

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-12 Thread Tian, Kevin
> From: Paul Durrant 
> Sent: Wednesday, March 11, 2020 12:05 AM
> 
[...]
> 
> >
> > > However, is a really saying that things will break if any of the
> > > PTEs has their present bit clear?
> >
> > Well, you said that read faults are fatal (to the host). Reads will,
> > for any address with an unpopulated PTE, result in a fault and hence
> > by implication be fatal.
> 
> Oh I see. I thought there was an implication that the IOMMU could not cope
> with non-present PTEs in some way. Agreed that, when the device is assigned
> to the guest, then it can arrange (via ballooning) for a non-present entry to
> be hit by a read transaction, resulting in a lock-up. But dealing with a
> malicious guest was not the issue at hand... dealing with a buggy device that
> still tried to DMA after reset and whilst in quarantine was the problem.
> 

More thinking on this, I wonder whether the scratch page is sufficient, or
whether we should support such device in the first place. Looking at
0c35d446:
--
The reason for doing this is that some hardware may continue to re-try
DMA (despite FLR) in the event of an error, or even BME being cleared, and
will fail to deal with DMA read faults gracefully. Having a scratch page
mapped will allow pending DMA reads to complete and thus such buggy
hardware will eventually be quiesced.
--

'eventually'... what does it exactly mean? How would an user know a 
device has been quiesced before he attempts to re-assign the device
to other domU or dom0? by guess? Note the exact behavior of such
device, after different guest behaviors (hang, kill, bug, etc.), is not
documented. Who knows whether a in-fly DMA may be triggered when
the new owner starts to initialize the device again? How many stale
states are remaining on such device which, even not triggerring in-fly
DMAs, may change the desired behavior of the new owner? e.g. it's
possible one control register configured by the old owner, but not
touched by the new owner. If it cannot be reset, what's the point of
supporting assignment of such bogus device?

Thereby I feel any support of such bogus device should be maintained
offtree, instead of in upstream Xen. Thoughts?

Thanks
Kevin
___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-12 Thread Tian, Kevin
> From: Jan Beulich 
> Sent: Tuesday, March 10, 2020 6:31 PM
> 
> On 10.03.2020 06:30, Tian, Kevin wrote:
> >> From: Jan Beulich 
> >> Sent: Monday, March 9, 2020 7:09 PM
> >>
> >> Containing still in flight DMA was introduced to work around certain
> >> devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
> >> Passing through (such) devices (on such systems) is inherently insecure
> >> (as guests could easily arrange for IOMMU faults of any kind to occur).
> >> Defaulting to a mode where admins may not even become aware of
> issues
> >> with devices can be considered undesirable. Therefore convert this mode
> >> of operation to an optional one, not one enabled by default.
> >
> > Here is another thought. The whole point of quarantine is to contain
> > the device after it is deassigned from untrusted guest.
> 
> I'd question the "untrusted" here. Assigning devices to untrusted
> guests is problematic anyway, unless you're the device manufacturer
> and device firmware writer, and hence you can guarantee the device
> to not offer any backdoors or alike. Therefore I view quarantining

Aren't all guests untrusted from hypervisor p.o.v, which is the reason
why IOMMU was introduced in the first place? 'untrust' imo applies
to either malicious guest code or inadvertent guest behavior that you 
mentioned below, which may both put the device in a state that the
hypervisor wants to quarantine before moving the device to another
owner. On the other hand, one must have certain degree of trust on 
the device itself, that the hardware won't do bad thing that is outside
of the guest driver control, e.g. for SR-IOV capable device the trust 
is about the device enforcing completed isolation between VFs...

> more as a protection of the host against bad device behavior, and
> less against malicious guest behavior (while the driver in the
> guest surely has some influence, consider the guest getting crashed
> and even a well-behaved driver hence not getting any chance to
> silence the device).

I may overlook the history of quarantine feature. Based on my study
of quarantine related changes, looks initially Paul pointed out such 
problem that a device may have in-fly DMAs to touch dom0 memory
after it is deassigned. Then he introduced the quarantine concept by
putting a quarantined device into dom_io w/o any valid mapping, 
with a whitelist approach. You later extended as a default behavior
for all PCI devices. Now Paul found some device which cannot tolerate
read-fault and then came up this scratch-page idea.

Now I wonder why we are doing such explicit quarantine in the first
place. Shouldn't we always seek resetting the device when it is deassigned
from a guest? 'reset' should cancel/quiescent all in-fly DMAs for most
devices if they implement 'reset' correctly. If doing that way, we don't
need a quarantine option at all, and then the bogus device in Paul's
latest finding could be handled by a standalone option w/o struggling
whether 'full' is a right name vs. 'basic'. or we may introduce a reset
flag when assigning such device to indicate such special requirement,
so a scratch page/dom_io can be linked specifically for such device 
post reset, assuming it is not a platform-level bug from Paul's response?  

> 
> Jan
> 
> > However, the
> > passthrough of such device is already insecure, as you mentioned.
> > Then why do we care about making deassignment of such device
> > secure without doing anything to secure it when it is assigned and being
> > used by untrusted guest? I feel that one should simply put such device
> > out of the quarantine list in the first place, i.e. set quarantine=false and
> > then use tool to quarantine a whitelist of devices by skipping the bad one.
___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-12 Thread Tian, Kevin
> From: Jan Beulich 
> Sent: Tuesday, March 10, 2020 6:27 PM
> 
> On 10.03.2020 04:43, Tian, Kevin wrote:
> >> From: Jan Beulich 
> >> Sent: Monday, March 9, 2020 7:09 PM
> >>
> >> I'm happy to take better suggestions to replace the "full" command line
> >> option and Kconfig prompt tokens. I don't think though that "fault" and
> >> "write-fault" are really suitable there.
> >
> > I think we may just allow both r/w access to scratch page for such bogus
> > device, which may make 'full' more reasonable since we now fully
> > contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> > alone for such devices (just because one observed his specific device only
> > has problem with read-fault).
> 
> Well, a fundamental problem I have here is that I still don't know
> the _exact_ conditions for the observed hangs. I consider it unlikely
> for IOMMU read faults to cause hangs, but for write faults to be
> "fine". It would seem more likely to me that e.g. a non-present
> context entry might cause issues. If that was the case, we wouldn't
> need to handle reads and writes differently; we could instead install
> an all zero top level page table. And we'd still get all faults that
> are supposed to surface. But perhaps Paul did try this back then, and
> it turned out to not be an option.
> 
> The choice of letting writes continue to fault was based on (a) this
> having been tested to work on the affected system(s) and (b) also
> letting writes go to a scratch page requiring a per-device scratch
> page (and associated page tables) rather than a system-wide one, as
> devices coming from different domains would otherwise be able to
> observe data written to memory by respectively "foreign" devices
> (and hence domains).

ok, it is a valid point.

> 
> But this is all guesswork without the firmware writers of affected
> systems giving us at least some hints.
> 
> > alternatively I also thought about whether whitelisting the problematic
> > devices through another option (e.g. nofault=b:d:f) could provide more
> > value. In concept any IOMMU page table (dom0, dom_io or domU)
> > for such bogus device should not include invalid entry, even when
> > quarantine is not specified. However I'm not sure whether it's worthy of
> > going so far...
> 
> Indeed. Question though is whether this bad behavior is device specific
> (rather than e.g. system dependent). Plus - as per above - question
> also is whether it's really leaf (or intermediate) page table entry
> presence which actually matters here. If it was, I agree we shouldn't
> have any non-present entries anywhere in the page table trees.
> 
> Jan
___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 17:05, Paul Durrant wrote:
>> -Original Message-
>> From: Jan Beulich 
>> Sent: 10 March 2020 15:44
>> To: p...@xen.org
>> Cc: xen-devel@lists.xenproject.org; 'Tian, Kevin' ; 
>> 'Andrew Cooper'
>> 
>> Subject: Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of 
>> quarantined devices optional
>>
>> On 10.03.2020 16:13, Paul Durrant wrote:
>>>> -Original Message-
>>>> From: Jan Beulich 
>>>> Sent: 10 March 2020 15:05
>>>> To: p...@xen.org
>>>> Cc: 'Tian, Kevin' ; xen-devel@lists.xenproject.org; 
>>>> 'Andrew Cooper'
>>>> 
>>>> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
>>>> optional
>>>>
>>>> On 10.03.2020 13:30, Paul Durrant wrote:
>>>>>> -Original Message-
>>>>>> From: Jan Beulich 
>>>>>> Sent: 10 March 2020 10:27
>>>>>> To: Tian, Kevin ; Paul Durrant 
>>>>>> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
>>>>>> 
>>>>>> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined 
>>>>>> devices optional
>>>>>>
>>>>>> On 10.03.2020 04:43, Tian, Kevin wrote:
>>>>>>>> From: Jan Beulich 
>>>>>>>> Sent: Monday, March 9, 2020 7:09 PM
>>>>>>>>
>>>>>>>> I'm happy to take better suggestions to replace the "full" command line
>>>>>>>> option and Kconfig prompt tokens. I don't think though that "fault" and
>>>>>>>> "write-fault" are really suitable there.
>>>>>>>
>>>>>>> I think we may just allow both r/w access to scratch page for such bogus
>>>>>>> device, which may make 'full' more reasonable since we now fully
>>>>>>> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
>>>>>>> alone for such devices (just because one observed his specific device 
>>>>>>> only
>>>>>>> has problem with read-fault).
>>>>>>
>>>>>> Well, a fundamental problem I have here is that I still don't know
>>>>>> the _exact_ conditions for the observed hangs. I consider it unlikely
>>>>>> for IOMMU read faults to cause hangs, but for write faults to be
>>>>>> "fine".
>>>>>
>>>>> AFAIK it's because the writes are posted and so any faults are just 
>>>>> ignored, whereas a read fault
>>>> being synchronous causes the device's state machine to lock up. It really 
>>>> is observed behaviour.
>>>>>
>>>>>> It would seem more likely to me that e.g. a non-present
>>>>>> context entry might cause issues. If that was the case, we wouldn't
>>>>>> need to handle reads and writes differently; we could instead install
>>>>>> an all zero top level page table. And we'd still get all faults that
>>>>>> are supposed to surface. But perhaps Paul did try this back then, and
>>>>>> it turned out to not be an option.
>>>>>>
>>>>>
>>>>> The only info I had was that faults on DMA reads had to avoided
>>>>> completely. I did not have access to the h/w in question at the
>>>>> time. I may be able to get it now.
>>>>
>>>> I see. The implication then is, as Kevin said, that we mustn't run
>>>> guests with _any_ IOMMU PTEs having their "read" bits clear.
>>>> Anything that's "not present" now would need directing to a scratch
>>>> page. I then further wonder what effect reads to addresses beyond
>>>> AGAW would have. It may be impossible to arrange for sufficiently
>>>> secure pass-through with such a device, at which point - again as
>>>> said by Kevin - there may be little point in the scratch page
>>>> based quarantining.
>>>>
>>>
>>> Well, I can't say there's little point in it as it does fix a host lock-up.
>>>
>>> You say "as Kevin said, that we mustn't run guests with _any_ IOMMU
>>> PTEs having their "read" bits clear"... I can't find that. I did
>>> find where he said "In concept any IOMMU page table (dom0, dom_io
>>> or domU) for such bogus device should not include invalid 

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Paul Durrant
> -Original Message-
> From: Jan Beulich 
> Sent: 10 March 2020 15:44
> To: p...@xen.org
> Cc: xen-devel@lists.xenproject.org; 'Tian, Kevin' ; 
> 'Andrew Cooper'
> 
> Subject: Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of 
> quarantined devices optional
> 
> On 10.03.2020 16:13, Paul Durrant wrote:
> >> -Original Message-
> >> From: Jan Beulich 
> >> Sent: 10 March 2020 15:05
> >> To: p...@xen.org
> >> Cc: 'Tian, Kevin' ; xen-devel@lists.xenproject.org; 
> >> 'Andrew Cooper'
> >> 
> >> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> >> optional
> >>
> >> On 10.03.2020 13:30, Paul Durrant wrote:
> >>>> -Original Message-
> >>>> From: Jan Beulich 
> >>>> Sent: 10 March 2020 10:27
> >>>> To: Tian, Kevin ; Paul Durrant 
> >>>> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
> >>>> 
> >>>> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined 
> >>>> devices optional
> >>>>
> >>>> On 10.03.2020 04:43, Tian, Kevin wrote:
> >>>>>> From: Jan Beulich 
> >>>>>> Sent: Monday, March 9, 2020 7:09 PM
> >>>>>>
> >>>>>> I'm happy to take better suggestions to replace the "full" command line
> >>>>>> option and Kconfig prompt tokens. I don't think though that "fault" and
> >>>>>> "write-fault" are really suitable there.
> >>>>>
> >>>>> I think we may just allow both r/w access to scratch page for such bogus
> >>>>> device, which may make 'full' more reasonable since we now fully
> >>>>> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> >>>>> alone for such devices (just because one observed his specific device 
> >>>>> only
> >>>>> has problem with read-fault).
> >>>>
> >>>> Well, a fundamental problem I have here is that I still don't know
> >>>> the _exact_ conditions for the observed hangs. I consider it unlikely
> >>>> for IOMMU read faults to cause hangs, but for write faults to be
> >>>> "fine".
> >>>
> >>> AFAIK it's because the writes are posted and so any faults are just 
> >>> ignored, whereas a read fault
> >> being synchronous causes the device's state machine to lock up. It really 
> >> is observed behaviour.
> >>>
> >>>> It would seem more likely to me that e.g. a non-present
> >>>> context entry might cause issues. If that was the case, we wouldn't
> >>>> need to handle reads and writes differently; we could instead install
> >>>> an all zero top level page table. And we'd still get all faults that
> >>>> are supposed to surface. But perhaps Paul did try this back then, and
> >>>> it turned out to not be an option.
> >>>>
> >>>
> >>> The only info I had was that faults on DMA reads had to avoided
> >>> completely. I did not have access to the h/w in question at the
> >>> time. I may be able to get it now.
> >>
> >> I see. The implication then is, as Kevin said, that we mustn't run
> >> guests with _any_ IOMMU PTEs having their "read" bits clear.
> >> Anything that's "not present" now would need directing to a scratch
> >> page. I then further wonder what effect reads to addresses beyond
> >> AGAW would have. It may be impossible to arrange for sufficiently
> >> secure pass-through with such a device, at which point - again as
> >> said by Kevin - there may be little point in the scratch page
> >> based quarantining.
> >>
> >
> > Well, I can't say there's little point in it as it does fix a host lock-up.
> >
> > You say "as Kevin said, that we mustn't run guests with _any_ IOMMU
> > PTEs having their "read" bits clear"... I can't find that. I did
> > find where he said "In concept any IOMMU page table (dom0, dom_io
> > or domU) for such bogus device should not include invalid entry",
> > but that's a different thing.
> 
> In which way?

In that the PTE would still be a valid entry? It would have read perm clear, 
yes, but that doesn't make the PTE invalid.

> 
> > However, is a really saying that things will break if any of the
> > PTEs has th

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 16:13, Paul Durrant wrote:
>> -Original Message-
>> From: Jan Beulich 
>> Sent: 10 March 2020 15:05
>> To: p...@xen.org
>> Cc: 'Tian, Kevin' ; xen-devel@lists.xenproject.org; 
>> 'Andrew Cooper'
>> 
>> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
>> optional
>>
>> On 10.03.2020 13:30, Paul Durrant wrote:
 -Original Message-
 From: Jan Beulich 
 Sent: 10 March 2020 10:27
 To: Tian, Kevin ; Paul Durrant 
 Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
 
 Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
 optional

 On 10.03.2020 04:43, Tian, Kevin wrote:
>> From: Jan Beulich 
>> Sent: Monday, March 9, 2020 7:09 PM
>>
>> I'm happy to take better suggestions to replace the "full" command line
>> option and Kconfig prompt tokens. I don't think though that "fault" and
>> "write-fault" are really suitable there.
>
> I think we may just allow both r/w access to scratch page for such bogus
> device, which may make 'full' more reasonable since we now fully
> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> alone for such devices (just because one observed his specific device only
> has problem with read-fault).

 Well, a fundamental problem I have here is that I still don't know
 the _exact_ conditions for the observed hangs. I consider it unlikely
 for IOMMU read faults to cause hangs, but for write faults to be
 "fine".
>>>
>>> AFAIK it's because the writes are posted and so any faults are just 
>>> ignored, whereas a read fault
>> being synchronous causes the device's state machine to lock up. It really is 
>> observed behaviour.
>>>
 It would seem more likely to me that e.g. a non-present
 context entry might cause issues. If that was the case, we wouldn't
 need to handle reads and writes differently; we could instead install
 an all zero top level page table. And we'd still get all faults that
 are supposed to surface. But perhaps Paul did try this back then, and
 it turned out to not be an option.

>>>
>>> The only info I had was that faults on DMA reads had to avoided
>>> completely. I did not have access to the h/w in question at the
>>> time. I may be able to get it now.
>>
>> I see. The implication then is, as Kevin said, that we mustn't run
>> guests with _any_ IOMMU PTEs having their "read" bits clear.
>> Anything that's "not present" now would need directing to a scratch
>> page. I then further wonder what effect reads to addresses beyond
>> AGAW would have. It may be impossible to arrange for sufficiently
>> secure pass-through with such a device, at which point - again as
>> said by Kevin - there may be little point in the scratch page
>> based quarantining.
>>
> 
> Well, I can't say there's little point in it as it does fix a host lock-up.
> 
> You say "as Kevin said, that we mustn't run guests with _any_ IOMMU
> PTEs having their "read" bits clear"... I can't find that. I did
> find where he said "In concept any IOMMU page table (dom0, dom_io
> or domU) for such bogus device should not include invalid entry",
> but that's a different thing.

In which way?

> However, is a really saying that things will break if any of the
> PTEs has their present bit clear?

Well, you said that read faults are fatal (to the host). Reads will,
for any address with an unpopulated PTE, result in a fault and hence
by implication be fatal.

(As an aside, other than in x86's CPU page tables, IOMMU page tables
in both their AMD and Intel incarnations don't have "present" bits -
they have "read" and "write" ones only.)

Jan

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Paul Durrant
> -Original Message-
> From: Jan Beulich 
> Sent: 10 March 2020 15:05
> To: p...@xen.org
> Cc: 'Tian, Kevin' ; xen-devel@lists.xenproject.org; 
> 'Andrew Cooper'
> 
> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> optional
> 
> On 10.03.2020 13:30, Paul Durrant wrote:
> >> -Original Message-
> >> From: Jan Beulich 
> >> Sent: 10 March 2020 10:27
> >> To: Tian, Kevin ; Paul Durrant 
> >> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
> >> 
> >> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> >> optional
> >>
> >> On 10.03.2020 04:43, Tian, Kevin wrote:
>  From: Jan Beulich 
>  Sent: Monday, March 9, 2020 7:09 PM
> 
>  I'm happy to take better suggestions to replace the "full" command line
>  option and Kconfig prompt tokens. I don't think though that "fault" and
>  "write-fault" are really suitable there.
> >>>
> >>> I think we may just allow both r/w access to scratch page for such bogus
> >>> device, which may make 'full' more reasonable since we now fully
> >>> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> >>> alone for such devices (just because one observed his specific device only
> >>> has problem with read-fault).
> >>
> >> Well, a fundamental problem I have here is that I still don't know
> >> the _exact_ conditions for the observed hangs. I consider it unlikely
> >> for IOMMU read faults to cause hangs, but for write faults to be
> >> "fine".
> >
> > AFAIK it's because the writes are posted and so any faults are just 
> > ignored, whereas a read fault
> being synchronous causes the device's state machine to lock up. It really is 
> observed behaviour.
> >
> >> It would seem more likely to me that e.g. a non-present
> >> context entry might cause issues. If that was the case, we wouldn't
> >> need to handle reads and writes differently; we could instead install
> >> an all zero top level page table. And we'd still get all faults that
> >> are supposed to surface. But perhaps Paul did try this back then, and
> >> it turned out to not be an option.
> >>
> >
> > The only info I had was that faults on DMA reads had to avoided
> > completely. I did not have access to the h/w in question at the
> > time. I may be able to get it now.
> 
> I see. The implication then is, as Kevin said, that we mustn't run
> guests with _any_ IOMMU PTEs having their "read" bits clear.
> Anything that's "not present" now would need directing to a scratch
> page. I then further wonder what effect reads to addresses beyond
> AGAW would have. It may be impossible to arrange for sufficiently
> secure pass-through with such a device, at which point - again as
> said by Kevin - there may be little point in the scratch page
> based quarantining.
> 

Well, I can't say there's little point in it as it does fix a host lock-up.

You say "as Kevin said, that we mustn't run guests with _any_ IOMMU PTEs having 
their "read" bits clear"... I can't find that. I did find where he said "In 
concept any IOMMU page table (dom0, dom_io or domU) for such bogus device 
should not include invalid entry", but that's a different thing. However, is a 
really saying that things will break if any of the PTEs has their present bit 
clear?

  Paul



___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 13:30, Paul Durrant wrote:
>> -Original Message-
>> From: Jan Beulich 
>> Sent: 10 March 2020 10:27
>> To: Tian, Kevin ; Paul Durrant 
>> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
>> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
>> optional
>>
>> On 10.03.2020 04:43, Tian, Kevin wrote:
 From: Jan Beulich 
 Sent: Monday, March 9, 2020 7:09 PM

 I'm happy to take better suggestions to replace the "full" command line
 option and Kconfig prompt tokens. I don't think though that "fault" and
 "write-fault" are really suitable there.
>>>
>>> I think we may just allow both r/w access to scratch page for such bogus
>>> device, which may make 'full' more reasonable since we now fully
>>> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
>>> alone for such devices (just because one observed his specific device only
>>> has problem with read-fault).
>>
>> Well, a fundamental problem I have here is that I still don't know
>> the _exact_ conditions for the observed hangs. I consider it unlikely
>> for IOMMU read faults to cause hangs, but for write faults to be
>> "fine".
> 
> AFAIK it's because the writes are posted and so any faults are just ignored, 
> whereas a read fault being synchronous causes the device's state machine to 
> lock up. It really is observed behaviour.
> 
>> It would seem more likely to me that e.g. a non-present
>> context entry might cause issues. If that was the case, we wouldn't
>> need to handle reads and writes differently; we could instead install
>> an all zero top level page table. And we'd still get all faults that
>> are supposed to surface. But perhaps Paul did try this back then, and
>> it turned out to not be an option.
>>
> 
> The only info I had was that faults on DMA reads had to avoided
> completely. I did not have access to the h/w in question at the
> time. I may be able to get it now.

I see. The implication then is, as Kevin said, that we mustn't run
guests with _any_ IOMMU PTEs having their "read" bits clear.
Anything that's "not present" now would need directing to a scratch
page. I then further wonder what effect reads to addresses beyond
AGAW would have. It may be impossible to arrange for sufficiently
secure pass-through with such a device, at which point - again as
said by Kevin - there may be little point in the scratch page
based quarantining.

Jan

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Paul Durrant
> -Original Message-
> From: Jan Beulich 
> Sent: 10 March 2020 10:27
> To: Tian, Kevin ; Paul Durrant 
> Cc: xen-devel@lists.xenproject.org; Andrew Cooper 
> Subject: Re: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> optional
> 
> On 10.03.2020 04:43, Tian, Kevin wrote:
> >> From: Jan Beulich 
> >> Sent: Monday, March 9, 2020 7:09 PM
> >>
> >> I'm happy to take better suggestions to replace the "full" command line
> >> option and Kconfig prompt tokens. I don't think though that "fault" and
> >> "write-fault" are really suitable there.
> >
> > I think we may just allow both r/w access to scratch page for such bogus
> > device, which may make 'full' more reasonable since we now fully
> > contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> > alone for such devices (just because one observed his specific device only
> > has problem with read-fault).
> 
> Well, a fundamental problem I have here is that I still don't know
> the _exact_ conditions for the observed hangs. I consider it unlikely
> for IOMMU read faults to cause hangs, but for write faults to be
> "fine".

AFAIK it's because the writes are posted and so any faults are just ignored, 
whereas a read fault being synchronous causes the device's state machine to 
lock up. It really is observed behaviour.

> It would seem more likely to me that e.g. a non-present
> context entry might cause issues. If that was the case, we wouldn't
> need to handle reads and writes differently; we could instead install
> an all zero top level page table. And we'd still get all faults that
> are supposed to surface. But perhaps Paul did try this back then, and
> it turned out to not be an option.
> 

The only info I had was that faults on DMA reads had to avoided completely. I 
did not have access to the h/w in question at the time. I may be able to get it 
now.

  Paul

> The choice of letting writes continue to fault was based on (a) this
> having been tested to work on the affected system(s) and (b) also
> letting writes go to a scratch page requiring a per-device scratch
> page (and associated page tables) rather than a system-wide one, as
> devices coming from different domains would otherwise be able to
> observe data written to memory by respectively "foreign" devices
> (and hence domains).
> 
> But this is all guesswork without the firmware writers of affected
> systems giving us at least some hints.
> 
> > alternatively I also thought about whether whitelisting the problematic
> > devices through another option (e.g. nofault=b:d:f) could provide more
> > value. In concept any IOMMU page table (dom0, dom_io or domU)
> > for such bogus device should not include invalid entry, even when
> > quarantine is not specified. However I'm not sure whether it's worthy of
> > going so far...
> 
> Indeed. Question though is whether this bad behavior is device specific
> (rather than e.g. system dependent). Plus - as per above - question
> also is whether it's really leaf (or intermediate) page table entry
> presence which actually matters here. If it was, I agree we shouldn't
> have any non-present entries anywhere in the page table trees.
> 
> Jan


___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 06:30, Tian, Kevin wrote:
>> From: Jan Beulich 
>> Sent: Monday, March 9, 2020 7:09 PM
>>
>> Containing still in flight DMA was introduced to work around certain
>> devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
>> Passing through (such) devices (on such systems) is inherently insecure
>> (as guests could easily arrange for IOMMU faults of any kind to occur).
>> Defaulting to a mode where admins may not even become aware of issues
>> with devices can be considered undesirable. Therefore convert this mode
>> of operation to an optional one, not one enabled by default.
> 
> Here is another thought. The whole point of quarantine is to contain
> the device after it is deassigned from untrusted guest.

I'd question the "untrusted" here. Assigning devices to untrusted
guests is problematic anyway, unless you're the device manufacturer
and device firmware writer, and hence you can guarantee the device
to not offer any backdoors or alike. Therefore I view quarantining
more as a protection of the host against bad device behavior, and
less against malicious guest behavior (while the driver in the
guest surely has some influence, consider the guest getting crashed
and even a well-behaved driver hence not getting any chance to
silence the device).

Jan

> However, the
> passthrough of such device is already insecure, as you mentioned. 
> Then why do we care about making deassignment of such device
> secure without doing anything to secure it when it is assigned and being
> used by untrusted guest? I feel that one should simply put such device
> out of the quarantine list in the first place, i.e. set quarantine=false and
> then use tool to quarantine a whitelist of devices by skipping the bad one.

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 04:43, Tian, Kevin wrote:
>> From: Jan Beulich 
>> Sent: Monday, March 9, 2020 7:09 PM
>>
>> I'm happy to take better suggestions to replace the "full" command line
>> option and Kconfig prompt tokens. I don't think though that "fault" and
>> "write-fault" are really suitable there.
> 
> I think we may just allow both r/w access to scratch page for such bogus
> device, which may make 'full' more reasonable since we now fully
> contain in-fly DMAs. I'm not sure about the value of keeping write-fault
> alone for such devices (just because one observed his specific device only 
> has problem with read-fault).

Well, a fundamental problem I have here is that I still don't know
the _exact_ conditions for the observed hangs. I consider it unlikely
for IOMMU read faults to cause hangs, but for write faults to be
"fine". It would seem more likely to me that e.g. a non-present
context entry might cause issues. If that was the case, we wouldn't
need to handle reads and writes differently; we could instead install
an all zero top level page table. And we'd still get all faults that
are supposed to surface. But perhaps Paul did try this back then, and
it turned out to not be an option.

The choice of letting writes continue to fault was based on (a) this
having been tested to work on the affected system(s) and (b) also
letting writes go to a scratch page requiring a per-device scratch
page (and associated page tables) rather than a system-wide one, as
devices coming from different domains would otherwise be able to
observe data written to memory by respectively "foreign" devices
(and hence domains).

But this is all guesswork without the firmware writers of affected
systems giving us at least some hints.

> alternatively I also thought about whether whitelisting the problematic 
> devices through another option (e.g. nofault=b:d:f) could provide more
> value. In concept any IOMMU page table (dom0, dom_io or domU) 
> for such bogus device should not include invalid entry, even when 
> quarantine is not specified. However I'm not sure whether it's worthy of 
> going so far...

Indeed. Question though is whether this bad behavior is device specific
(rather than e.g. system dependent). Plus - as per above - question
also is whether it's really leaf (or intermediate) page table entry
presence which actually matters here. If it was, I agree we shouldn't
have any non-present entries anywhere in the page table trees.

Jan

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Jan Beulich
On 10.03.2020 09:58, Paul Durrant wrote:
>> -Original Message-
>> From: Jan Beulich 
>> Sent: 09 March 2020 11:09
>>
>> @@ -1276,11 +1276,15 @@ boolean (e.g. `iommu=no`) can override t
>>  will prevent Xen from booting if IOMMUs aren't discovered and enabled
>>  successfully.
>>
>> -*   The `quarantine` boolean can be used to control Xen's behavior when
>> -de-assigning devices from guests.  If enabled (the default), Xen always
>> -quarantines such devices; they must be explicitly assigned back to Dom0
>> -before they can be used there again.  If disabled, Xen will only
>> -quarantine devices the toolstack hass arranged for getting quarantined.
>> +*   The `quarantine` option can be used to control Xen's behavior when
>> +de-assigning devices from guests.  If set to true (the default), Xen
>> +always quarantines such devices; they must be explicitly assigned back
>> +to Dom0 before they can be used there again.  If set to "full", still
>> +active DMA will additionally be directed to a "sink" page.
> 
> I realise this is only in the diff context, but I'm not sure what the 
> following sentence actually means:
> 
>>  If set to
>> +false, Xen will only quarantine devices the toolstack has arranged for
>> +getting quarantined.
>> +
> 
> Sounds tautological to me.

Not to me - "false" could also mean no quarantining at all (i.e. no
tool stack control).

>> --- a/xen/drivers/passthrough/Kconfig
>> +++ b/xen/drivers/passthrough/Kconfig
>> @@ -28,3 +28,31 @@ endif
>>
>>  config IOMMU_FORCE_PT_SHARE
>>  bool
>> +
>> +choice
>> +prompt "IOMMU device quarantining default behavior"
>> +depends on HAS_PCI
>> +default IOMMU_QUARANTINE_BASIC
>> +---help---
>> +  When a PCI device is assigned to an untrusted domain, it is possible
>> +  for that domain to program the device to DMA to an arbitrary address.
>> +  The IOMMU is used to protect the host from malicious DMA by making
>> +  sure that the device addresses can only target memory assigned to the
>> +  guest.  However, when the guest domain is torn down, assigning the
>> +  device back to the hardware domain would allow any in-flight DMA to
>> +  potentially target critical host data.  To avoid this, quarantining
>> +  shold be enabled.
> 
> IMO the above text is a good summary and it would be useful it were
> duplicated in the command line documentation.

Can do.

>>  Quarantining can be done in two ways: In its basic
>> +  form, all in-flight DMA will simply be forced to encounter IOMMU
>> +  faults.  Since there are systems where doing so can cause host
>> +  lockup, an alternative form is available where writes to memory will
>> +  be made fault, but reads will be directed to a dummy page.  The
>> +  implication here is that such reads will go unnoticed, i.e. an admin
>> +  may not become aware of the underlying problem.
>> +
>> +config IOMMU_QUARANTINE_NONE
>> +bool "none"
>> +config IOMMU_QUARANTINE_BASIC
>> +bool "basic"
>> +config IOMMU_QUARANTINE_FULL
>> +bool "full"
> 
> 'scratch_page' perhaps? Seems a bit more self-explanatory.

But it still wouldn't carry the "reads only" aspect. I'll reply to
Kevin later, where this aspect will be of more interest. But yes,
I'll think some more about perhaps using that.

>> --- a/xen/drivers/passthrough/iommu.c
>> +++ b/xen/drivers/passthrough/iommu.c
>> @@ -31,9 +31,24 @@ bool_t __initdata iommu_enable = 1;
>>  bool_t __read_mostly iommu_enabled;
>>  bool_t __read_mostly force_iommu;
>>  bool_t __read_mostly iommu_verbose;
>> -bool __read_mostly iommu_quarantine = true;
>>  bool_t __read_mostly iommu_crash_disable;
>>
>> +#define IOMMU_quarantine_none0 /* aka false */
>> +#define IOMMU_quarantine_fault   1 /* aka true */
>> +#define IOMMU_quarantine_write_fault 2
> 
> enum for the above perhaps?

Well, I don't want the variable to become wider than a byte. And I
couldn't really settle between the ugliness of not using an enum
and the ugliness of attaching __packed to it. If you have a clear
preference for a packed enum, I'll switch - just let me know.

Jan

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-10 Thread Paul Durrant
> -Original Message-
> From: Jan Beulich 
> Sent: 09 March 2020 11:09
> To: xen-devel@lists.xenproject.org
> Cc: Andrew Cooper ; Paul Durrant ; 
> Kevin Tian
> 
> Subject: [PATCH v3] IOMMU: make DMA containment of quarantined devices 
> optional
> 
> Containing still in flight DMA was introduced to work around certain
> devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
> Passing through (such) devices (on such systems) is inherently insecure
> (as guests could easily arrange for IOMMU faults of any kind to occur).
> Defaulting to a mode where admins may not even become aware of issues
> with devices can be considered undesirable. Therefore convert this mode
> of operation to an optional one, not one enabled by default.
> 
> This involves resurrecting code commit ea38867831da ("x86 / iommu: set
> up a scratch page in the quarantine domain") did remove, in a slightly
> extended and abstracted fashion. Here, instead of reintroducing a pretty
> pointless use of "goto" in domain_context_unmap(), and instead of making
> the function (at least temporarily) inconsistent, take the opportunity
> and replace the other similarly pointless "goto" as well.
> 
> In order to key the re-instated bypasses off of there (not) being a root
> page table this further requires moving the allocate_domain_resources()
> invocation from reassign_device() to amd_iommu_setup_domain_device() (or
> else reassign_device() would allocate a root page table anyway); this is
> benign to the second caller of the latter function.
> 
> Take the opportunity and also limit the control to builds supporting
> PCI.
> 
> Signed-off-by: Jan Beulich 
> ---
> I'm happy to take better suggestions to replace the "full" command line
> option and Kconfig prompt tokens. I don't think though that "fault" and
> "write-fault" are really suitable there.
> ---
> This patch contextually depends on "[PATCH v2 0/5] IOMMU: restrict
> visibility/scope if certain variables".
> ---
> v3: IOMMU_quarantine_basic -> IOMMU_quarantine_fault,
> IOMMU_quarantine_full -> IOMMU_quarantine_write_fault. Kconfig
> option (choice) to select default. Limit to HAS_PCI.
> v2: Don't use true/false. Introduce QUARANTINE_SKIP() (albeit I'm not
> really convinced this is an improvement). Add comment.
> 
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -1238,7 +1238,7 @@ detection of systems known to misbehave
>  > Default: `new` unless directed-EOI is supported
> 
>  ### iommu
> -= List of [ , verbose, debug, force, required, quarantine,
> += List of [ , verbose, debug, force, required, quarantine[=full],
>  sharept, intremap, intpost, crash-disable,
>  snoop, qinval, igfx, amd-iommu-perdev-intremap,
>  dom0-{passthrough,strict} ]
> @@ -1276,11 +1276,15 @@ boolean (e.g. `iommu=no`) can override t
>  will prevent Xen from booting if IOMMUs aren't discovered and enabled
>  successfully.
> 
> -*   The `quarantine` boolean can be used to control Xen's behavior when
> -de-assigning devices from guests.  If enabled (the default), Xen always
> -quarantines such devices; they must be explicitly assigned back to Dom0
> -before they can be used there again.  If disabled, Xen will only
> -quarantine devices the toolstack hass arranged for getting quarantined.
> +*   The `quarantine` option can be used to control Xen's behavior when
> +de-assigning devices from guests.  If set to true (the default), Xen
> +always quarantines such devices; they must be explicitly assigned back
> +to Dom0 before they can be used there again.  If set to "full", still
> +active DMA will additionally be directed to a "sink" page.

I realise this is only in the diff context, but I'm not sure what the following 
sentence actually means:

>  If set to
> +false, Xen will only quarantine devices the toolstack has arranged for
> +getting quarantined.
> +

Sounds tautological to me.

> +This option is only valid on builds supporting PCI.
> 
>  *   The `sharept` boolean controls whether the IOMMU pagetables are shared
>  with the CPU-side HAP pagetables, or allocated separately.  Sharing
> --- a/xen/drivers/passthrough/Kconfig
> +++ b/xen/drivers/passthrough/Kconfig
> @@ -28,3 +28,31 @@ endif
> 
>  config IOMMU_FORCE_PT_SHARE
>   bool
> +
> +choice
> + prompt "IOMMU device quarantining default behavior"
> + depends on HAS_PCI
> + default IOMMU_QUARANTINE_BASIC
> + ---help---
> +   When a PCI device is assigned to an untrusted domain, it is possible
> +   for that domain to program the device to DMA to an arbitrary address.
> +   The IOMMU is used to protect the host from malicious DMA by making
> +   sure that the device addresses can only target memory assigned to the
> +   guest.  However, when the guest domain is torn down, assigning the
> +   device back to the hardware domain would allow any 

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-09 Thread Tian, Kevin
> From: Jan Beulich 
> Sent: Monday, March 9, 2020 7:09 PM
> 
> Containing still in flight DMA was introduced to work around certain
> devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
> Passing through (such) devices (on such systems) is inherently insecure
> (as guests could easily arrange for IOMMU faults of any kind to occur).
> Defaulting to a mode where admins may not even become aware of issues
> with devices can be considered undesirable. Therefore convert this mode
> of operation to an optional one, not one enabled by default.

Here is another thought. The whole point of quarantine is to contain
the device after it is deassigned from untrusted guest. However, the
passthrough of such device is already insecure, as you mentioned. 
Then why do we care about making deassignment of such device
secure without doing anything to secure it when it is assigned and being
used by untrusted guest? I feel that one should simply put such device
out of the quarantine list in the first place, i.e. set quarantine=false and
then use tool to quarantine a whitelist of devices by skipping the bad one.

> 
> This involves resurrecting code commit ea38867831da ("x86 / iommu: set
> up a scratch page in the quarantine domain") did remove, in a slightly
> extended and abstracted fashion. Here, instead of reintroducing a pretty
> pointless use of "goto" in domain_context_unmap(), and instead of making
> the function (at least temporarily) inconsistent, take the opportunity
> and replace the other similarly pointless "goto" as well.
> 
> In order to key the re-instated bypasses off of there (not) being a root
> page table this further requires moving the allocate_domain_resources()
> invocation from reassign_device() to amd_iommu_setup_domain_device()
> (or
> else reassign_device() would allocate a root page table anyway); this is
> benign to the second caller of the latter function.
> 
> Take the opportunity and also limit the control to builds supporting
> PCI.
> 
> Signed-off-by: Jan Beulich 
> ---
> I'm happy to take better suggestions to replace the "full" command line
> option and Kconfig prompt tokens. I don't think though that "fault" and
> "write-fault" are really suitable there.
> ---
> This patch contextually depends on "[PATCH v2 0/5] IOMMU: restrict
> visibility/scope if certain variables".
> ---
> v3: IOMMU_quarantine_basic -> IOMMU_quarantine_fault,
> IOMMU_quarantine_full -> IOMMU_quarantine_write_fault. Kconfig
> option (choice) to select default. Limit to HAS_PCI.
> v2: Don't use true/false. Introduce QUARANTINE_SKIP() (albeit I'm not
> really convinced this is an improvement). Add comment.
> 
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -1238,7 +1238,7 @@ detection of systems known to misbehave
>  > Default: `new` unless directed-EOI is supported
> 
>  ### iommu
> -= List of [ , verbose, debug, force, required, quarantine,
> += List of [ , verbose, debug, force, required, quarantine[=full],
>  sharept, intremap, intpost, crash-disable,
>  snoop, qinval, igfx, amd-iommu-perdev-intremap,
>  dom0-{passthrough,strict} ]
> @@ -1276,11 +1276,15 @@ boolean (e.g. `iommu=no`) can override t
>  will prevent Xen from booting if IOMMUs aren't discovered and enabled
>  successfully.
> 
> -*   The `quarantine` boolean can be used to control Xen's behavior when
> -de-assigning devices from guests.  If enabled (the default), Xen always
> -quarantines such devices; they must be explicitly assigned back to Dom0
> -before they can be used there again.  If disabled, Xen will only
> -quarantine devices the toolstack hass arranged for getting quarantined.
> +*   The `quarantine` option can be used to control Xen's behavior when
> +de-assigning devices from guests.  If set to true (the default), Xen
> +always quarantines such devices; they must be explicitly assigned back
> +to Dom0 before they can be used there again.  If set to "full", still
> +active DMA will additionally be directed to a "sink" page.  If set to
> +false, Xen will only quarantine devices the toolstack has arranged for
> +getting quarantined.
> +
> +This option is only valid on builds supporting PCI.
> 
>  *   The `sharept` boolean controls whether the IOMMU pagetables are
> shared
>  with the CPU-side HAP pagetables, or allocated separately.  Sharing
> --- a/xen/drivers/passthrough/Kconfig
> +++ b/xen/drivers/passthrough/Kconfig
> @@ -28,3 +28,31 @@ endif
> 
>  config IOMMU_FORCE_PT_SHARE
>   bool
> +
> +choice
> + prompt "IOMMU device quarantining default behavior"
> + depends on HAS_PCI
> + default IOMMU_QUARANTINE_BASIC
> + ---help---
> +   When a PCI device is assigned to an untrusted domain, it is possible
> +   for that domain to program the device to DMA to an arbitrary
> address.
> +   The IOMMU is used to protect the host from 

Re: [Xen-devel] [PATCH v3] IOMMU: make DMA containment of quarantined devices optional

2020-03-09 Thread Tian, Kevin
> From: Jan Beulich 
> Sent: Monday, March 9, 2020 7:09 PM
> 
> Containing still in flight DMA was introduced to work around certain
> devices / systems hanging hard upon hitting a "not-present" IOMMU fault.
> Passing through (such) devices (on such systems) is inherently insecure
> (as guests could easily arrange for IOMMU faults of any kind to occur).
> Defaulting to a mode where admins may not even become aware of issues
> with devices can be considered undesirable. Therefore convert this mode
> of operation to an optional one, not one enabled by default.
> 
> This involves resurrecting code commit ea38867831da ("x86 / iommu: set
> up a scratch page in the quarantine domain") did remove, in a slightly
> extended and abstracted fashion. Here, instead of reintroducing a pretty
> pointless use of "goto" in domain_context_unmap(), and instead of making
> the function (at least temporarily) inconsistent, take the opportunity
> and replace the other similarly pointless "goto" as well.
> 
> In order to key the re-instated bypasses off of there (not) being a root
> page table this further requires moving the allocate_domain_resources()
> invocation from reassign_device() to amd_iommu_setup_domain_device()
> (or
> else reassign_device() would allocate a root page table anyway); this is
> benign to the second caller of the latter function.
> 
> Take the opportunity and also limit the control to builds supporting
> PCI.
> 
> Signed-off-by: Jan Beulich 
> ---
> I'm happy to take better suggestions to replace the "full" command line
> option and Kconfig prompt tokens. I don't think though that "fault" and
> "write-fault" are really suitable there.

I think we may just allow both r/w access to scratch page for such bogus
device, which may make 'full' more reasonable since we now fully
contain in-fly DMAs. I'm not sure about the value of keeping write-fault
alone for such devices (just because one observed his specific device only 
has problem with read-fault).

alternatively I also thought about whether whitelisting the problematic 
devices through another option (e.g. nofault=b:d:f) could provide more
value. In concept any IOMMU page table (dom0, dom_io or domU) 
for such bogus device should not include invalid entry, even when 
quarantine is not specified. However I'm not sure whether it's worthy of 
going so far...

> ---
> This patch contextually depends on "[PATCH v2 0/5] IOMMU: restrict
> visibility/scope if certain variables".
> ---
> v3: IOMMU_quarantine_basic -> IOMMU_quarantine_fault,
> IOMMU_quarantine_full -> IOMMU_quarantine_write_fault. Kconfig
> option (choice) to select default. Limit to HAS_PCI.
> v2: Don't use true/false. Introduce QUARANTINE_SKIP() (albeit I'm not
> really convinced this is an improvement). Add comment.
> 
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -1238,7 +1238,7 @@ detection of systems known to misbehave
>  > Default: `new` unless directed-EOI is supported
> 
>  ### iommu
> -= List of [ , verbose, debug, force, required, quarantine,
> += List of [ , verbose, debug, force, required, quarantine[=full],
>  sharept, intremap, intpost, crash-disable,
>  snoop, qinval, igfx, amd-iommu-perdev-intremap,
>  dom0-{passthrough,strict} ]
> @@ -1276,11 +1276,15 @@ boolean (e.g. `iommu=no`) can override t
>  will prevent Xen from booting if IOMMUs aren't discovered and enabled
>  successfully.
> 
> -*   The `quarantine` boolean can be used to control Xen's behavior when
> -de-assigning devices from guests.  If enabled (the default), Xen always
> -quarantines such devices; they must be explicitly assigned back to Dom0
> -before they can be used there again.  If disabled, Xen will only
> -quarantine devices the toolstack hass arranged for getting quarantined.
> +*   The `quarantine` option can be used to control Xen's behavior when
> +de-assigning devices from guests.  If set to true (the default), Xen
> +always quarantines such devices; they must be explicitly assigned back
> +to Dom0 before they can be used there again.  If set to "full", still
> +active DMA will additionally be directed to a "sink" page.  If set to
> +false, Xen will only quarantine devices the toolstack has arranged for
> +getting quarantined.
> +
> +This option is only valid on builds supporting PCI.
> 
>  *   The `sharept` boolean controls whether the IOMMU pagetables are
> shared
>  with the CPU-side HAP pagetables, or allocated separately.  Sharing
> --- a/xen/drivers/passthrough/Kconfig
> +++ b/xen/drivers/passthrough/Kconfig
> @@ -28,3 +28,31 @@ endif
> 
>  config IOMMU_FORCE_PT_SHARE
>   bool
> +
> +choice
> + prompt "IOMMU device quarantining default behavior"
> + depends on HAS_PCI
> + default IOMMU_QUARANTINE_BASIC
> + ---help---
> +   When a PCI device is assigned to an untrusted domain, it is possible
> +   for that