linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lai Jiangshan <laijs@linux.alibaba.com>
To: Peter Zijlstra <peterz@infradead.org>,
	Lai Jiangshan <jiangshanlai@gmail.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Javier Martinez Canillas <javierm@redhat.com>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	Brijesh Singh <brijesh.singh@amd.com>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Juergen Gross <jgross@suse.com>
Subject: Re: [PATCH V5 03/50] x86/traps: Remove stack-protector from traps.c
Date: Fri, 19 Nov 2021 09:38:17 +0800	[thread overview]
Message-ID: <d74f249a-5dba-e45b-0779-65fad1b63ba6@linux.alibaba.com> (raw)
In-Reply-To: <20211118195504.GM174703@worktop.programming.kicks-ass.net>



On 2021/11/19 03:55, Peter Zijlstra wrote:
> On Wed, Nov 10, 2021 at 07:56:49PM +0800, Lai Jiangshan wrote:
>> From: Lai Jiangshan <laijs@linux.alibaba.com>
>>
>> When stack-protector is enabled, the compiler adds some instrument code
>> at the beginning and the end of some functions. Many functions in traps.c
>> are non-instrumentable.  Moreover, stack-protector code in the beginning
>> of the affected function accesses the canary that might be watched by
>> hardware breakpoints which also violate the non-instrumentable
>> nature of some functions and might cause infinite recursive #DB because
>> the canary is accessed before resetting the dr7.
>>
>> So it is better to remove stack-protector from traps.c.
>>
>> It is also prepared for later patches that move some entry code into
>> traps.c, some of which can NOT use percpu register until gsbase is
>> properly switched.  And stack-protector depends on the percpu register
>> to work.
>>
>> Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
>> ---
>>   arch/x86/kernel/Makefile | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
>> index 2ff3e600f426..8ac45801ba8b 100644
>> --- a/arch/x86/kernel/Makefile
>> +++ b/arch/x86/kernel/Makefile
>> @@ -50,6 +50,7 @@ KCOV_INSTRUMENT		:= n
>>   
>>   CFLAGS_head$(BITS).o	+= -fno-stack-protector
>>   CFLAGS_cc_platform.o	+= -fno-stack-protector
>> +CFLAGS_traps.o		+= -fno-stack-protector
> 
> Well, there's a lot more noinstr than just in traps. 

Although it is stupid to put hardware break point on the stack canary,
it is fatal only in traps.c when the canary is accessed before
resetting the dr7 in #DB handler.

And this only happens when the administer of the system is deliberately
hurting the system, so the fix is not strongly required in this problem.

The best way is to disallow hw_breakpoint to watch the stack canary.

The later patch (patch39) puts __entry_code into traps.c which makes
no_stack_protector is strongly required, so this patch just simply puts
the -fno-stack-protector on traps.c.

> There's also real C
> code in traps. This isn't really a solution.

This patch focuses "hardware break point on the stack canary" only.

It is not a full solution [for other unhappiness when noistr is watching
by stack protector].

I will switch to disallow hw_breakpoint to watch the stack canary.

> 
> I think GCC has recently grown __attribute__((no_stack_protector)),
> which should be added to noinstr (GCC-11 and above).
> 
> Additionally we could add code to objtool to detect this problem.
> 

  reply	other threads:[~2021-11-19  1:38 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-10 11:56 [PATCH V5 00/50] x86/entry/64: Convert a bunch of ASM entry code into C code Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 01/50] x86/entry: Add fence for kernel entry swapgs in paranoid_entry() Lai Jiangshan
