From: "Luis R. Rodriguez" <mcgrof@kernel.org>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: linux-efi <linux-efi@vger.kernel.org>,
Matt Fleming <matt@codeblueprint.co.uk>,
Will Deacon <will.deacon@arm.com>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
David Howells <dhowells@redhat.com>,
David Brown <david.brown@linaro.org>,
Peter Jones <pjones@redhat.com>,
"H . Peter Anvin" <hpa@zytor.com>,
"open list:ANDROID DRIVERS" <devel@driverdev.osuosl.org>,
linux-security-module <linux-security-module@vger.kernel.org>,
Nicolas Broeking <nbroeking@me.com>,
Jonathan Corbet <corbet@lwn.net>,
the arch/x86 maintainers <x86@kernel.org>,
"Luis R. Rodriguez" <mcgrof@kernel.org>,
Ingo Molnar <mingo@redhat.com>, Vlastimil Babka <vbabka@suse.cz>,
Andy Gross <andy.gross@linaro.org>,
Darren Hart <dvhart@infradead.org>,
Mimi Zohar <zohar@linux.vnet.ibm.com>,
platform-driver-x86@vger.kernel.org,
Arend Van Spriel <arend.vanspriel@broadcom.com>,
Todd Kjos <tkjos@android.com>,
Kees
Subject: Re: Do Qualcomm drivers use DMA buffers for request_firmware_into_buf()?
Date: Thu, 28 Jun 2018 01:33:31 +0200 [thread overview]
Message-ID: <20180627233331.GC21242@wotan.suse.de> (raw)
In-Reply-To: <CAKv+Gu-CZpr_tBs_+xz2uGAXcO5k5nKnfeqiD0qtH1AAfgU8+w@mail.gmail.com>
On Thu, Jun 28, 2018 at 12:21:47AM +0200, Ard Biesheuvel wrote:
> On 27 June 2018 at 20:00, Luis R. Rodriguez <mcgrof@kernel.org> wrote:
> > On Mon, Jun 25, 2018 at 05:08:08PM -0700, Bjorn Andersson wrote:
> >> On Thu 07 Jun 11:42 PDT 2018, Ard Biesheuvel wrote:
> >>
> >> > On 7 June 2018 at 20:21, Bjorn Andersson <bjorn.andersson@linaro.org> wrote:
> >> > > On Thu 07 Jun 09:33 PDT 2018, Greg Kroah-Hartman wrote:
> >> [..]
> >> > >>
> >> > >> Why not just use kmalloc, it will always return a DMAable buffer.
> >> > >>
> >> > >
> >> > > For the buffers being targeted by request_firmware_into_buf() the
> >> > > problem is that some of them has requirements of physical placement and
> >> > > they are all too big for kmalloc() (i.e. tens of mb).
> >> > >
> >> > >
> >> > > For the dma_alloc_coherent() buffer that was mentioned earlier, which is
> >> > > not related to the firmware loading, it's not used because the buffer is
> >> > > passed to secure world, which temporarily locks Linux out from the
> >> > > memory region. Traditionally this region was kmalloc'ed downstream, but
> >> > > due to speculative access violations this code moved to use the DMA
> >> > > streaming API, although there's no actual DMA going on.
> >> > >
> >> >
> >> > OK, so you are relying on the fact that dma_alloc_coherent() gives you
> >> > a device mapping (because the qcom_scm device is described as non
> >> > cache coherent), but this sounds risky to me. The linear alias of that
> >> > memory will still be mapped cacheable, and could potentially still be
> >> > accessed speculatively AFAIK.
> >> >
> >>
> >> Yes and we are aware of the risk of having the linear alias present, but
> >> have yet to find a suitable way to handle this.
> >>
> >> The proposed mechanism was to use reserved-memory and memremap() the
> >> region while it should be available in Linux,
> >
> > That's still IO memory, and so it would be up to the specific device if
> > or not it could access the memory before a full write is done.
> >
>
> The risk here is about having aliases with mismatched attributes,
> which may result in loss of coherency and corrupt your data.
That risk is a perhaps a practical risk.
> This is
> not about the risk of loading a file with an invalid signature
This is a theoretical risk LSMs wish to determine and based on information
assess what to do.
> And what do you mean by 'IO memory'? Bus masters that are not behind
> an IOMMU can access all of the kernel's memory all of the time,
> regardless of whether and how it chooses to use it. So from a security
> perspective, there is no distinction, and you can only distinguish
> between before and after informing the device where it can find the
> firmware buffer in memory.
I mean that using memremap() or ioremap() will is designed to give
hardware access to memory for IO purposes, and how writes occur
will vary, and as such we cannot give LSMs guarantees over that
the firmware API will finish a write and that the data provided
really is correct.
> So given that we are dealing here with other masters that can change
> all of your memory behind your back, including the actual code you are
> running that implements the signature check,
LSMs have the option to trust the kernel, its about context and letting LSMs
decide. They have the right to not trust IO devices to a memory segment, as it
could break guarantees the kernel is making, so this is not about trust or
not, its about *information* and letting LSMs choose.
> I wonder if there is a
> point to obsessing about this use case from a validation point of
> view. The higher privilege level protects itself by doing its own
> signature check, and doing the same at a lower privilege level seems
> redundant to me.
Its up to LSMs to implement the policy.
> >> but while this would work
> >> for some cases (e.g. memory regions for semi-static firmware executed by
> >> co-processors) it doesn't handle the scenarios where the memory-need is
> >> dynamic.
> >>
> >> So suggestions are very welcome on how to better handle this.
> >
> > I *believe* Vlastimil's seems to suggest kvmalloc(), but note that if getting the
> > memory to be contiguous fails, it would fallback to a non-contiguous (vmalloc)
> > allocation.
I gave this some though and this obviously is just as good as trying to just use
kmalloc() as that is what is desired, the issue however *ensuring* that the allocation
will succeed. The only thing that I can think of there is somehow hinting upon boot
to reserve a special allocation for later use. If not at boot, perhaps a hint to
eventually give back the desired contigious allocation, but its beyond me if any
of this is in fact possible.
Luis
next prev parent reply other threads:[~2018-06-27 23:33 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20180408174014.21908-1-hdegoede@redhat.com>
[not found] ` <20180408174014.21908-3-hdegoede@redhat.com>
[not found] ` <20180423211143.GZ14440@wotan.suse.de>
[not found] ` <71e6a45a-398d-b7a4-dab0-8b9936683226@redhat.com>
[not found] ` <1524586021.3364.20.camel@linux.vnet.ibm.com>
[not found] ` <20180424234219.GX14440@wotan.suse.de>
[not found] ` <1524632409.3371.48.camel@linux.vnet.ibm.com>
2018-04-25 17:55 ` [PATCH v3 2/5] efi: Add embedded peripheral firmware support Luis R. Rodriguez
2018-05-04 0:21 ` Luis R. Rodriguez
2018-05-04 15:26 ` Martijn Coenen
2018-05-04 19:44 ` Martijn Coenen
2018-05-08 15:38 ` Luis R. Rodriguez
2018-05-08 16:10 ` Luis R. Rodriguez
2018-06-07 16:49 ` Bjorn Andersson
2018-06-07 18:22 ` Luis R. Rodriguez
2018-06-01 19:23 ` Luis R. Rodriguez
2018-06-06 20:32 ` Do Qualcomm drivers use DMA buffers for request_firmware_into_buf()? Luis R. Rodriguez
2018-06-06 20:41 ` Ard Biesheuvel
2018-06-06 22:29 ` Luis R. Rodriguez
2018-06-06 22:41 ` Ard Biesheuvel
2018-06-06 22:55 ` Luis R. Rodriguez
2018-06-07 16:18 ` Bjorn Andersson
2018-06-07 16:23 ` Ard Biesheuvel
2018-06-07 16:33 ` Greg Kroah-Hartman
2018-06-07 16:43 ` Ard Biesheuvel
2018-06-07 16:49 ` Greg Kroah-Hartman
2018-06-07 16:56 ` Ard Biesheuvel
2018-06-07 18:21 ` Bjorn Andersson
2018-06-07 18:42 ` Ard Biesheuvel
2018-06-26 0:08 ` Bjorn Andersson
2018-06-27 18:00 ` Luis R. Rodriguez
2018-06-27 22:21 ` Ard Biesheuvel
2018-06-27 23:33 ` Luis R. Rodriguez [this message]
2018-06-27 23:42 ` Ard Biesheuvel
2018-06-27 23:50 ` Luis R. Rodriguez
2018-06-08 6:41 ` Vlastimil Babka
2018-06-07 18:06 ` Bjorn Andersson
2018-06-18 23:49 ` Luis R. Rodriguez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180627233331.GC21242@wotan.suse.de \
--to=mcgrof@kernel.org \
--cc=andy.gross@linaro.org \
--cc=ard.biesheuvel@linaro.org \
--cc=arend.vanspriel@broadcom.com \
--cc=bjorn.andersson@linaro.org \
--cc=corbet@lwn.net \
--cc=david.brown@linaro.org \
--cc=devel@driverdev.osuosl.org \
--cc=dhowells@redhat.com \
--cc=dvhart@infradead.org \
--cc=hpa@zytor.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=matt@codeblueprint.co.uk \
--cc=mingo@redhat.com \
--cc=nbroeking@me.com \
--cc=pjones@redhat.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=tkjos@android.com \
--cc=vbabka@suse.cz \
--cc=will.deacon@arm.com \
--cc=x86@kernel.org \
--cc=zohar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox