[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87y1kuhsz2.ffs@tglx>
Date: Thu, 08 Jun 2023 17:30:25 +0200
From: Thomas Gleixner <tglx@...utronix.de>
To: Jiri Slaby <jslaby@...e.cz>,
Andrew Cooper <andrew.cooper3@...rix.com>,
Nikolay Borisov <nik.borisov@...e.com>, x86@...nel.org
Cc: linux-kernel@...r.kernel.org, mhocko@...e.com
Subject: Re: [PATCH 3/3] x86: Disable running 32bit processes if
ia32_disabled is passed
On Thu, Jun 08 2023 at 08:16, Jiri Slaby wrote:
> On 08. 06. 23, 2:25, Thomas Gleixner wrote:
>> I really wish that we could disable syscall32 reliably on AMD and make
>> it raise #UD as it does on Intal.
>
> Sorry, I am likely missing something, but why is not #GP enough when we
> set CSTAR = 0?
Because you are not getting a #GP.
It will try to execute from virtual address 0 in CPL 0 and with RSP
still pointing to the user space stack. So you have several
possibilities:
1) 0 is mapped in user space and SMEP/SMAP is off.
Attacker won
2) 0 is not mapped or SMEP is on.
You get #PF from CPL0 and RSP is still pointing to the user space
stack. If SMAP is on this results in #DF
If SMAP is off, kernel uses an attacker controlled stack...
Similar sillies when you set it to a valid kernel address which is not
mapped or lacks X or contains invalid opcode ....
So no. CSTAR _must_ be a valid kernel text address which handles the
32bit syscall. Right now all it does is SYSRETL when IA32_EMULATION is
disabled.
So the only way to handle that is to have proper entry code which
switches to kernel context and then runs "syscall32_kill_myself()" which
kills the process hard and it exits without the chance to attempt a
return to user.
Anything else wont work.
Bah. Was it really necessary to bring this up so I hade to page in the
gory details of this hardware insanity again?
Thanks,
tglx
Powered by blists - more mailing lists