Re: [PATCH 0/2] mm: fix UAF caused by race between ptdump and vmap pgtable freeing

From: Dev Jain

Date: Sun Jul 12 2026 - 07:34:47 EST




On 12/07/26 2:16 pm, Lorenzo Stoakes wrote:
> On Sun, Jul 12, 2026 at 12:50:08PM +0530, Dev Jain wrote:
>> Will Deacon had pushed back on a similar approach:
>> https://lore.kernel.org/all/20250530123527.GA30463@willie-the-truck/
>>
>> Although now when I read back that thread, it feels more so like my
>> incompetency to convince :) because:
>
> No haha not so, I think more like this stuff is fiddly.
>
>>
>> 1. I don't think this pmd_free_pte_page() path is a hot path at all
>
> Right, and we don't actually alter that path anyway
>
>>
>> 2. We are doing a try lock which is almost guaranteed to succeed,
>> so it's not like we are losing out on block mappings
>
> Also it's specifically only on when vmap tries to make a mapping huge, and
> this path is being inconsistent with a convention that already existed - if
> you manipulate kernel page table mappings that can interact with other page
> table walkers, you have to take the init_mm mmap lock.
>
>>
>> 3. Any overhead from the try lock will get dominated by the pgtable
>> page free/TLB flush
>
> Yup.
>
>>
>> I guess you did not take the RCU approach because that would put code
>> into the generic kernel pgtable freeing path.
>
> Well a number of reasons:
>
> * firstly yes it makes the code path always RCU only to suit a specific
> debug user as you say :)
>
> * Importantly - we risk genuine RCU stall issues, because the ptdump then
> has to be RCU too over vast ranges.
>
> To work around that you have to shard the ptdump walk, make an assumption
> all callbacks are RCU-safe, and that the sharding suffices to avoid these
> stalls.
>
> It's a ton of complexity and assumptions to account for... vmalloc doing
> the wrong thing.
>
> * It is an established precedent that we mmap lock init_mm for kernel page
> table walking as per mm/pagewalk.c. It'd require significant rework there
> and would disallow any future walkers like this if we were to require
> RCU.
>
> * The mmap lock approach is simple, safe, and as you say is only actually
> required in code paths that manipulate page tables and thus are already
> not hotpaths.
>
> * If there's future work to free vmalloc page tables upon vunmap()
> (currently it does not), we have a stable, established basis for doing so
> that again puts the weight of the work on the operation being performed
> rather than anything else.
>
>>
>> I liked the RCU approach because I hate the fact that ptdump takes
>> an mmap_write_lock when it is literally only reading the pgtables.
>
> Well you have to do that for the userland side, because there could be a
> concurrent downgraded mmap read lock during an munmap, and the same goes
> for non-VMA kernel ranges too, so it would have to keep doing that
> regardless.

Oh right, I didn't know x86 was using ptdump for user tables too.


>
>> But your approach is simpler and fixes the problem at the particular spot
>> and not hammers the fix into a generic path. So overall, ACK.
>
> Thanks!
>
>>
>>
>>> Lorenzo Stoakes (2):
>>> mm/vmalloc: acquire init_mm read lock on huge vmap promotion
>>> Revert "arm64: Enable vmalloc-huge with ptdump"
>>>
>>> arch/arm64/include/asm/ptdump.h | 2 --
>>> arch/arm64/mm/mmu.c | 43 ++++-------------------------------------
>>> arch/arm64/mm/ptdump.c | 11 ++---------
>>> include/linux/mmap_lock.h | 1 +
>>> mm/pagewalk.c | 22 +++++++++++----------
>>> mm/vmalloc.c | 41 ++++++++++++++++++++++++++++++---------
>>> 6 files changed, 51 insertions(+), 69 deletions(-)
>>> ---
>>> base-commit: a635d6748234582ea287c5ffeae28b9b23f91c7e
>>> change-id: 20260710-series-vmap-race-fix-2a4cac988938
>>>
>>> Cheers,
>>
>
> Cheers, Lorenzo