linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: "Yu, Yu-cheng" <yu-cheng.yu@intel.com>
To: Andy Lutomirski <luto@kernel.org>
Cc: X86 ML <x86@kernel.org>, "H. Peter Anvin" <hpa@zytor.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>,
	LKML <linux-kernel@vger.kernel.org>,
	"open list:DOCUMENTATION" <linux-doc@vger.kernel.org>,
	Linux-MM <linux-mm@kvack.org>,
	linux-arch <linux-arch@vger.kernel.org>,
	Linux API <linux-api@vger.kernel.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Balbir Singh <bsingharora@gmail.com>,
	Borislav Petkov <bp@alien8.de>,
	Cyrill Gorcunov <gorcunov@gmail.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Eugene Syromiatnikov <esyr@redhat.com>,
	Florian Weimer <fweimer@redhat.com>,
	"H.J. Lu" <hjl.tools@gmail.com>, Jann Horn <jannh@google.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Kees Cook <keescook@chromium.org>,
	Mike Kravetz <mike.kravetz@oracle.com>,
	Nadav Amit <nadav.amit@gmail.com>,
	Oleg Nesterov <oleg@redhat.com>, Pavel Machek <pavel@ucw.cz>,
	Peter Zijlstra <peterz@infradead.org>,
	Randy Dunlap <rdunlap@infradead.org>,
	"Ravi V. Shankar" <ravi.v.shankar@intel.com>,
	Vedvyas Shanbhogue <vedvyas.shanbhogue@intel.com>,
	Dave Martin <Dave.Martin@arm.com>,
	Weijiang Yang <weijiang.yang@intel.com>
Subject: Re: [PATCH v12 8/8] x86: Disallow vsyscall emulation when CET is enabled
Date: Tue, 22 Sep 2020 10:45:54 -0700	[thread overview]
Message-ID: <b3defc91-1e8e-d0d5-2ac3-3861a7e3355c@intel.com> (raw)
In-Reply-To: <CALCETrWssUxxfhPPJZgPOmpaQcf4o9qCe1j-P7yiPyZVV+O8ZQ@mail.gmail.com>

On 9/21/2020 4:48 PM, Andy Lutomirski wrote:
> On Mon, Sep 21, 2020 at 3:37 PM Yu-cheng Yu <yu-cheng.yu@intel.com> wrote:
>>
>> On Mon, 2020-09-21 at 09:22 -0700, Yu, Yu-cheng wrote:

[...]