2021-11-18 15:54   ` Peter Zijlstra
2021-11-18 17:27     ` Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 02/50] x86/entry: Use the correct fence macro after swapgs in kernel CR3 Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 03/50] x86/traps: Remove stack-protector from traps.c Lai Jiangshan
2021-11-18 19:55   ` Peter Zijlstra
2021-11-19  1:38     ` Lai Jiangshan [this message]
2021-11-10 11:56 ` [PATCH V5 04/50] x86/xen: Add xenpv_restore_regs_and_return_to_usermode() Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 05/50] x86/entry: Use swapgs and native_iret directly in swapgs_restore_regs_and_return_to_usermode Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 06/50] compiler_types.h: Add __noinstr_section() for noinstr Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 07/50] x86/entry: Introduce __entry_text for entry code written in C Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 08/50] x86/entry: Move PTI_USER_* to arch/x86/include/asm/processor-flags.h Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 09/50] x86: Remove unused kernel_to_user_p4dp() and user_to_kernel_p4dp() Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 10/50] x86: Replace PTI_PGTABLE_SWITCH_BIT with PTI_USER_PGTABLE_BIT Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 11/50] x86: Mark __native_read_cr3() & native_write_cr3() as __always_inline Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 12/50] x86/traps: Move the declaration of native_irq_return_iret into proto.h Lai Jiangshan
2021-11-10 11:56 ` [PATCH V5 13/50] x86/entry: Add arch/x86/entry/entry64.c for C entry code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 14/50] x86/entry: Expose the address of .Lgs_change to entry64.c Lai Jiangshan
2021-11-18 20:13   ` Peter Zijlstra
2021-11-10 11:57 ` [PATCH V5 15/50] x86/entry: Add C verion of SWITCH_TO_KERNEL_CR3 as switch_to_kernel_cr3() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 16/50] x86/traps: Add fence_swapgs_{user,kernel}_entry() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 17/50] x86/entry: Add C user_entry_swapgs_and_fence() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 18/50] x86/traps: Move pt_regs only in fixup_bad_iret() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 19/50] x86/entry: Switch the stack after error_entry() returns Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 20/50] x86/entry: move PUSH_AND_CLEAR_REGS out of error_entry Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 21/50] x86/entry: Move cld to the start of idtentry Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 22/50] x86/entry: Don't call error_entry for XENPV Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 23/50] x86/entry: Convert SWAPGS to swapgs in error_entry() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 24/50] x86/entry: Implement the whole error_entry() as C code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 25/50] x86/entry: Use idtentry macro for entry_INT80_compat Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 26/50] x86/entry: Convert SWAPGS to swapgs in entry_SYSENTER_compat() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 27/50] x86: Remove the definition of SWAPGS Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 28/50] x86/entry: Make paranoid_exit() callable Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 29/50] x86/entry: Call paranoid_exit() in asm_exc_nmi() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 30/50] x86/entry: move PUSH_AND_CLEAR_REGS out of paranoid_entry Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 31/50] x86/entry: Add the C version ist_switch_to_kernel_cr3() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 32/50] x86/entry: Skip CR3 write when the saved CR3 is kernel CR3 in RESTORE_CR3 Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 33/50] x86/entry: Add the C version ist_restore_cr3() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 34/50] x86/entry: Add the C version get_percpu_base() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 35/50] x86/entry: Add the C version ist_switch_to_kernel_gsbase() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 36/50] x86/entry: Implement the C version ist_paranoid_entry() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 37/50] x86/entry: Implement the C version ist_paranoid_exit() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 38/50] x86/entry: Add a C macro to define the function body for IST in .entry.text Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 39/50] x86/debug, mce: Use C entry code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 40/50] x86/idtentry.h: Move the definitions *IDTENTRY_{MCE|DEBUG}* up Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 41/50] x86/nmi: Use DEFINE_IDTENTRY_NMI for nmi Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 42/50] x86/nmi: Use C entry code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 43/50] x86/entry: Add a C macro to define the function body for IST in .entry.text with an error code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 44/50] x86/doublefault: Use C entry code Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 45/50] x86/sev: Add and use ist_vc_switch_off_ist() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 46/50] x86/sev: Use C entry code Lai Jiangshan
2021-11-18  9:31   ` Liam Merwick
2021-11-18 11:04     ` Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 47/50] x86/entry: Remove ASM function paranoid_entry() and paranoid_exit() Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 48/50] x86/entry: Remove the unused ASM macros Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 49/50] x86/entry: Remove save_ret from PUSH_AND_CLEAR_REGS Lai Jiangshan
2021-11-10 11:57 ` [PATCH V5 50/50] x86/syscall/64: Move the checking for sysret to C code Lai Jiangshan
2021-11-18  8:54 ` [PATCH V5 00/50] x86/entry/64: Convert a bunch of ASM entry code into " Lai Jiangshan

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=d74f249a-5dba-e45b-0779-65fad1b63ba6@linux.alibaba.com \
    --to=laijs@linux.alibaba.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=brijesh.singh@amd.com \
    --cc=bristot@redhat.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=javierm@redhat.com \
    --cc=jgross@suse.com \
    --cc=jiangshanlai@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=thomas.lendacky@amd.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;
as well as URLs for NNTP newsgroup(s).