All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Andy Lutomirski <luto@amacapital.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Julien Thierry <julien.thierry@arm.com>,
	Will Deacon <will.deacon@arm.com>, Ingo Molnar <mingo@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	James Morse <james.morse@arm.com>,
	valentin.schneider@arm.com, Brian Gerst <brgerst@gmail.com>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Andrew Lutomirski <luto@kernel.org>,
	Borislav Petkov <bp@alien8.de>,
	Denys Vlasenko <dvlasenk@redhat.com>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 2/6] x86/ia32: Fix ia32_restore_sigcontext AC leak
Date: Mon, 25 Feb 2019 17:10:03 +0100	[thread overview]
Message-ID: <20190225161003.GL32477@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <CALCETrW-p4iF-RMecyNt1JDwKh74c_tw67FCW7Yr_Fd3adtGUw@mail.gmail.com>

On Mon, Feb 25, 2019 at 07:41:50AM -0800, Andy Lutomirski wrote:
> This is so tangled.
> 
> How about changing RELOAD_SEG to replace unsigned int pre =
> GET_SEG(seg); with unsigned int pre = (seg); to make it less magic.
> Then do:
> 
> unsigned int gs = GET_SEG(gs);
> 
> ...
> 
> RELOAD_SEG(gs);
> 
> And now the code actually does what it looks like it does.

Is this what you mean?

---
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index 321fe5f5d0e9..e04eeeddcc35 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -53,17 +53,16 @@
 #define GET_SEG(seg)		({			\
 	unsigned short tmp;				\
 	get_user_ex(tmp, &sc->seg);			\
-	tmp;						\
+	tmp | 3;					\
 })
 
 #define COPY_SEG_CPL3(seg)	do {			\
-	regs->seg = GET_SEG(seg) | 3;			\
+	regs->seg = GET_SEG(seg);			\
 } while (0)
 
 #define RELOAD_SEG(seg)		{		\
-	unsigned int pre = GET_SEG(seg);	\
+	unsigned int pre = (seg);		\
 	unsigned int cur = get_user_seg(seg);	\
-	pre |= 3;				\
 	if (pre != cur)				\
 		set_user_seg(seg, pre);		\
 }
@@ -72,6 +71,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 				   struct sigcontext_32 __user *sc)
 {
 	unsigned int tmpflags, err = 0;
+	u16 gs, fs, es, ds;
 	void __user *buf;
 	u32 tmp;
 
@@ -79,16 +79,10 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 	current->restart_block.fn = do_no_restart_syscall;
 
 	get_user_try {
-		/*
-		 * Reload fs and gs if they have changed in the signal
-		 * handler.  This does not handle long fs/gs base changes in
-		 * the handler, but does not clobber them at least in the
-		 * normal case.
-		 */
-		RELOAD_SEG(gs);
-		RELOAD_SEG(fs);
-		RELOAD_SEG(ds);
-		RELOAD_SEG(es);
+		gs = GET_SEG(gs);
+		fs = GET_SEG(fs);
+		ds = GET_SEG(ds);
+		es = GET_SEG(es);
 
 		COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
 		COPY(dx); COPY(cx); COPY(ip); COPY(ax);
@@ -106,6 +100,17 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 		buf = compat_ptr(tmp);
 	} get_user_catch(err);
 
+	/*
+	 * Reload fs and gs if they have changed in the signal
+	 * handler.  This does not handle long fs/gs base changes in
+	 * the handler, but does not clobber them at least in the
+	 * normal case.
+	 */
+	RELOAD_SEG(gs);
+	RELOAD_SEG(fs);
+	RELOAD_SEG(ds);
+	RELOAD_SEG(es);
+
 	err |= fpu__restore_sig(buf, 1);
 
 	force_iret();

  reply	other threads:[~2019-02-25 16:10 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-25 12:43 [PATCH 0/6] objtool: UACCESS validation Peter Zijlstra
2019-02-25 12:43 ` [PATCH 1/6] x86/uaccess: Dont evaluate argument inside AC region Peter Zijlstra
2019-02-25 15:43   ` Andy Lutomirski
2019-02-25 16:02     ` Peter Zijlstra
2019-02-25 16:36     ` Borislav Petkov
2019-02-25 16:50       ` Andy Lutomirski
2019-02-25 19:09     ` Linus Torvalds
2019-02-25 19:18       ` Borislav Petkov
2019-02-25 18:10   ` [tip:x86/urgent] x86/uaccess: Don't leak the AC flag into __put_user() value evaluation tip-bot for Andy Lutomirski
2019-02-25 19:46   ` tip-bot for Andy Lutomirski
2019-02-25 12:43 ` [PATCH 2/6] x86/ia32: Fix ia32_restore_sigcontext AC leak Peter Zijlstra
2019-02-25 15:41   ` Andy Lutomirski
2019-02-25 16:10     ` Peter Zijlstra [this message]
2019-02-25 16:29       ` Andy Lutomirski
2019-02-25 16:37         ` Peter Zijlstra
2019-02-25 16:41           ` Peter Zijlstra
2019-02-25 16:49           ` Andy Lutomirski
2019-02-25 12:43 ` [PATCH 3/6] objtool: Set insn->func for alternatives Peter Zijlstra
2019-02-25 12:43 ` [PATCH 4/6] objtool: Replace STACK_FRAME_NON_STANDARD annotation Peter Zijlstra
2019-02-25 16:11   ` Josh Poimboeuf
2019-02-25 16:17     ` Peter Zijlstra
2019-02-25 16:23       ` Josh Poimboeuf
2019-02-27 12:20     ` Peter Zijlstra
2019-02-28  0:30       ` Andy Lutomirski
2019-02-25 12:43 ` [PATCH 5/6] objtool: Add UACCESS validation Peter Zijlstra
2019-02-25 15:53   ` Andy Lutomirski
2019-02-25 16:12     ` Peter Zijlstra
2019-02-25 17:15       ` Peter Zijlstra
2019-02-25 17:34         ` Linus Torvalds
2019-02-25 17:38         ` Josh Poimboeuf
2019-02-27 14:08   ` Peter Zijlstra
2019-02-27 14:17     ` Andrey Ryabinin
2019-02-27 14:26       ` Peter Zijlstra
2019-02-27 14:33         ` Peter Zijlstra
2019-02-27 15:40           ` Dmitry Vyukov
2019-02-27 17:28             ` Peter Zijlstra
2019-02-28  9:40               ` Peter Zijlstra
2019-02-28  9:59                 ` Dmitry Vyukov
2019-02-28 10:05                   ` Dmitry Vyukov
2019-02-28 10:52                     ` Peter Zijlstra
2019-02-27 16:18     ` Linus Torvalds
2019-02-27 17:30       ` Peter Zijlstra
2019-02-27 17:36         ` Linus Torvalds
2019-02-25 12:43 ` [PATCH 6/6] objtool: Add Direction Flag validation Peter Zijlstra

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=20190225161003.GL32477@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=dvlasenk@redhat.com \
    --cc=hpa@zytor.com \
    --cc=james.morse@arm.com \
    --cc=jpoimboe@redhat.com \
    --cc=julien.thierry@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=valentin.schneider@arm.com \
    --cc=will.deacon@arm.com \
    /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.