* Re: double free in alternatives/retpoline
[not found] <CAPM=9ty750Ex93+9d6DJ1hFJE8XuhXOf7Q7dgXryvhGYLwHbdg@mail.gmail.com>
@ 2025-06-19 2:33 ` Linus Torvalds
2025-06-19 2:43 ` Dave Airlie
2025-06-19 3:31 ` Dave Airlie
0 siblings, 2 replies; 6+ messages in thread
From: Linus Torvalds @ 2025-06-19 2:33 UTC (permalink / raw)
To: Dave Airlie; +Cc: LKML, Ingo Molnar, Peter Zijlstra, nik.borisov, Mike Rapoport
[ Adding Mike Rapoport ]
On Wed, 18 Jun 2025 at 19:08, Dave Airlie <airlied@gmail.com> wrote:
>
> I've just tried to boot Linux master with KASAN enabled on a laptop here, and it showing a slab UAF for apply_retpolines.
>
> I haven't had a chance to bisect yet, and unfortunately I only have a photo of the oops.
Hmm.
I think it's due to commit a82b26451de1 ("x86/its: explicitly manage
permissions for ITS pages").
Maybe I'm mis-reading it entirely, but I think that "its_fini_core()"
thing is entirely bogus. It does that
kfree(its_pages.pages);
but as far as I can tell, that thing is happily used later by module
initialization.
Freeing the pages that have been used and marked ROX sounds like it
should be fine, but I think it should also do
its_pages.pages = NULL;
its_pages->num = 0;
so that any subsequent user that comes along due to modules or
whatever and does __its_alloc() will DTRT wrt the realloc().
But I might be completely barking up the wrong tree and mis-reading
things entirely. PeterZ? Mike?
Linus
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: double free in alternatives/retpoline
2025-06-19 2:33 ` double free in alternatives/retpoline Linus Torvalds
@ 2025-06-19 2:43 ` Dave Airlie
2025-06-19 3:31 ` Dave Airlie
1 sibling, 0 replies; 6+ messages in thread
From: Dave Airlie @ 2025-06-19 2:43 UTC (permalink / raw)
To: Linus Torvalds
Cc: LKML, Ingo Molnar, Peter Zijlstra, nik.borisov, Mike Rapoport
On Thu, 19 Jun 2025 at 12:33, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> [ Adding Mike Rapoport ]
>
> On Wed, 18 Jun 2025 at 19:08, Dave Airlie <airlied@gmail.com> wrote:
> >
> > I've just tried to boot Linux master with KASAN enabled on a laptop here, and it showing a slab UAF for apply_retpolines.
> >
> > I haven't had a chance to bisect yet, and unfortunately I only have a photo of the oops.
>
> Hmm.
>
> I think it's due to commit a82b26451de1 ("x86/its: explicitly manage
> permissions for ITS pages").
It's definitely ITS related, turning off CONFIG_MITIGATIONS_ITS lets
two test machines I have boot.
Dave.
>
> Maybe I'm mis-reading it entirely, but I think that "its_fini_core()"
> thing is entirely bogus. It does that
>
> kfree(its_pages.pages);
>
> but as far as I can tell, that thing is happily used later by module
> initialization.
>
> Freeing the pages that have been used and marked ROX sounds like it
> should be fine, but I think it should also do
>
> its_pages.pages = NULL;
> its_pages->num = 0;
>
> so that any subsequent user that comes along due to modules or
> whatever and does __its_alloc() will DTRT wrt the realloc().
>
> But I might be completely barking up the wrong tree and mis-reading
> things entirely. PeterZ? Mike?
>
> Linus
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: double free in alternatives/retpoline
2025-06-19 2:33 ` double free in alternatives/retpoline Linus Torvalds
2025-06-19 2:43 ` Dave Airlie
@ 2025-06-19 3:31 ` Dave Airlie
2025-06-19 7:47 ` Mike Rapoport
2025-06-19 8:06 ` Mike Rapoport
1 sibling, 2 replies; 6+ messages in thread
From: Dave Airlie @ 2025-06-19 3:31 UTC (permalink / raw)
To: Linus Torvalds
Cc: LKML, Ingo Molnar, Peter Zijlstra, nik.borisov, Mike Rapoport
On Thu, 19 Jun 2025 at 12:33, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> [ Adding Mike Rapoport ]
>
> On Wed, 18 Jun 2025 at 19:08, Dave Airlie <airlied@gmail.com> wrote:
> >
> > I've just tried to boot Linux master with KASAN enabled on a laptop here, and it showing a slab UAF for apply_retpolines.
> >
> > I haven't had a chance to bisect yet, and unfortunately I only have a photo of the oops.
>
> Hmm.
>
> I think it's due to commit a82b26451de1 ("x86/its: explicitly manage
> permissions for ITS pages").
>
> Maybe I'm mis-reading it entirely, but I think that "its_fini_core()"
> thing is entirely bogus. It does that
>
> kfree(its_pages.pages);
>
> but as far as I can tell, that thing is happily used later by module
> initialization.
>
> Freeing the pages that have been used and marked ROX sounds like it
> should be fine, but I think it should also do
>
> its_pages.pages = NULL;
> its_pages->num = 0;
>
> so that any subsequent user that comes along due to modules or
> whatever and does __its_alloc() will DTRT wrt the realloc().
>
> But I might be completely barking up the wrong tree and mis-reading
> things entirely. PeterZ? Mike?
I wonder if the module code also needs the same treatment,
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 6455f7f751b3..4653881a4ab3 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -182,6 +182,7 @@ static void its_fini_core(void)
if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
its_pages_protect(&its_pages);
kfree(its_pages.pages);
+ its_pages.pages = NULL;
}
#ifdef CONFIG_MODULES
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? y
@@ -220,6 +221,8 @@ void its_free_mod(struct module *mod)
execmem_free(page);
}
kfree(mod->arch.its_pages.pages);
+ mod->arch.its_pages.pages = NULL;
+ mod->arch.its_pages.num = 0;
}
#endif /* CONFIG_MODULES */
boots for me, but I've no idea what is required or sufficient.
Dave.
>
> Linus
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: double free in alternatives/retpoline
2025-06-19 3:31 ` Dave Airlie
@ 2025-06-19 7:47 ` Mike Rapoport
2025-06-19 8:06 ` Mike Rapoport
1 sibling, 0 replies; 6+ messages in thread
From: Mike Rapoport @ 2025-06-19 7:47 UTC (permalink / raw)
To: Dave Airlie
Cc: Linus Torvalds, LKML, Ingo Molnar, Peter Zijlstra, nik.borisov
Hi Dave,
On Thu, Jun 19, 2025 at 01:31:19PM +1000, Dave Airlie wrote:
> On Thu, 19 Jun 2025 at 12:33, Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
> >
> > On Wed, 18 Jun 2025 at 19:08, Dave Airlie <airlied@gmail.com> wrote:
> > >
> > > I've just tried to boot Linux master with KASAN enabled on a laptop here, and it showing a slab UAF for apply_retpolines.
Does oops happen in core code or when a module is loaded?
Can you share the kernel config?
> > > I haven't had a chance to bisect yet, and unfortunately I only have a photo of the oops.
Could still be useful :)
> > Hmm.
> >
> > I think it's due to commit a82b26451de1 ("x86/its: explicitly manage
> > permissions for ITS pages").
> >
> > Maybe I'm mis-reading it entirely, but I think that "its_fini_core()"
> > thing is entirely bogus. It does that
> >
> > kfree(its_pages.pages);
> >
> > but as far as I can tell, that thing is happily used later by module
> > initialization.
> >
> > Freeing the pages that have been used and marked ROX sounds like it
> > should be fine, but I think it should also do
> >
> > its_pages.pages = NULL;
> > its_pages->num = 0;
> >
> > so that any subsequent user that comes along due to modules or
> > whatever and does __its_alloc() will DTRT wrt the realloc().
its_fini_core() is called after all pages for the core kernel are
allocated, so there should be no reallocs that use its_pages.pages after
that.
Modules use a different array stored in the module structure itself and
that array is freed together with the reset of the module when the module
is removed.
Obviously I overlooked something because there's that UAF splat, but it's
not that module initialization reuses the same its_pages.
> > But I might be completely barking up the wrong tree and mis-reading
> > things entirely. PeterZ? Mike?
>
> I wonder if the module code also needs the same treatment,
>
> diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
> index 6455f7f751b3..4653881a4ab3 100644
> --- a/arch/x86/kernel/alternative.c
> +++ b/arch/x86/kernel/alternative.c
> @@ -182,6 +182,7 @@ static void its_fini_core(void)
> if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
> its_pages_protect(&its_pages);
> kfree(its_pages.pages);
> + its_pages.pages = NULL;
> }
>
> #ifdef CONFIG_MODULES
> (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? y
> @@ -220,6 +221,8 @@ void its_free_mod(struct module *mod)
> execmem_free(page);
> }
> kfree(mod->arch.its_pages.pages);
> + mod->arch.its_pages.pages = NULL;
> + mod->arch.its_pages.num = 0;
> }
> #endif /* CONFIG_MODULES */
>
> boots for me, but I've no idea what is required or sufficient.
This surely won't hurt, but I'd like to understand first why there was a
UAF spat at the first place.
> Dave.
> >
> > Linus
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: double free in alternatives/retpoline
2025-06-19 3:31 ` Dave Airlie
2025-06-19 7:47 ` Mike Rapoport
@ 2025-06-19 8:06 ` Mike Rapoport
2025-06-19 10:49 ` Peter Zijlstra
1 sibling, 1 reply; 6+ messages in thread
From: Mike Rapoport @ 2025-06-19 8:06 UTC (permalink / raw)
To: Dave Airlie
Cc: Linus Torvalds, LKML, Ingo Molnar, Peter Zijlstra, nik.borisov,
Lukas Bulwahn
On Thu, Jun 19, 2025 at 01:31:19PM +1000, Dave Airlie wrote:
> On Thu, 19 Jun 2025 at 12:33, Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
> >
> > [ Adding Mike Rapoport ]
> >
> > On Wed, 18 Jun 2025 at 19:08, Dave Airlie <airlied@gmail.com> wrote:
> > >
> > > I've just tried to boot Linux master with KASAN enabled on a laptop here, and it showing a slab UAF for apply_retpolines.
> > >
> > > I haven't had a chance to bisect yet, and unfortunately I only have a photo of the oops.
> >
> > Hmm.
> >
> > I think it's due to commit a82b26451de1 ("x86/its: explicitly manage
> > permissions for ITS pages").
> >
> > Maybe I'm mis-reading it entirely, but I think that "its_fini_core()"
> > thing is entirely bogus. It does that
> >
> > kfree(its_pages.pages);
> >
> > but as far as I can tell, that thing is happily used later by module
> > initialization.
> >
> > Freeing the pages that have been used and marked ROX sounds like it
> > should be fine, but I think it should also do
> >
> > its_pages.pages = NULL;
> > its_pages->num = 0;
> >
> > so that any subsequent user that comes along due to modules or
> > whatever and does __its_alloc() will DTRT wrt the realloc().
> >
> > But I might be completely barking up the wrong tree and mis-reading
> > things entirely. PeterZ? Mike?
>
> I wonder if the module code also needs the same treatment,
Looking more closely, there is a typo in its_alloc(), it uses CONFIG_MODULE
to choose an its_array to reallocate while it should have been using
CONFIG_MODULES.
Lukas Bulwahn sent a fix for that:
https://lore.kernel.org/all/20250616100432.22941-1-lukas.bulwahn@redhat.com
> diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
> index 6455f7f751b3..4653881a4ab3 100644
> --- a/arch/x86/kernel/alternative.c
> +++ b/arch/x86/kernel/alternative.c
> @@ -182,6 +182,7 @@ static void its_fini_core(void)
> if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
> its_pages_protect(&its_pages);
> kfree(its_pages.pages);
> + its_pages.pages = NULL;
> }
>
> #ifdef CONFIG_MODULES
> (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? y
> @@ -220,6 +221,8 @@ void its_free_mod(struct module *mod)
> execmem_free(page);
> }
> kfree(mod->arch.its_pages.pages);
> + mod->arch.its_pages.pages = NULL;
> + mod->arch.its_pages.num = 0;
> }
> #endif /* CONFIG_MODULES */
>
> boots for me, but I've no idea what is required or sufficient.
>
> Dave.
> >
> > Linus
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: double free in alternatives/retpoline
2025-06-19 8:06 ` Mike Rapoport
@ 2025-06-19 10:49 ` Peter Zijlstra
0 siblings, 0 replies; 6+ messages in thread
From: Peter Zijlstra @ 2025-06-19 10:49 UTC (permalink / raw)
To: Mike Rapoport
Cc: Dave Airlie, Linus Torvalds, LKML, Ingo Molnar, nik.borisov,
Lukas Bulwahn
On Thu, Jun 19, 2025 at 11:06:53AM +0300, Mike Rapoport wrote:
> Looking more closely, there is a typo in its_alloc(), it uses CONFIG_MODULE
> to choose an its_array to reallocate while it should have been using
> CONFIG_MODULES.
>
> Lukas Bulwahn sent a fix for that:
>
> https://lore.kernel.org/all/20250616100432.22941-1-lukas.bulwahn@redhat.com
Indeed. That fix is currently sitting in tip/x86/urgent and should make
its way to Linus soon.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-06-19 10:54 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CAPM=9ty750Ex93+9d6DJ1hFJE8XuhXOf7Q7dgXryvhGYLwHbdg@mail.gmail.com>
2025-06-19 2:33 ` double free in alternatives/retpoline Linus Torvalds
2025-06-19 2:43 ` Dave Airlie
2025-06-19 3:31 ` Dave Airlie
2025-06-19 7:47 ` Mike Rapoport
2025-06-19 8:06 ` Mike Rapoport
2025-06-19 10:49 ` Peter Zijlstra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).