All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Lutomirski <luto@amacapital.net>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: "security@kernel.org" <security@kernel.org>,
	Jan Beulich <jbeulich@suse.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	X86 ML <x86@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	xen-devel <xen-devel@lists.xen.org>,
	Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>,
	Sasha Levin <sasha.levin@oracle.com>
Subject: Re: [PATCH v4 0/3] x86: modify_ldt improvement, test, and config option
Date: Mon, 27 Jul 2015 20:16:20 -0700	[thread overview]
Message-ID: <CALCETrV275oYQY80yg6TJ-h9n2Db-uF-po90bF+JmKjnV5ZqYw__9492.41727726093$1438053498$gmane$org@mail.gmail.com> (raw)
In-Reply-To: <CALCETrV7zVbt0ZV4KYcSTUHjAOxzGmu3SXWoT7iECB=zWSN7Ew@mail.gmail.com>

On Mon, Jul 27, 2015 at 7:20 PM, Andy Lutomirski <luto@amacapital.net> wrote:
> On Mon, Jul 27, 2015 at 9:18 AM, Boris Ostrovsky
> <boris.ostrovsky@oracle.com> wrote:
>> On 07/27/2015 11:53 AM, Andy Lutomirski wrote:
>>>
>>> On Mon, Jul 27, 2015 at 8:36 AM, Boris Ostrovsky
>>> <boris.ostrovsky@oracle.com> wrote:
>>>>
>>>> On 07/25/2015 01:36 AM, Andy Lutomirski wrote:
>>>>>
>>>>> Here's v3.  It fixes the "dazed and confused" issue, I hope.  It's also
>>>>> probably a good general attack surface reduction, and it replaces some
>>>>> scary code with IMO less scary code.
>>>>>
>>>>> Also, servers and embedded systems should probably turn off modify_ldt.
>>>>> This makes that possible.
>>>>>
>>>>> Xen people, can you take a look at this?
>>>>>
>>>>> Willy and Kees: I left the config option alone.  The -tiny people will
>>>>> like it, and we can always add a sysctl of some sort later.
>>>>>
>>>>> Changes from v3:
>>>>>    - Hopefully fixed Xen.
>>>>
>>>>
>>>> 32b-on-32b fails in the same manner. (but non-zero LDT is taken care of)
>>>>
>>>>>    - Fixed 32-bit test case on 32-bit native kernel.
>>>>
>>>>
>>>> I am not sure I see what changed.
>>>
>>> I misplaced the fix in the wrong git commit, so I failed to sent it.
>>> Oops.
>>>
>>> I just sent v4.1 of patch 3.  Can you try that?
>>
>>
>>
>> I am hitting BUG() in Xen code (returning from a hypercall) when freeing LDT
>> in destroy_context(). Interestingly though when I run the test in the
>> debugger I get SIGILL (just like before) but no BUG().
>>
>> Let me get back to you on that later today.
>>
>>
>
> After forward-porting my virtio patches, I got this thing to run on
> Xen.  After several tries, I got:
>
> [   53.985707] ------------[ cut here ]------------
> [   53.986314] kernel BUG at arch/x86/xen/enlighten.c:496!
> [   53.986677] invalid opcode: 0000 [#1] SMP
> [   53.986677] Modules linked in:
> [   53.986677] CPU: 0 PID: 1400 Comm: bash Not tainted 4.2.0-rc4+ #4
> [   53.986677] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
> BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org
> 04/01/2014
> [   53.986677] task: c2376180 ti: c0874000 task.ti: c0874000
> [   53.986677] EIP: 0061:[<c10530f2>] EFLAGS: 00010282 CPU: 0
> [   53.986677] EIP is at set_aliased_prot+0xb2/0xc0
> [   53.986677] EAX: ffffffea EBX: cc3d1000 ECX: 0672e063 EDX: 80000000
> [   53.986677] ESI: 00000000 EDI: 80000000 EBP: c0875e94 ESP: c0875e74
> [   53.986677]  DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0069
> [   53.986677] CR0: 80050033 CR2: b77404d4 CR3: 020b6000 CR4: 00042660
> [   53.986677] Stack:
> [   53.986677]  80000000 0672e063 000021c0 cc3d1000 00000001 cc3d2000
> 00000b4a 00000200
> [   53.986677]  c0875ea8 c105312d c2317940 c2373a80 00000000 c0875eb4
> c1062310 c01861c0
> [   53.986677]  c0875ec0 c1062735 c01861c0 c0875ed4 c10a764e c7007a00
> c2373a80 00000000
> [   53.986677] Call Trace:
> [   53.986677]  [<c105312d>] xen_free_ldt+0x2d/0x40
> [   53.986677]  [<c1062310>] free_ldt_struct.part.1+0x10/0x40
> [   53.986677]  [<c1062735>] destroy_context+0x25/0x40
> [   53.986677]  [<c10a764e>] __mmdrop+0x1e/0xc0
> [   53.986677]  [<c10c9858>] finish_task_switch+0xd8/0x1a0
> [   53.986677]  [<c1863736>] __schedule+0x316/0x950
> [   53.986677]  [<c1863d96>] schedule+0x26/0x70
> [   53.986677]  [<c10ac613>] do_wait+0x1b3/0x200
> [   53.986677]  [<c10ac9d7>] SyS_waitpid+0x67/0xd0
> [   53.986677]  [<c10aa820>] ? task_stopped_code+0x50/0x50
> [   53.986677]  [<c186717a>] syscall_call+0x7/0x7
> [   53.986677] Code: e8 c1 e3 0c 81 eb 00 00 00 40 39 5d ec 74 11 8b
> 4d e4 8b 55 e0 31 f6 e8 dd e0 fa ff 85 c0 75 0d 83 c4 14 5b 5e 5f 5d
> c3 90 0f 0b <0f> 0b 0f 0b 8d 76 00 8d bc 27 00 00 00 00 85 d2 74 31 55
> 89 e5
> [   53.986677] EIP: [<c10530f2>] set_aliased_prot+0xb2/0xc0 SS:ESP 0069:c0875e74
> [   54.010069] ---[ end trace 89ac35b29c1c59bb ]---
>
> Is that the error you're seeing?
>
> If I change xen_free_ldt to:
>
> static void xen_free_ldt(struct desc_struct *ldt, unsigned entries)
> {
>     const unsigned entries_per_page = PAGE_SIZE / LDT_ENTRY_SIZE;
>     int i;
>
>     vm_unmap_aliases();
>     xen_mc_flush();
>
>     for(i = 0; i < entries; i += entries_per_page)
>         set_aliased_prot(ldt + i, PAGE_KERNEL);
> }
>
> then it works.  I don't know why this makes a difference.
> (xen_mc_flush makes a little bit of sense to me.  vm_unmap_aliases
> doesn't.)
>

That fix makes sense if there's some way that the vmalloc area we're
freeing has an extra alias somewhere, which is very much possible.  On
the other hand, I don't see how this happens without first doing an
MMUEXT_SET_LDT with an unexpectedly aliased address, and I would have
expected that to blow up and/or result in test case failures.

But I'm still confused, because it seems like Xen will never populate
the actual (hidden) LDT mapping unless the pages backing it are
unaliased and well-formed, which make me wonder why this stuff ever
worked.  Wouldn't LDT access with pre-existing vmalloc aliases result
in segfaults?

The semantics seem to be very odd.  xen_free_ldt with an aliased
address might fail (and OOPS), but actual access to the LDT with an
aliased address page faults.

Also, using kzalloc for everything fixes the problem, which suggests
that there really is something to my theory that the problem involves
unexpected aliases.

--Andy

  reply	other threads:[~2015-07-28  3:16 UTC|newest]

Thread overview: 130+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-25  5:36 [PATCH v4 0/3] x86: modify_ldt improvement, test, and config option Andy Lutomirski
2015-07-25  5:36 ` [PATCH v4 1/3] x86/ldt: Make modify_ldt synchronous Andy Lutomirski
2015-07-25  9:03   ` Borislav Petkov
2015-07-25  9:03   ` Borislav Petkov
2015-07-25  5:36 ` Andy Lutomirski
2015-07-25  5:36 ` [PATCH v4 2/3] x86/ldt: Make modify_ldt optional Andy Lutomirski
2015-07-25  5:36 ` Andy Lutomirski
2015-07-25  6:23   ` Willy Tarreau
2015-07-25  6:44     ` Andy Lutomirski
2015-07-25  7:50       ` Willy Tarreau
2015-07-25 13:03         ` [PATCH 4/3] x86/ldt: allow to disable modify_ldt at runtime Willy Tarreau
2015-07-25 13:03         ` Willy Tarreau
2015-07-25 16:08           ` Andy Lutomirski
2015-07-25 16:33             ` Willy Tarreau
2015-07-25 16:33             ` Willy Tarreau
2015-07-25 17:42               ` Andy Lutomirski
2015-07-25 18:45                 ` Willy Tarreau
2015-07-25 18:45                 ` Willy Tarreau
2015-07-25 17:42               ` Andy Lutomirski
2015-07-25 16:08           ` Andy Lutomirski
2015-07-27 19:04           ` Kees Cook
2015-07-27 19:04           ` Kees Cook
2015-07-27 21:37             ` Willy Tarreau
2015-07-27 21:37             ` Willy Tarreau
2015-07-25  7:50       ` [PATCH v4 2/3] x86/ldt: Make modify_ldt optional Willy Tarreau
2015-07-25  6:44     ` Andy Lutomirski
2015-07-25  6:23   ` Willy Tarreau
2015-07-25  9:15   ` Borislav Petkov
2015-07-25  9:15   ` Borislav Petkov
2015-07-25 16:03     ` Andy Lutomirski
2015-07-25 16:03     ` Andy Lutomirski
2015-07-25 16:35       ` Willy Tarreau
2015-07-25 16:35       ` Willy Tarreau
2015-07-25  5:36 ` [PATCH v4 3/3] selftests/x86, x86/ldt: Add a selftest for modify_ldt Andy Lutomirski
2015-07-25  5:36 ` Andy Lutomirski
2015-07-27 15:52   ` [PATCH v4.1 3.3] " Andy Lutomirski
2015-07-27 15:52   ` Andy Lutomirski
2015-07-25  6:27 ` [PATCH v4 0/3] x86: modify_ldt improvement, test, and config option Willy Tarreau
2015-07-25  6:27 ` Willy Tarreau
2015-07-27 15:36 ` Boris Ostrovsky
2015-07-27 15:53   ` Andy Lutomirski
2015-07-27 16:18     ` Boris Ostrovsky
2015-07-28  2:20       ` Andy Lutomirski
2015-07-28  2:20       ` Andy Lutomirski
2015-07-28  3:16         ` Andy Lutomirski [this message]
2015-07-28  3:16         ` Andy Lutomirski
2015-07-28  3:23           ` Andy Lutomirski
2015-07-28  3:23           ` Andy Lutomirski
2015-07-28  3:43           ` Boris Ostrovsky
2015-07-28  3:43           ` Boris Ostrovsky
2015-07-28 10:29           ` Andrew Cooper
2015-07-28 10:29           ` Andrew Cooper
2015-07-28 14:05             ` Boris Ostrovsky
2015-07-28 14:05             ` Boris Ostrovsky
2015-07-28 14:35               ` Andrew Cooper
2015-07-28 14:35               ` Andrew Cooper
2015-07-28 14:50                 ` Boris Ostrovsky
2015-07-28 14:50                 ` Boris Ostrovsky
2015-07-28 15:15                   ` Konrad Rzeszutek Wilk
2015-07-28 15:15                   ` Konrad Rzeszutek Wilk
2015-07-28 15:39                     ` Boris Ostrovsky
2015-07-28 15:39                     ` Boris Ostrovsky
2015-07-28 15:23                   ` Andrew Cooper
2015-07-28 15:59                     ` [Xen-devel] " Boris Ostrovsky
2015-07-28 15:59                     ` Boris Ostrovsky
2015-07-28 15:23                   ` Andrew Cooper
2015-07-28 15:43             ` Andy Lutomirski
2015-07-28 15:43             ` Andy Lutomirski
2015-07-28 16:30               ` Andrew Cooper
2015-07-28 16:30               ` Andrew Cooper
2015-07-28 17:07                 ` Andy Lutomirski
2015-07-28 17:07                 ` Andy Lutomirski
2015-07-28 17:10                   ` [Xen-devel] " Boris Ostrovsky
2015-07-29  0:21                     ` Andy Lutomirski
2015-07-29  0:21                     ` [Xen-devel] " Andy Lutomirski
2015-07-29  0:47                       ` Andrew Cooper
2015-07-29  0:47                       ` [Xen-devel] " Andrew Cooper
2015-07-29  3:01                         ` Boris Ostrovsky
2015-07-29  3:01                         ` [Xen-devel] " Boris Ostrovsky
2015-07-29  4:26                           ` Andy Lutomirski
2015-07-29  4:26                           ` Andy Lutomirski
2015-07-29  5:28                           ` [Xen-devel] " Andy Lutomirski
2015-07-29 14:21                             ` Andrew Cooper
2015-07-29 14:43                               ` Boris Ostrovsky
2015-07-29 19:03                                 ` Andrew Cooper
2015-07-29 19:03                                 ` [Xen-devel] " Andrew Cooper
2015-07-29 21:23                                   ` Boris Ostrovsky
2015-07-29 21:26                                     ` Andy Lutomirski
2015-07-29 21:33                                       ` Boris Ostrovsky
2015-07-29 21:33                                       ` [Xen-devel] " Boris Ostrovsky
2015-07-29 21:37                                       ` Andrew Cooper
2015-07-29 21:37                                       ` [Xen-devel] " Andrew Cooper
2015-07-29 22:05                                         ` Andy Lutomirski
2015-07-29 22:05                                         ` [Xen-devel] " Andy Lutomirski
2015-07-29 22:11                                           ` Andrew Cooper
2015-07-29 22:40                                             ` Boris Ostrovsky
2015-07-29 22:40                                             ` Boris Ostrovsky
2015-07-29 22:46                                             ` [Xen-devel] " David Vrabel
2015-07-29 22:46                                               ` David Vrabel
2015-07-29 22:49                                               ` Boris Ostrovsky
2015-07-29 22:49                                               ` [Xen-devel] " Boris Ostrovsky
2015-07-29 22:55                                                 ` David Vrabel
2015-07-29 22:55                                                 ` David Vrabel
2015-07-29 23:02                                                 ` [Xen-devel] " Andrew Cooper
2015-07-29 23:13                                                   ` Andy Lutomirski
2015-07-30  0:29                                                     ` Andrew Cooper
2015-07-30  0:29                                                     ` [Xen-devel] " Andrew Cooper
2015-07-30 18:30                                                       ` Andy Lutomirski
2015-07-30 18:54                                                         ` Andrew Cooper
2015-07-30 18:54                                                         ` [Xen-devel] " Andrew Cooper
2015-07-30 20:01                                                           ` Boris Ostrovsky
2015-07-30 20:01                                                           ` [Xen-devel] " Boris Ostrovsky
2015-07-30 20:05                                                             ` Andy Lutomirski
2015-07-30 20:18                                                               ` Boris Ostrovsky
2015-07-30 20:18                                                               ` [Xen-devel] " Boris Ostrovsky
2015-07-30 20:05                                                             ` Andy Lutomirski
2015-07-30 18:30                                                       ` Andy Lutomirski
2015-07-29 23:13                                                   ` Andy Lutomirski
2015-07-29 23:02                                                 ` Andrew Cooper
2015-07-29 22:11                                           ` Andrew Cooper
2015-07-29 21:26                                     ` Andy Lutomirski
2015-07-29 21:23                                   ` Boris Ostrovsky
2015-07-29 14:43                               ` Boris Ostrovsky
2015-07-29 14:21                             ` Andrew Cooper
2015-07-29  5:28                           ` Andy Lutomirski
2015-07-28 17:10                   ` Boris Ostrovsky
2015-07-27 16:18     ` Boris Ostrovsky
2015-07-27 15:53   ` Andy Lutomirski
2015-07-27 15:36 ` Boris Ostrovsky
2015-07-25  5:36 Andy Lutomirski

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='CALCETrV275oYQY80yg6TJ-h9n2Db-uF-po90bF+JmKjnV5ZqYw__9492.41727726093$1438053498$gmane$org@mail.gmail.com' \
    --to=luto@amacapital.net \
    --cc=andrew.cooper3@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=jbeulich@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sasha.levin@oracle.com \
    --cc=security@kernel.org \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xen.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.