>>
>> Here is the patch:
>>
>> ------
>>
>>  From dfdee39c795ee5dcee2c77f6ba344a61f4d8124b Mon Sep 17 00:00:00 2001
>> From: Yu-cheng Yu <yu-cheng.yu@intel.com>
>> Date: Thu, 29 Nov 2018 14:15:38 -0800
>> Subject: [PATCH 34/43] x86/vsyscall/64: Fixup Shadow Stack and Indirect Branch
>>   Tracking for vsyscall emulation
>>
>> Vsyscall entry points are effectively branch targets.  Mark them with
>> ENDBR64 opcodes.  When emulating the RET instruction, unwind the shadow
>> stack and reset IBT state machine.
>>
>> Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
>> ---
>>   arch/x86/entry/vsyscall/vsyscall_64.c     | 29 +++++++++++++++++++++++
>>   arch/x86/entry/vsyscall/vsyscall_emu_64.S |  9 +++++++
>>   arch/x86/entry/vsyscall/vsyscall_trace.h  |  1 +
>>   3 files changed, 39 insertions(+)
>>
>> diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c
>> b/arch/x86/entry/vsyscall/vsyscall_64.c
>> index 44c33103a955..0131c9f7f9c5 100644
>> --- a/arch/x86/entry/vsyscall/vsyscall_64.c
>> +++ b/arch/x86/entry/vsyscall/vsyscall_64.c
>> @@ -38,6 +38,9 @@
>>   #include <asm/fixmap.h>
>>   #include <asm/traps.h>
>>   #include <asm/paravirt.h>
>> +#include <asm/fpu/xstate.h>
>> +#include <asm/fpu/types.h>
>> +#include <asm/fpu/internal.h>
>>
>>   #define CREATE_TRACE_POINTS
>>   #include "vsyscall_trace.h"
>> @@ -286,6 +289,32 @@ bool emulate_vsyscall(unsigned long error_code,
>>          /* Emulate a ret instruction. */
>>          regs->ip = caller;
>>          regs->sp += 8;
>> +
>> +       if (current->thread.cet.shstk_size ||
>> +           current->thread.cet.ibt_enabled) {
>> +               u64 r;
>> +
>> +               fpregs_lock();
>> +               if (test_thread_flag(TIF_NEED_FPU_LOAD))
>> +                       __fpregs_load_activate();
> 
> Wouldn't this be nicer if you operated on the memory image, not the registers?

Do you mean writing to the XSAVES area?

> 
>> +
>> +#ifdef CONFIG_X86_INTEL_BRANCH_TRACKING_USER
>> +               /* Fixup branch tracking */
>> +               if (current->thread.cet.ibt_enabled) {
>> +                       rdmsrl(MSR_IA32_U_CET, r);
>> +                       wrmsrl(MSR_IA32_U_CET, r & ~CET_WAIT_ENDBR);
>> +               }
>> +#endif
> 
> Seems reasonable on first glance.
> 
>> +
>> +#ifdef CONFIG_X86_INTEL_SHADOW_STACK_USER
>> +               /* Unwind shadow stack. */
>> +               if (current->thread.cet.shstk_size) {
>> +                       rdmsrl(MSR_IA32_PL3_SSP, r);
>> +                       wrmsrl(MSR_IA32_PL3_SSP, r + 8);
>> +               }
>> +#endif
> 
> What happens if the result is noncanonical?  A quick skim of the SDM
> didn't find anything.  This latter issue goes away if you operate on
> the memory image, though -- writing a bogus value is just fine, since
> the FP restore will handle it.
> 

At this point, the MSR's value can still be valid or is already saved to 
memory.  If we are going to write to memory, then the MSR must be saved 
first.  So I chose to do __fpregs_load_activate() and write the MSR.

Maybe we can check the address before writing it to the MSR?

Yu-cheng


  reply	other threads:[~2020-09-22 17:46 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-18 19:23 [PATCH v12 0/8] Control-flow Enforcement: Indirect Branch Tracking Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 1/8] x86/cet/ibt: Add Kconfig option for user-mode " Yu-cheng Yu
2020-09-18 20:24   ` Randy Dunlap
2020-09-18 20:59     ` Pavel Machek
2020-09-18 21:08       ` H.J. Lu
2020-09-18 21:24         ` Pavel Machek
2020-09-18 21:36           ` H.J. Lu
2020-09-18 21:25       ` Yu, Yu-cheng
2020-09-18 21:40         ` Pavel Machek
2020-09-18 21:46           ` H.J. Lu
2020-09-18 22:03             ` Pavel Machek
2020-09-21 22:30           ` Yu, Yu-cheng
2020-09-21 22:41             ` Dave Hansen
2020-09-21 22:47               ` Yu, Yu-cheng
2020-09-21 22:54                 ` Dave Hansen
2020-09-21 23:27                   ` Yu, Yu-cheng
2020-09-21 22:52               ` Pavel Machek
2020-09-21 22:58                 ` Dave Hansen
2020-09-18 19:23 ` [PATCH v12 2/8] x86/cet/ibt: User-mode Indirect Branch Tracking support Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 3/8] x86/cet/ibt: Handle signals for Indirect Branch Tracking Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 4/8] x86/cet/ibt: ELF header parsing " Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 5/8] x86/cet/ibt: Update arch_prctl functions " Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 6/8] x86/vdso/32: Add ENDBR32 to __kernel_vsyscall entry point Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 7/8] x86/vdso: Insert endbr32/endbr64 to vDSO Yu-cheng Yu
2020-09-18 19:23 ` [PATCH v12 8/8] x86: Disallow vsyscall emulation when CET is enabled Yu-cheng Yu
2020-09-18 19:32   ` Dave Hansen
2020-09-18 21:00     ` Pavel Machek
2020-09-18 21:06       ` H.J. Lu
2020-09-18 21:17         ` Dave Hansen
2020-09-18 21:22           ` H.J. Lu
2020-09-18 21:28             ` Dave Hansen
2020-09-18 21:21       ` Yu, Yu-cheng
2020-09-18 21:22         ` Pavel Machek
2020-09-19  0:11   ` Andy Lutomirski
2020-09-21 16:22     ` Yu, Yu-cheng
2020-09-21 22:37       ` Yu-cheng Yu
2020-09-21 23:48         ` Andy Lutomirski
2020-09-22 17:45           ` Yu, Yu-cheng [this message]
2020-09-23 21:34             ` Andy Lutomirski
2020-09-23 22:07               ` Yu, Yu-cheng
2020-09-23 21:29           ` Sean Christopherson
2020-09-23 22:06             ` Yu, Yu-cheng
2020-09-23 22:08               ` Dave Hansen
2020-09-23 22:20                 ` Yu, Yu-cheng
2020-09-23 22:47                   ` Andy Lutomirski
2020-09-23 22:53                     ` Dave Hansen

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=b3defc91-1e8e-d0d5-2ac3-3861a7e3355c@intel.com \
    --to=yu-cheng.yu@intel.com \
    --cc=Dave.Martin@arm.com \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=bsingharora@gmail.com \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=esyr@redhat.com \
    --cc=fweimer@redhat.com \
    --cc=gorcunov@gmail.com \
    --cc=hjl.tools@gmail.com \
    --cc=hpa@zytor.com \
    --cc=jannh@google.com \
    --cc=keescook@chromium.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=luto@kernel.org \
    --cc=mike.kravetz@oracle.com \
    --cc=mingo@redhat.com \
    --cc=nadav.amit@gmail.com \
    --cc=oleg@redhat.com \
    --cc=pavel@ucw.cz \
    --cc=peterz@infradead.org \
    --cc=ravi.v.shankar@intel.com \
    --cc=rdunlap@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=vedvyas.shanbhogue@intel.com \
    --cc=weijiang.yang@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox