From: Kees Cook <kees@kernel.org>
To: Nikolay Borisov <nik.borisov@suse.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
Dave Hansen <dave.hansen@intel.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
Naveen N Rao <naveen@kernel.org>,
linux-kernel@vger.kernel.org, x86@kernel.org,
linux-coco@lists.linux.dev,
Dave Hansen <dave.hansen@linux.intel.com>,
Borislav Petkov <bp@alien8.de>,
Vishal Annapurve <vannapurve@google.com>,
Kirill Shutemov <kirill.shutemov@linux.intel.com>,
Kevin Loughlin <kevinloughlin@google.com>,
Michal Hocko <mhocko@suse.com>
Subject: Re: [RFC PATCH] x86/sev: Disallow userspace access to BIOS region for SEV-SNP guests
Date: Thu, 10 Apr 2025 09:32:54 -0700 [thread overview]
Message-ID: <202504100931.DEC3D3B79@keescook> (raw)
In-Reply-To: <e2933f6e-4bda-40ee-b69c-d7222082fcfd@suse.com>
On Thu, Apr 10, 2025 at 03:03:55PM +0300, Nikolay Borisov wrote:
>
>
> On 9.04.25 г. 21:39 ч., Dan Williams wrote:
> > Kees Cook wrote:
> > > On Tue, Apr 08, 2025 at 04:55:08PM -0700, Dan Williams wrote:
> > > > Dave Hansen wrote:
> > > > > On 4/8/25 06:43, Tom Lendacky wrote:
> > > > > > > Tom/Boris, do you see a problem blocking access to /dev/mem for SEV
> > > > > > > guests?
> > > > > > Not sure why we would suddenly not allow that.
> > > > >
> > > > > Both TDX and SEV-SNP have issues with allowing access to /dev/mem.
> > > > > Disallowing access to the individually troublesome regions can fix
> > > > > _part_ of the problem. But suddenly blocking access is guaranteed to fix
> > > > > *ALL* the problems forever.
> > > >
> > > > ...or at least solicits practical use cases for why the kernel needs to
> > > > poke holes in the policy.
> > > >
> > > > > Or, maybe we just start returning 0's for all reads and throw away all
> > > > > writes. That is probably less likely to break userspace that doesn't
> > > > > know what it's doing in the first place.
> > > >
> > > > Yes, and a bulk of the regression risk has already been pipe-cleaned by
> > > > KERNEL_LOCKDOWN that shuts down /dev/mem and PCI resource file mmap in
> > > > many scenarios.
> > > >
> > > > Here is an updated patch that includes some consideration for mapping
> > > > zeros for known legacy compatibility use cases.
> > [..]
> > > > diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
> > > > index bfa444a7dbb0..c8679ae1bc8b 100644
> > > > --- a/arch/x86/mm/init.c
> > > > +++ b/arch/x86/mm/init.c
> > > > @@ -867,6 +867,8 @@ void __init poking_init(void)
> > > > */
> > > > int devmem_is_allowed(unsigned long pagenr)
> > > > {
> > > > + bool platform_allowed = x86_platform.devmem_is_allowed(pagenr);
> > > > +
> > > > if (region_intersects(PFN_PHYS(pagenr), PAGE_SIZE,
> > > > IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE)
> > > > != REGION_DISJOINT) {
> > > > @@ -885,14 +887,20 @@ int devmem_is_allowed(unsigned long pagenr)
> > > > * restricted resource under CONFIG_STRICT_DEVMEM.
> > > > */
> > > > if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) {
> > > > - /* Low 1MB bypasses iomem restrictions. */
> > > > - if (pagenr < 256)
> > > > + /*
> > > > + * Low 1MB bypasses iomem restrictions unless the
> > > > + * platform says "no", in which case map zeroes
> > > > + */
> > > > + if (pagenr < 256) {
> > > > + if (!platform_allowed)
> > > > + return 2;
> > > > return 1;
> > > > + }
> > > > return 0;
> > > > }
> > > > - return 1;
> > > > + return platform_allowed;
> > > > }
> > > > void free_init_pages(const char *what, unsigned long begin, unsigned long end)
> > >
> > > I am reminded of this discussion:
> > > https://lore.kernel.org/all/CAPcyv4iVt=peUAk1qx_EfKn7aGJM=XwRUpJftBhkUgQEti2bJA@mail.gmail.com/
> > >
> > > As in, mmap will bypass this restriction, so if you really want the low
> > > 1MiB to be unreadable, a solution for mmap is still needed...
> >
> > Glad you remembered that!
> >
> > This needs a self-test to verify the assumptions here. I can circle back
> > next week or so take a look at turning this into a bigger series. If
> > someone has cycles to take this on before that I would not say no to
> > some help.
>
> Can't we simply treat return value of 2 for range_is_allowed the same way as
> if 0 was returned in mmap_mem and simply fail the call with -EPERM?
The historical concern was that EPERM would break old tools. I don't
have any current evidence either way, though.
--
Kees Cook
next prev parent reply other threads:[~2025-04-10 16:32 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-03 12:02 [RFC PATCH] x86/sev: Disallow userspace access to BIOS region for SEV-SNP guests Naveen N Rao (AMD)
2025-04-03 19:06 ` Dan Williams
2025-04-07 13:13 ` Naveen N Rao
2025-04-08 13:43 ` Tom Lendacky
2025-04-08 21:19 ` Dave Hansen
2025-04-08 23:55 ` Dan Williams
2025-04-09 16:02 ` Nikolay Borisov
2025-04-09 17:06 ` Dan Williams
2025-04-09 17:39 ` Kees Cook
2025-04-09 18:39 ` Dan Williams
2025-04-10 12:03 ` Nikolay Borisov
2025-04-10 16:32 ` Kees Cook [this message]
2025-04-10 16:39 ` Nikolay Borisov
2025-04-10 19:20 ` Dan Williams
2025-04-10 19:27 ` Nikolay Borisov
2025-04-10 20:07 ` Dan Williams
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=202504100931.DEC3D3B79@keescook \
--to=kees@kernel.org \
--cc=bp@alien8.de \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=kevinloughlin@google.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=mhocko@suse.com \
--cc=naveen@kernel.org \
--cc=nik.borisov@suse.com \
--cc=thomas.lendacky@amd.com \
--cc=vannapurve@google.com \
--cc=x86@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.