linux-sgx.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Lutomirski <luto@amacapital.net>
To: Sean Christopherson <sean.j.christopherson@intel.com>
Cc: Andy Lutomirski <luto@kernel.org>, Jann Horn <jannh@google.com>,
	Dave Hansen <dave.hansen@intel.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Rich Felker <dalias@libc.org>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Jethro Beekman <jethro@fortanix.com>,
	Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
	Florian Weimer <fweimer@redhat.com>,
	Linux API <linux-api@vger.kernel.org>, X86 ML <x86@kernel.org>,
	linux-arch <linux-arch@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	nhorman@redhat.com, npmccallum@redhat.com, "Ayoun,
	Serge" <serge.ayoun@intel.com>,
	shay.katz-zamir@intel.com, linux-sgx@vger.kernel.org,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Carlos O'Donell <carlos@redhat.com>,
	adhemerval.zanella@linaro.org
Subject: Re: RFC: userspace exception fixups
Date: Tue, 6 Nov 2018 08:57:35 -0800	[thread overview]
Message-ID: <AF4A5C77-0A79-403F-A205-0F93B7CD6E26@amacapital.net> (raw)
Message-ID: <20181106165735.Y36A-qoND7-y9Se-2kZGX7YtTpm1QGKP9RjHgGlz_RU@z> (raw)
In-Reply-To: <1541518670.7839.31.camel@intel.com>



> On Nov 6, 2018, at 7:37 AM, Sean Christopherson <sean.j.christopherson@intel.com> wrote:
> 
>> On Fri, 2018-11-02 at 16:32 -0700, Andy Lutomirski wrote:
>>> On Fri, Nov 2, 2018 at 4:28 PM Jann Horn <jannh@google.com> wrote:
>>> 
>>> 
>>> On Fri, Nov 2, 2018 at 11:04 PM Sean Christopherson
>>> <sean.j.christopherson@intel.com> wrote:
>>>> 
>>>>> On Fri, Nov 02, 2018 at 08:02:23PM +0100, Jann Horn wrote:
>>>>> 
>>>>> On Fri, Nov 2, 2018 at 7:27 PM Sean Christopherson
>>>>> <sean.j.christopherson@intel.com> wrote:
>>>>>> 
>>>>>>> On Fri, Nov 02, 2018 at 10:48:38AM -0700, Andy Lutomirski wrote:
>>>>>>> 
>>>>>>> This whole mechanism seems very complicated, and it's not clear
>>>>>>> exactly what behavior user code wants.
>>>>>> No argument there.  That's why I like the approach of dumping the
>>>>>> exception to userspace without trying to do anything intelligent in
>>>>>> the kernel.  Userspace can then do whatever it wants AND we don't
>>>>>> have to worry about mucking with stacks.
>>>>>> 
>>>>>> One of the hiccups with the VDSO approach is that the enclave may
>>>>>> want to use the untrusted stack, i.e. the stack that has the VDSO's
>>>>>> stack frame.  For example, Intel's SDK uses the untrusted stack to
>>>>>> pass parameters for EEXIT, which means an AEX might occur with what
>>>>>> is effectively a bad stack from the VDSO's perspective.
>>>>> What exactly does "uses the untrusted stack to pass parameters for
>>>>> EEXIT" mean? I guess you're saying that the enclave is writing to
>>>>> RSP+[0...some_positive_offset], and the written data needs to be
>>>>> visible to the code outside the enclave afterwards?
>>>> As is, they actually do it the other way around, i.e. negative offsets
>>>> relative to the untrusted %RSP.  Going into the enclave there is no
>>>> reserved space on the stack.  The SDK uses EEXIT like a function call,
>>>> i.e. pushing parameters on the stack and making an call outside of the
>>>> enclave, hence the name out-call.  This allows the SDK to handle any
>>>> reasonable out-call without a priori knowledge of the application's
>>>> maximum out-call "size".
>>> But presumably this is bounded to be at most 128 bytes (the red zone
>>> size), right? Otherwise this would be incompatible with
>>> non-sigaltstack signal delivery.
>> 
>> I think Sean is saying that the enclave also updates RSP.
> 
> Yeah, the enclave saves/restores RSP from/to the current save state area.
> 
>> One might reasonably wonder how the SDX knows the offset from RSP to
>> the function ID.  Presumably using RBP?
> 
> Here's pseudocode for how the SDK uses the untrusted stack, minus a
> bunch of error checking and gory details.
> 
> The function ID and a pointer to a marshalling struct are passed to
> the untrusted runtime via normal register params, e.g. RDI and RSI.
> The marshalling struct is what's actually allocated on the untrusted
> stack, like alloca() but more complex and explicit.  The marshalling
> struct size is not artificially restricted by the SDK, e.g. AFAIK it
> could span multiple 4k pages.
> 
> 
> int sgx_out_call(const unsigned int func_index, void *marshalling_struct)
> {
>    struct sgx_encl_tls *tls = get_encl_tls();
> 
>    %RBP = tls->save_state_area[SSA_RBP];
>    %RSP = tls->save_state_area[SSA_RSP];
>    %RDI = func_index;
>    %RSI = marshalling_struct;
> 
>    EEXIT
> 
>    /* magic elsewhere to get back here on an EENTER(OUT_CALL_RETURN) */
>    return %RAX
> }
> 
> void *sgx_alloc_untrusted_stack(size_t size)
> {
>    struct sgx_encl_tls *tls = get_encl_tls();
>    struct sgx_out_call_context *context;
>    void *tmp;
> 
>    /* create a frame on the trusted stack to hold the out-call context */
>    tls->trusted_stack -= sizeof(struct sgx_out_call_context);
> 
>    /* save the untrusted %RSP into the out-call context */
>    context = (struct sgx_out_call_context *)tls->trusted_stack;
>    context->untrusted_stack = tls->save_state_area[SSA_RSP];
> 
>    /* allocate space on the untrusted stack */
>    tmp = (void *)(tls->save_state_area[SSA_RSP] - size);
>    tls->save_state_area[SSA_RSP] = tmp;
> 
>    return tmp;
> }
> 
> void sgx_pop_untrusted_stack(void)
> {
>    struct sgx_encl_tls *tls = get_encl_tls();
>    struct sgx_out_call_context *context;
> 
>    /* retrieve the current out-call context from the trusted stack */
>    context = (struct sgx_out_call_context *)tls->trusted_stack;
> 
>    /* restore untrusted %RSP */
>    tls->save_state_area[SSA_RSP] = context->untrusted_stack;
> 
>    /* pop the out-call context frame */
>    tls->trusted_stack += sizeof(struct sgx_out_call_context);
> }
> 
> int sgx_main(void)
> {
>    struct my_out_call_struct *params;
> 
>    params = sgx_alloc_untrusted_stack(sizeof(*params));
> 
>    params->0..N = XYZ;
> 
>    ret = sgx_out_call(DO_WORK, params);
> 
>    sgx_pop_untrusted_stack();
> 
>    return ret;
> }

