All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: linux-kernel@vger.kernel.org
Cc: linux-tip-commits@vger.kernel.org,
	Andy Lutomirski <luto@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Borislav Petkov <bp@alien8.de>,
	Peter Zijlstra <peterz@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Ingo Molnar <mingo@kernel.org>, x86 <x86@kernel.org>
Subject: Re: [tip: x86/urgent] lkdtm: Add a DOUBLE_FAULT crash type on x86
Date: Wed, 27 Nov 2019 09:44:59 -0800	[thread overview]
Message-ID: <201911270942.0F120BF82@keescook> (raw)
In-Reply-To: <157484277010.21853.17013724751521586684.tip-bot2@tip-bot2>

On Wed, Nov 27, 2019 at 08:19:30AM -0000, tip-bot2 for Andy Lutomirski wrote:
> The following commit has been merged into the x86/urgent branch of tip:
> 
> Commit-ID:     b09511c253e5c739a60952b97c071a93e92b2e88
> Gitweb:        https://git.kernel.org/tip/b09511c253e5c739a60952b97c071a93e92b2e88
> Author:        Andy Lutomirski <luto@kernel.org>
> AuthorDate:    Sun, 24 Nov 2019 21:18:04 -08:00
> Committer:     Ingo Molnar <mingo@kernel.org>
> CommitterDate: Tue, 26 Nov 2019 21:53:34 +01:00
> 
> lkdtm: Add a DOUBLE_FAULT crash type on x86
> 
> The DOUBLE_FAULT crash does INT $8, which is a decent approximation
> of a double fault.  This is useful for testing the double fault
> handling.  Use it like:
> 
> Signed-off-by: Andy Lutomirski <luto@kernel.org>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Borislav Petkov <bp@alien8.de>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Signed-off-by: Ingo Molnar <mingo@kernel.org>
> ---
>  drivers/misc/lkdtm/bugs.c  | 39 +++++++++++++++++++++++++++++++++++++-
>  drivers/misc/lkdtm/core.c  |  3 +++-
>  drivers/misc/lkdtm/lkdtm.h |  3 +++-
>  3 files changed, 45 insertions(+)
> 
> diff --git a/drivers/misc/lkdtm/bugs.c b/drivers/misc/lkdtm/bugs.c
> index 7284a22..a4fdad0 100644
> --- a/drivers/misc/lkdtm/bugs.c
> +++ b/drivers/misc/lkdtm/bugs.c
> @@ -12,6 +12,10 @@
>  #include <linux/sched/task_stack.h>
>  #include <linux/uaccess.h>
>  
> +#ifdef CONFIG_X86_32
> +#include <asm/desc.h>
> +#endif
> +
>  struct lkdtm_list {
>  	struct list_head node;
>  };
> @@ -337,3 +341,38 @@ void lkdtm_UNSET_SMEP(void)
>  	pr_err("FAIL: this test is x86_64-only\n");
>  #endif
>  }
> +
> +#ifdef CONFIG_X86_32
> +void lkdtm_DOUBLE_FAULT(void)
> +{
> +	/*
> +	 * Trigger #DF by setting the stack limit to zero.  This clobbers
> +	 * a GDT TLS slot, which is okay because the current task will die
> +	 * anyway due to the double fault.
> +	 */
> +	struct desc_struct d = {
> +		.type = 3,	/* expand-up, writable, accessed data */
> +		.p = 1,		/* present */
> +		.d = 1,		/* 32-bit */
> +		.g = 0,		/* limit in bytes */
> +		.s = 1,		/* not system */
> +	};
> +
> +	local_irq_disable();
> +	write_gdt_entry(get_cpu_gdt_rw(smp_processor_id()),
> +			GDT_ENTRY_TLS_MIN, &d, DESCTYPE_S);
> +
> +	/*
> +	 * Put our zero-limit segment in SS and then trigger a fault.  The
> +	 * 4-byte access to (%esp) will fault with #SS, and the attempt to
> +	 * deliver the fault will recursively cause #SS and result in #DF.
> +	 * This whole process happens while NMIs and MCEs are blocked by the
> +	 * MOV SS window.  This is nice because an NMI with an invalid SS
> +	 * would also double-fault, resulting in the NMI or MCE being lost.
> +	 */
> +	asm volatile ("movw %0, %%ss; addl $0, (%%esp)" ::
> +		      "r" ((unsigned short)(GDT_ENTRY_TLS_MIN << 3)));
> +
> +	panic("tried to double fault but didn't die\n");

I'll modify this in some later patches, but I prefer the #ifdef inside
the function so that all tests are visible on all
architectures/configurations. And it should not panic on a test failure,
it should continue (see the others) with something like:

	pr_err("FAIL: did not double fault!\n");

E.g. an external system monitor would see the double-fault and the panic as
both causing a system reboot, but only the double-fault should do that.

> +}
> +#endif
> diff --git a/drivers/misc/lkdtm/core.c b/drivers/misc/lkdtm/core.c
> index cbc4c90..ee0d6e7 100644
> --- a/drivers/misc/lkdtm/core.c
> +++ b/drivers/misc/lkdtm/core.c
> @@ -171,6 +171,9 @@ static const struct crashtype crashtypes[] = {
>  	CRASHTYPE(USERCOPY_KERNEL_DS),
>  	CRASHTYPE(STACKLEAK_ERASING),
>  	CRASHTYPE(CFI_FORWARD_PROTO),
> +#ifdef CONFIG_X86_32
> +	CRASHTYPE(DOUBLE_FAULT),
> +#endif

And then ifdefs aren't needed here either.

>  };
>  
>  
> diff --git a/drivers/misc/lkdtm/lkdtm.h b/drivers/misc/lkdtm/lkdtm.h
> index ab446e0..c56d23e 100644
> --- a/drivers/misc/lkdtm/lkdtm.h
> +++ b/drivers/misc/lkdtm/lkdtm.h
> @@ -28,6 +28,9 @@ void lkdtm_CORRUPT_USER_DS(void);
>  void lkdtm_STACK_GUARD_PAGE_LEADING(void);
>  void lkdtm_STACK_GUARD_PAGE_TRAILING(void);
>  void lkdtm_UNSET_SMEP(void);
> +#ifdef CONFIG_X86_32
> +void lkdtm_DOUBLE_FAULT(void);
> +#endif

Same.

>  
>  /* lkdtm_heap.c */
>  void __init lkdtm_heap_init(void);

-- 
Kees Cook

  reply	other threads:[~2019-11-27 17:45 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-27  8:19 [tip: x86/urgent] lkdtm: Add a DOUBLE_FAULT crash type on x86 tip-bot2 for Andy Lutomirski
2019-11-27 17:44 ` Kees Cook [this message]
2019-11-27 18:48   ` Ingo Molnar

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=201911270942.0F120BF82@keescook \
    --to=keescook@chromium.org \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.