From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Samiullah Khawaja <skhawaja@google.com>,
Andy Lutomirski <luto@amacapital.net>
Cc: Jason Gunthorpe <jgg@ziepe.ca>,
Andrew Morton <akpm@linux-foundation.org>,
Hugh Dickins <hughd@google.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Muchun Song <muchun.song@linux.dev>,
Oscar Salvador <osalvador@suse.de>,
Jeff Layton <jlayton@kernel.org>, Chuck Lever <cel@kernel.org>,
Alexander Aring <alex.aring@gmail.com>,
Shuah Khan <shuah@kernel.org>, Gerd Hoffmann <kraxel@redhat.com>,
Vivek Kasireddy <vivek.kasireddy@intel.com>,
Jeff Xu <jeffxu@google.com>, David Matlack <dmatlack@google.com>,
Pasha Tatashin <tatashin@google.com>,
linux-mm@kvack.org, linux-api@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/2] mm/memfd: add F_SEAL_PUNCH_HOLE
Date: Sat, 31 Oct 2026 10:32:32 +0100 [thread overview]
Message-ID: <bb50fcfa-9d71-4905-a76a-ab7bc149d62b@kernel.org> (raw)
In-Reply-To: <auVRLPmbWYvMnly-@google.com>
On 10/31/26 04:03, Samiullah Khawaja wrote:
> On Fri, Oct 30, 2026 at 03:43:53PM -0700, Andy Lutomirski wrote:
>> On Fri, Oct 30, 2026 at 10:40 AM Samiullah Khawaja <skhawaja@google.com> wrote:
>>>
>>> >On 10/30/26 13:11, Jason Gunthorpe wrote:
>>> >> On Fri, Oct 30, 2026 at 11:20:30AM +0100, David Hildenbrand (Arm) wrote:
>>> >>>
>>> >>> We have the exact same situation when userspace maps anonymous folios
>>> into vfio
>>> >>> and then desides to MADV_DONTNEED the pages. Or any other memory backend
>>> that is
>>> >>> used for such purposes.
>>> >>>
>>> >>> User space must not zap/punch things that might be pinned elsewhere.
>>> >>>
>>> >>> That's not specific to memfd, udmabuf, iommufd or anything else.
>>> >>>
>>> >>> I don't see a reason to make userspace (that should not shoot itself into
>>> the
>>> >>> foot) a kernel feature it must activate itself to not shoot itself into
>>> the foot.
>>>
>>> Agreed, for normal use this is userspace's problem. The seal was meant
>>> for the kernel to cheaply verify at preserve time that nothing was
>>> punched.
>>>
>>> >>
>>> >> The issue is live update doesn't preserve those background punched
>>> >> folios and now we have created an UAF attack on the kernel across
>>> >> kexec if you don't do something about it.
>>> >>
>>> >> There was some notion here that with the right sealing flags we could
>>> >> tell if everything was 'live update compatible' and then know that
>>> >> these attacks are impossible.
>>> >Just remember that there was any hole punch and refuse to live update this
>>> instance.
>>> >
>>> >We could likely implement "we saw hole punch on a pinned folio" as well, but I
>>> >don't think that's required initially.
>>>
>>> If I understand correctly, you mean recording on the memfd that a hole
>>> punch happened, and refusing the live update if it did? That would work
>>> and is much cheaper than what we do today, where iommufd walks all the
>>> mapped pages at preserve time. For truncate, the existing F_SEAL_SHRINK
>>> is enough or I can record that also on the memfd. I will send patches
>>> for this.
>>
>> This entire situation continues to give me the willies. After much
>> prodding and contemplating (in my own brain), I got a friendly LLM to
>> report:
>>
>> --- begin AI output ---
>>
>> IOMMU_IOAS_MAP_FILE uses memfd_pin_folios(). Collapse [MADV_COLLAPSE
>> or khugepaged] checks the old folio’s reference count, so a pin
>> acquired before that check makes collapse fail.
>>
>> The problematic interleaving is:
>>
>> 1. collapse_file() locks and unmaps the old folio, then passes its
>> reference-count check (mm/khugepaged.c:2446).
>> 2. memfd_pin_folios() (mm/gup.c:3483) obtains the old folio from the
>> file’s XArray and pins it, without taking the folio lock.
>> 3. Collapse copies the contents and replaces the old cache entries
>> with the new huge folio. It does not repeat the reference check or
>> freeze the old count.
>> 4. IOAS retains the old physical pages; accesses through the file
>> use the new folio.
>>
>> --- end AI output ---
>>
>> Is this correct? I haven't personally verified it. But this whole
>
> Yes, I think this is correct. memfd_pin_folios() pins the folios
> directly without taking the folio lock. Other page cache lookups lock
> the folio and recheck folio->mapping, e.g. shmem_get_folio_gfp(). Only
> memfd_pin_folios() misses it.
>
> This scenario is different from punch hole or MADV_DONTNEED where the
> user decides to remove the pinned memory. Here the kernel is removing
> the pinned page without the user knowing. Collapse already checks the
> refcount to avoid this.
>
> The recent fix [1] by Chris already takes the folio lock for !uptodate
> folios. I think we can take the lock unconditionally and recheck
> folio->mapping, that should fix this. I can send a patch for this fix,
> if folks agree.
I have another patch from Anthropic on my "rework schlop" queue that should fix
this:
"mm/gup: pin memfd folios under the folio lock".
We'd do just what we do in other context now, which is checking under folio lock
whether the folio was truncated.
Care to send a proper fix?
--
Cheers,
David
prev parent reply other threads:[~2026-10-31 9:32 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 22:05 [PATCH 0/2] mm/memfd: add F_SEAL_PUNCH_HOLE Samiullah Khawaja
2026-10-26 22:05 ` [PATCH 1/2] " Samiullah Khawaja
2026-10-26 22:05 ` [PATCH 2/2] selftests/memfd: add F_SEAL_PUNCH_HOLE tests Samiullah Khawaja
2026-10-26 22:46 ` [PATCH 0/2] mm/memfd: add F_SEAL_PUNCH_HOLE Andy Lutomirski
2026-10-27 22:55 ` Samiullah Khawaja
2026-10-28 3:57 ` Andy Lutomirski
2026-10-29 23:16 ` Samiullah Khawaja
2026-10-30 0:26 ` Andy Lutomirski
2026-10-30 2:11 ` Andy Lutomirski
2026-10-30 12:12 ` Jason Gunthorpe
2026-10-30 14:54 ` Andy Lutomirski
2026-10-30 19:52 ` Andy Lutomirski
2026-10-30 10:20 ` David Hildenbrand (Arm)
2026-10-30 12:11 ` Jason Gunthorpe
2026-10-30 14:39 ` David Hildenbrand (Arm)
2026-10-30 15:11 ` Jason Gunthorpe
2026-10-30 17:40 ` Samiullah Khawaja
2026-10-30 22:43 ` Andy Lutomirski
2026-10-31 3:03 ` Samiullah Khawaja
2026-10-31 9:32 ` David Hildenbrand (Arm) [this message]
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=bb50fcfa-9d71-4905-a76a-ab7bc149d62b@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alex.aring@gmail.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=cel@kernel.org \
--cc=dmatlack@google.com \
--cc=hughd@google.com \
--cc=jeffxu@google.com \
--cc=jgg@ziepe.ca \
--cc=jlayton@kernel.org \
--cc=kraxel@redhat.com \
--cc=linux-api@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@amacapital.net \
--cc=muchun.song@linux.dev \
--cc=osalvador@suse.de \
--cc=shuah@kernel.org \
--cc=skhawaja@google.com \
--cc=tatashin@google.com \
--cc=vivek.kasireddy@intel.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