So I guess the non-enclave code basically can’t trust its stack pointer because of these shenanigans. And the AEP code has to live with the fact that its RSP is basically arbitrary and probably can’t even be unwound by a debugger?  And the EENTER code has to deal with the fact that its red zone can be blatantly violated by the enclave?

I’m assuming it’s way too late for the SGX SDK to be changed to use a normal RPC mechanism? I’m a bit disappointed that enclaves can even manipulate outside state like this. I assume Intel had some reason for making it possible, but still.

  parent reply	other threads:[~2018-11-06 16:57 UTC|newest]

Thread overview: 163+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-01 17:53 RFC: userspace exception fixups Andy Lutomirski
2018-11-01 17:53 ` Andy Lutomirski
2018-11-01 18:09 ` Florian Weimer
2018-11-01 18:09   ` Florian Weimer
2018-11-01 18:30   ` Rich Felker
2018-11-01 18:30     ` Rich Felker
2018-11-01 19:00   ` Jarkko Sakkinen
2018-11-01 19:00     ` Jarkko Sakkinen
2018-11-01 18:27 ` Rich Felker
2018-11-01 18:27   ` Rich Felker
2018-11-01 18:33 ` Jann Horn
2018-11-01 18:33   ` Jann Horn
2018-11-01 18:52   ` Rich Felker
2018-11-01 18:52     ` Rich Felker
2018-11-01 19:10     ` Linus Torvalds
2018-11-01 19:10       ` Linus Torvalds
2018-11-01 19:31       ` Rich Felker
2018-11-01 19:31         ` Rich Felker
2018-11-01 21:24         ` Linus Torvalds
2018-11-01 21:24           ` Linus Torvalds
2018-11-01 23:22           ` Andy Lutomirski
2018-11-01 23:22             ` Andy Lutomirski
2018-11-02 16:30             ` Sean Christopherson
2018-11-02 16:30               ` Sean Christopherson
2018-11-02 16:37               ` Jethro Beekman
2018-11-02 16:37                 ` Jethro Beekman
2018-11-02 16:52                 ` Sean Christopherson
2018-11-02 16:52                   ` Sean Christopherson
2018-11-02 16:56                   ` Jethro Beekman
2018-11-02 16:56                     ` Jethro Beekman
2018-11-02 17:01                     ` Andy Lutomirski
2018-11-02 17:01                       ` Andy Lutomirski
2018-11-02 17:05                       ` Jethro Beekman
2018-11-02 17:05                         ` Jethro Beekman
2018-11-02 17:16                         ` Andy Lutomirski
2018-11-02 17:16                           ` Andy Lutomirski
2018-11-02 17:32                           ` Rich Felker
2018-11-02 17:32                             ` Rich Felker
2018-11-02 17:12                     ` Sean Christopherson
2018-11-02 17:12                       ` Sean Christopherson
2018-11-02 22:42                   ` Jarkko Sakkinen
2018-11-02 22:42                     ` Jarkko Sakkinen
2018-11-02 16:56               ` Dave Hansen
2018-11-02 16:56                 ` Dave Hansen
2018-11-02 17:06                 ` Sean Christopherson
2018-11-02 17:06                   ` Sean Christopherson
2018-11-02 17:13                   ` Dave Hansen
2018-11-02 17:13                     ` Dave Hansen
2018-11-02 17:33                     ` Sean Christopherson
2018-11-02 17:33                       ` Sean Christopherson
2018-11-02 17:48                       ` Andy Lutomirski
2018-11-02 17:48                         ` Andy Lutomirski
2018-11-02 18:27                         ` Sean Christopherson
2018-11-02 18:27                           ` Sean Christopherson
2018-11-02 19:02                           ` Jann Horn
2018-11-02 19:02                             ` Jann Horn
2018-11-02 22:04                             ` Sean Christopherson
2018-11-02 22:04                               ` Sean Christopherson
2018-11-02 23:27                               ` Jann Horn
2018-11-02 23:27                                 ` Jann Horn
2018-11-02 23:32                                 ` Andy Lutomirski
2018-11-02 23:32                                   ` Andy Lutomirski
2018-11-02 23:36                                   ` Jann Horn
2018-11-02 23:36                                     ` Jann Horn
2018-11-06 15:37                                   ` Sean Christopherson
2018-11-06 15:37                                     ` Sean Christopherson
2018-11-06 16:57                                     ` Andy Lutomirski [this message]
2018-11-06 16:57                                       ` Andy Lutomirski
2018-11-06 17:03                                       ` Dave Hansen
2018-11-06 17:03                                         ` Dave Hansen
2018-11-06 17:19                                       ` Sean Christopherson
2018-11-06 17:19                                         ` Sean Christopherson
2018-11-06 18:20                                         ` Andy Lutomirski
2018-11-06 18:20                                           ` Andy Lutomirski
2018-11-06 18:41                                           ` Dave Hansen
2018-11-06 18:41                                             ` Dave Hansen
2018-11-06 19:02                                             ` Andy Lutomirski
2018-11-06 19:02                                               ` Andy Lutomirski
2018-11-06 19:22                                               ` Dave Hansen
2018-11-06 19:22                                                 ` Dave Hansen
2018-11-06 20:12                                                 ` Andy Lutomirski
2018-11-06 20:12                                                   ` Andy Lutomirski
2018-11-06 21:00                                                   ` Dave Hansen
2018-11-06 21:00                                                     ` Dave Hansen
2018-11-06 21:07                                                     ` Andy Lutomirski
2018-11-06 21:07                                                       ` Andy Lutomirski
2018-11-06 21:41                                                       ` Andy Lutomirski
2018-11-06 21:41                                                         ` Andy Lutomirski
2018-11-06 21:59                                                         ` Sean Christopherson
2018-11-06 21:59                                                           ` Sean Christopherson
2018-11-06 23:00                                                           ` Andy Lutomirski
2018-11-06 23:00                                                             ` Andy Lutomirski
2018-11-06 23:35                                                             ` Sean Christopherson
2018-11-06 23:35                                                               ` Sean Christopherson
2018-11-06 23:39                                                               ` Andy Lutomirski
2018-11-06 23:39                                                                 ` Andy Lutomirski
2018-11-07  0:02                                                                 ` Sean Christopherson
2018-11-07  0:02                                                                   ` Sean Christopherson
2018-11-07  1:17                                                                   ` Andy Lutomirski
2018-11-07  1:17                                                                     ` Andy Lutomirski
2018-11-07  6:47                                                                     ` Jethro Beekman
2018-11-07  6:47                                                                       ` Jethro Beekman
2018-11-07 15:34                                                                     ` Sean Christopherson
2018-11-07 15:34                                                                       ` Sean Christopherson
2018-11-07 19:01                                                                       ` Sean Christopherson
2018-11-07 19:01                                                                         ` Sean Christopherson
2018-11-07 20:56                                                                         ` Dave Hansen
2018-11-07 20:56                                                                           ` Dave Hansen
2018-11-08 15:04                                                                           ` Jarkko Sakkinen
2018-11-08 15:04                                                                             ` Jarkko Sakkinen
2018-11-08 19:54                                                       ` Sean Christopherson
2018-11-08 19:54                                                         ` Sean Christopherson
2018-11-08 20:05                                                         ` Andy Lutomirski
2018-11-08 20:05                                                           ` Andy Lutomirski
2018-11-08 20:10                                                           ` Dave Hansen
2018-11-08 20:10                                                             ` Dave Hansen
2018-11-08 21:16                                                             ` Sean Christopherson
2018-11-08 21:16                                                               ` Sean Christopherson
2018-11-08 21:50                                                               ` Dave Hansen
2018-11-08 21:50                                                                 ` Dave Hansen
2018-11-08 22:04                                                                 ` Sean Christopherson
2018-11-08 22:04                                                                   ` Sean Christopherson
2018-11-09  7:12                                                           ` Christoph Hellwig
2018-11-09  7:12                                                             ` Christoph Hellwig
2018-11-06 23:17                                               ` Rich Felker
2018-11-06 23:17                                                 ` Rich Felker
2018-11-06 23:26                                                 ` Sean Christopherson
2018-11-06 23:26                                                   ` Sean Christopherson
2018-11-07 21:27                                                   ` Rich Felker
2018-11-07 21:27                                                     ` Rich Felker
2018-11-07 21:33                                                     ` Andy Lutomirski
2018-11-07 21:33                                                       ` Andy Lutomirski
2018-11-07 21:40                                                     ` Sean Christopherson
2018-11-07 21:40                                                       ` Sean Christopherson
2018-11-08 15:11                                                       ` Jarkko Sakkinen
2018-11-08 15:11                                                         ` Jarkko Sakkinen
2018-11-06 17:00                                     ` Dave Hansen
2018-11-06 17:00                                       ` Dave Hansen
2018-11-02 22:37             ` Jarkko Sakkinen
2018-11-02 22:37               ` Jarkko Sakkinen
2018-11-01 19:06 ` Linus Torvalds
2018-11-01 19:06   ` Linus Torvalds
2018-11-02 22:07 ` Jarkko Sakkinen
2018-11-02 22:07   ` Jarkko Sakkinen
2018-11-18  7:15 ` Jarkko Sakkinen
2018-11-18  7:18   ` Jarkko Sakkinen
2018-11-18 13:02   ` Jarkko Sakkinen
2018-11-19  5:17     ` Jethro Beekman
2018-11-19 14:05       ` Jarkko Sakkinen
2018-11-19 14:59         ` Jarkko Sakkinen
2018-11-19 15:29   ` Andy Lutomirski
2018-11-19 16:02     ` Jarkko Sakkinen
2018-11-19 17:00       ` Andy Lutomirski
2018-11-20 10:11         ` Jarkko Sakkinen
2018-11-20 15:19           ` Andy Lutomirski
2018-11-20 22:55             ` Jarkko Sakkinen
2018-11-21  5:17               ` Jethro Beekman
2018-11-21 15:17                 ` Jarkko Sakkinen
2018-11-24 17:07                   ` Jarkko Sakkinen
2018-11-26 14:35                   ` Sean Christopherson
2018-11-26 22:06                     ` Jarkko Sakkinen
2018-11-20 18:09           ` Sean Christopherson
2018-11-20 22:46           ` Jarkko Sakkinen

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=AF4A5C77-0A79-403F-A205-0F93B7CD6E26@amacapital.net \
    --to=luto@amacapital.net \
    --cc=adhemerval.zanella@linaro.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=carlos@redhat.com \
    --cc=dalias@libc.org \
    --cc=dave.hansen@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=fweimer@redhat.com \
    --cc=jannh@google.com \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=jethro@fortanix.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sgx@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=nhorman@redhat.com \
    --cc=npmccallum@redhat.com \
    --cc=peterz@infradead.org \
    --cc=sean.j.christopherson@intel.com \
    --cc=serge.ayoun@intel.com \
    --cc=shay.katz-zamir@intel.com \
    --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 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).